美文网首页
Elasticsearch原理学习

Elasticsearch原理学习

作者: 无实践无真知 | 来源:发表于2019-05-24 11:27 被阅读0次

    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实现的,之所以能够实现分布式搜索,原因就在于每一个文档在出库入库之前,就已经被进行切词分析处理,针对每个词建立索引,是一种空间换时间的做法

    相关文章

      网友评论

          本文标题:Elasticsearch原理学习

          本文链接:https://www.haomeiwen.com/subject/ywzwzqtx.html