关于Elasticsearch的技术原理及实现方式看了两篇讲的非常好的文章,在这里分享给大家。

其中一篇是:

Elasticsearch 技术分析(九):全文搜索引擎Elasticsearch,这篇文章给讲透了!:https://www.cnblogs.com/jajian/p/11223992.html

下面简要铺上前两段内容供参考,要看原文请点击原文链接

先说说Lucene

通过对生活中数据的类型作了一个简短了解之后,我们知道关系型数据库的SQL检索是处理不了这种非结构化数据的。这种非结构化数据的处理需要依赖全文搜索,而目前市场上开放源代码的最好全文检索引擎工具包就属于 apache 的 Lucene了。

但是 Lucene 只是一个工具包,它不是一个完整的全文检索引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

目前以 Lucene 为基础建立的开源可用全文搜索引擎主要是 Solr 和 Elasticsearch。

Solr 和 Elasticsearch 都是比较成熟的全文搜索引擎,能完成的功能和性能也基本一样。但是 ES 本身就具有分布式的特性和易安装使用的特点,而Solr的分布式需要借助第三方来实现,例如通过使用ZooKeeper来达到分布式协调管理。

不管是 Solr 还是 Elasticsearch 底层都是依赖于 Lucene,而 Lucene 能实现全文搜索主要是因为它实现了倒排索引的查询结构。

如何理解倒排索引呢?假如现有三份数据文档,文档的内容如下分别是:

  1. Java is the best programming language.
  2. PHP is the best programming language.
  3. Javascript is the best programming language.

为了创建倒排索引,我们通过分词器将每个文档的内容域拆分成单独的(我们称它为词条或 Term),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。结果如下所示:

Term          Doc_1    Doc_2   Doc_3
-------------------------------------
Java        |   X   |        |
is          |   X   |   X    |   X
the         |   X   |   X    |   X
best        |   X   |   X    |   X
programming |   x   |   X    |   X
language    |   X   |   X    |   X
PHP         |       |   X    |
Javascript  |       |        |   X
-------------------------------------

这种结构由文档中所有不重复词的列表构成,对于其中每个词都有一个文档列表与之关联。这种由属性值来确定记录的位置的结构就是倒排索引。带有倒排索引的文件我们称为倒排文件。

我们将上面的内容转换为图的形式来说明倒排索引的结构信息,如下图所示,

其中主要有如下几个核心术语需要理解:

  • 词条(Term):索引里面最小的存储和查询单元,对于英文来说是一个单词,对于中文来说一般指分词后的一个词。
  • 词典(Term Dictionary):或字典,是词条Term的集合。搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
  • 倒排表(Post list):一个文档通常由多个词组成,倒排表记录的是某个词在哪些文档里出现过以及出现的位置。每条记录称为一个倒排项(Posting)。倒排表记录的不单是文档编号,还存储了词频等信息。
  • 倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件被称之为倒排文件,倒排文件是存储倒排索引的物理文件。

从上图我们可以了解到倒排索引主要由两个部分组成:词典倒排文件。词典和倒排表是Lucene中很重要的两种数据结构,是实现快速检索的重要基石。词典和倒排文件是分两部分存储的,词典在内存中而倒排文件存储在磁盘上。

另外一篇是:

原理 全文检索原理及实现方式:https://blog.csdn.net/yicaifenchen8/article/details/104064454?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

下面也简要铺上前两段内容供参考,要看原文请点击原文链接

下面这幅图来自《Lucene in action》,但却不仅仅描述了Lucene的检索过程,而是描述了全文检索的一般过程。

全文检索大体分两个过程,索引创建 (Indexing) 和搜索索引 (Search) 。

  • 索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。
  • 搜索索引:就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程。

于是全文检索就存在三个重要问题:

1. 索引里面究竟存些什么?(Index)

2. 如何创建索引?(Indexing)

3. 如何对索引进行搜索?(Search)

下面我们顺序对每个个问题进行研究。

二、索引里面究竟存些什么

索引里面究竟需要存些什么呢?

首先我们来看为什么顺序扫描的速度慢:

其实是由于我们想要搜索的信息和非结构化数据中所存储的信息不一致造成的。

非结构化数据中所存储的信息是每个文件包含哪些字符串,也即已知文件,欲求字符串相对容易,也即是从文件到字符串的映射。而我们想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,也即从字符串到文件的映射。两者恰恰相反。于是如果索引总能够保存从字符串到文件的映射,则会大大提高搜索速度。

由于从字符串到文件的映射是文件到字符串映射的反向过程,于是保存这种信息的索引称为反向索引 。

反向索引的所保存的信息一般如下:

假设我的文档集合里面有100篇文档,为了方便表示,我们为文档编号从1到100,得到下面的结构

左边保存的是一系列字符串,称为词典 。

每个字符串都指向包含此字符串的文档(Document)链表,此文档链表称为倒排表 (Posting List)。

有了索引,便使保存的信息和要搜索的信息一致,可以大大加快搜索的速度。

比如说,我们要寻找既包含字符串“lucene”又包含字符串“solr”的文档,我们只需要以下几步:

1. 取出包含字符串“lucene”的文档链表。

2. 取出包含字符串“solr”的文档链表。

3. 通过合并链表,找出既包含“lucene”又包含“solr”的文件。

看到这个地方,有人可能会说,全文检索的确加快了搜索的速度,但是多了索引的过程,两者加起来不一定比顺序扫描快多少。的确,加上索引的过程,全文检索不一定比顺序扫描快,尤其是在数据量小的时候更是如此。而对一个很大量的数据创建索引也是一个很慢的过程。

