Elasticsearch原理学习

elasticsearch基于全文检索引擎Lucene,Apache给出的官方定义:Lucene是高效的基于java的全文检索库。

  • 顺序扫描方法:顾名思义就是按照顺序从头到尾进行检索 grep命令就是如此,

  • 全文检索:如果是结构化的数据可以采用某些算法提升搜索速度。那我们可以把非结构化的数据中的结构化部分抽取出来,重新组织,从而达到快速检索的目的。
    全文检索:分为2步:
    第一步:创建索引
    第二步:搜索索引
    正向索引:从文档中查找字符串,关系型数据库使用的是正向索引
    反向索引:从字符串中查找文档 搜索引擎Lucene使用的是反向索引
    何为反向索引呢?


    1558668168(1).jpg
  • 如上图所示,假如我有100个文档,对他们从1-100进行编号;

  • 左边保存的是一系列的字符串,也可以理解为词,我们称这些字符串集合为词典;

  • 右边保存的是包含左边字符串的文档链表,此文档链表成为倒排表

  • 在上面中,我们对词典中包含的字符串创建索引,而这些字符串也正是我们搜索的信息,因此可以大大加快查询速度。

如果查询包含hadoop和lucene的文档:
第一步:取出包含lucene的文档链表
第二步:取出包含hadoop的文档链表
第三步:合并链表,取出交集


1558668340(1).png

索引的创建一般分为以下几步:

第一步:将文档交给切词组件(Tokenizer)进行切词处理

第二步:将得到的词元(Token)交给语言处理组件

第三步:将得到的词(Term)交给索引组件

第四步:由索引组件针对词建立索引

针对上述步骤,我们给出2个示例文档,加以详细说明

Document 1:Students should be allowed to go out with their friends, but not allowed to drink beer.

Document 2:My friend Jerry went to school to see his students but found them drunk which is not allowed.

第一步:切词组件处理

上述2个文档会被交给切词组件,切词组件主要针对文档进行切割,将文档中的单词一个一个切割出来,同时消除一些无意义的词,比如标点符号、英文中的the和is、中文中的的等。因为标点符号和一些形容词,在实际的搜索中是很少会被搜索的,所以在该步骤会剃掉这些词语,减少索引的大小

经过切割以后,可能会被切分成以下词元:

“Students”,“allowed”,“go”,“their”,“friends”,“allowed”,“drink”,“beer”,“My”,“friend”,“Jerry”,“went”,“school”,“see”,“his”,“students”,“found”,“them”,“drunk”,“allowed”

第二步:语言处理组件处理

该步骤主要针对第一步生成的词元进行自然语言同化处理,比如针对cars词元,同时生成新的词car;Student词元中的大写字母小写化,这样能够实现一个student搜索,可以同时搜索处理像Student、STUDENT、stuDENT等多种情况,经过该步骤处理后,可能会被切分成以下词:

“student”,“allow”,“go”,“their”,“friend”,“allow”,“drink”,“beer”,“my”,“friend”,“jerry”,“go”,“school”,“see”,“his”,“student”,“find”,“them”,“drink”,“allow”

正因为有了自然语言处理组件,才能使得搜索drove,drive也能被搜出来

第三步:将得到的词交给索引组件建立索引
  (1)、利用得到的词创建一个词典


image.png

(2)、对字典按字母顺序进行排序

1558668851(1).png

(3)、合并相同的词并建立倒排链表


1558668863(1).png

在上述表中,有几个定义:

Document Frequency:表示该词出现在所有文档的总数

Frequency:表示在某一个文档中该词出现的次数

第四步:建立索引

针对最后生成的词典,进行索引的建立,至此我们发现根据搜索词,我们可以立即找到对应的文档;而且诸如drink、drunk等都可以找到同一个文档

问题3:如何对索引进行搜索?

搜索可以分为以下几步:

第一步:用户输入查询语句

第二步:对查询语句进行词法分析、语法分析、语言处理

第三步:搜索索引,得到符合语法树的文档

第四步:根据得到的文档和查询语句相关性,对结果进行排序予以展示

第一步:用户输入语句

查询语句的语法根据全文检索系统的实现而不同。

比如用户输入:lucene AND learned NOT hadoop --------- 用户想要查找包含lucene和learned,但是不包含hadoop的文档

第二步:对查询语句进行词法分析、语法分析、语言处理

(1)、词法分析主要用来识别单词和关键字

比如针对上述用户的输入,经过词法分析,得到单词为lucene、learned、hadoop,关键词为AND、NOT

(2)、语言分析主要根据查询语句来生成一颗语法树

受限进行语法判断,如果不满足语法要求,则直接报错;若满足语法要求,则可以生成下面的语法树:


1558668878(1).png

  (3)、语言处理和索引建立过程中得语言处理几乎一样

例如将learned变成learn,经过处理后得到以下结果:


1558668884(1).png

 第三步:搜索索引,得到符合语法树得文档

首先,在反向索引链表里,找到包含lucene、learn和hadoop得文档

其次,对包含lucene和learn得文档进行求合集操作,得到同时包含两者得文档链条

然后,将得到合集后得链表与hadoop得文档链表进行差集操作,去除包含hadoop得文档

最后,此文档链表就是我们要找得文档

第四步:根据得到的文档和查询语句的相关性,对结果进行排序

此过程也是极其复杂的,比如谷歌搜索,查询出来的结果有几十万上百万,如何排序显示,这个过程涉及到一些自然语言的理解,过程非常复杂,在此不再赘述

总结:Lucene是一个开源的分部署搜索引擎的实现,ElasticSearch底层就是基于Lucene实现的,之所以能够实现分布式搜索,原因就在于每一个文档在出库入库之前,就已经被进行切词分析处理,针对每个词建立索引,是一种空间换时间的做法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容