然而两者还是有区别的,顺序扫描是每次都要扫描,而创建索引的过程仅仅需要一次,以后便是一劳永逸的了,每次搜索,创建索引的过程不必经过,仅仅搜索创建好的索引就可以了。

这也是全文搜索相对于顺序扫描的优势之一:一次索引,多次使用。

全文搜索引擎Elasticsearch,这篇文章给讲透了!(Elasticsearch技术原理及实现方式)相关推荐

  1. 全文搜索引擎Elasticsearch,这篇文章给讲透了

    之前已经分享过Elasticsearch的使用和原理的知识,由于近期在公司内部做了一次分享,所以本篇主要是基于之前的博文的一个总结,希望通过这篇文章能让读者大致了解Elasticsearch是做什么的 ...

  2. 全文搜索引擎Elasticsearch,这篇文章给讲透了!

    于elasticsearch的深度好文. 生活中的数据 搜索引擎是对数据的检索,所以我们先从生活中的数据说起.我们生活中的数据总体分为两种: 结构化数据 非结构化数据 结构化数据:也称作行数据,是由二 ...

  3. Elasticsearch搜索引擎该怎么使用,这篇文章彻底讲透(荣耀典藏版)

    目录 前言 一.先说说 Lucene 二.ES 核心概念 2.1.集群(Cluster) 2.1.1.发现机制 2.1.2.节点的角色 2.1.3.脑裂现象 2.2.分片(Shards) 2.3.副本 ...

  4. 一篇文章,讲透“复盘”

    成年人的学习,绝大部分都来自书本之外,需要我们在生活和工作中积累经验,提升自己的能力.为了避免低水平的重复工作,就需要我们不断复盘,不管是暂时的成功还是失败,都要让它变得有意义.但是很多人对复盘还停留 ...

  5. 一篇文章,讲透如何打造超级产品,看完你还怕企业被市场淘汰吗?

    产品怎么打造成超级产品? 很多企业管理者都会对此进行思考,却很少人能够真正理解. 这篇文章根据艾老思文章中所提到的方法,尝试给大家找到答案! 01 打造超级产品的前提 在消费升级的时代,很少人能够抓住 ...

  6. python抓取网站访客手机号_想获得网站访问者的联系方式吗,这篇文章全讲透了...

    随着大数据和人工智能的火爆,网络爬虫也被大家熟知起来.随之也出现一个问题,爬取隐私数据是违法的.其实,网络爬虫作为一门技术,技术本身是不违法的,且在大多数情况下,大家都可以放心的使用.但也有特殊情况, ...

  7. 稳定性测试怎么做,这篇文章彻底讲透了

    稳定性对产品的重要性不言而喻. 而作为质量保障,在稳定性测试方面的探索也在不断演化.记得两年前我们做稳定性测试还是基于恒定的压力,7*24小时长时间运行,关注的指标无非是吞吐量TPS的抖动.响应时间的 ...

  8. 一直对zookeeper的应用和原理比较迷糊,今天看一篇文章,讲得很通透,分享如下(转)...

    本文转自http://blog.csdn.net/gs80140/article/details/51496925 一直对zookeeper的应用和原理比较迷糊,今天看一篇文章,讲得很通透,分享如下: ...

  9. 一文彻底讲透@Async注解的原理和使用方法

    一文彻底讲透@Async注解的原理和使用方法 https://www.cnblogs.com/yangxiaohui227/p/14831911.html 一.背景:spring提供了@Async异步 ...

最新文章

  1. 漫画:你真的懂Github吗?
  2. 新海诚没有参与制作的作品_新海诚作品不出真人版,其实都是因为这!
  3. 重磅!花书《深度学习》,这份精炼笔记可能是最全面的
  4. 机器视觉技术在表面缺陷检测方面的发展趋势
  5. 2017 ICPC沈阳区域赛
  6. Oracle数据库数据泵导入导出
  7. c语言死锁算法实验报告,死锁实验报告
  8. 终于在VirtualBox中装好了Mac OS的虚拟机了!(
  9. extjs-mvc结构实践(二):基本页面
  10. Windows Server 2012中的多元密策略
  11. Apowersoft ApowerMirror v1.4.5 终身商业授权破解版 安卓/iPhone投屏控制软件
  12. Unity3d官网链接失效
  13. 去百度还是去创新工厂? 信开复还是信彦宏?
  14. React-fiber架构的解释
  15. 从0开始构建蓝牙耳机研发环境
  16. Linux驱动概念扫盲篇【转】
  17. PTA乙级题解(110题全)
  18. 川土新品 | CA-IS3105W 全集成隔离 DC-DC 转换器
  19. 大快人心,盗版CH430芯片的被判刑了,公司被罚400万
  20. Java泛型入参的三种通配符使用

热门文章

  1. go语言教程零基础入门到精通
  2. android thumb大小,Android 设置thumb图片大小
  3. 【Excel VBA】超级实用的UsedRange
  4. IOS在线听书 喜马拉雅SDK开发笔记(部分)
  5. 羽素登陆《岭南大医生》与专家共解痘肌难题
  6. gta5ol服务器网站,《GTAOL》角色扮演服务器更新 Twitch观众数登顶
  7. 广西木材市场发展现状分析:2020年广西木材产量达3600.4万立方米,同比增长2.86%[图]
  8. 决策树(一):分类决策树
  9. Linux、hbase、hive、shell、sqoop笔记总结+一键开启关闭脚本
  10. Java中对变量范围转换引发的思考