当前位置:   article > 正文

Elasticsearch和倒排索引_elasticsearch 索引和倒排索引

elasticsearch 索引和倒排索引

一、mysql全文搜索的不足之处

我们举几个例子就可以说明

假设商品表中有商品详情,商品名称,商品规格等一些列的字段,我们假设在想要查询的字段上都有最合适的索引。

1.搜索商品名中包含苹果或者香蕉或者橙子的

2.搜索商品名称和详情中包含苹果的

3.搜索商品名称和详情中包含苹果或者香蕉或者橙子的

4.搜索商品名称和详情中包含苹果或者香蕉或者橙子的,并按照出现的次数多少进行倒叙排序

 

可以发现一个问题,当mysql应对多个字段上的模糊查询的时候,是只可以使用一个索引的,并且还要求必须是后置模糊查询。如果是涉及到多个字段上的模糊查询,mysql就更显得无能为力了。若还要在这个基础上对结果进行相似度排序,那mysql如果是个人,应该会立马罢工给你看。

 

1.1 我们需要什么样的功能

1.多字段多关键字搜索

2.对结果进行相似度排序

3.对结果中关键词进行高亮处理

4.在保证上面的功能前提下,效率尽可能的高

 

二、Elasticsearch和倒排索引

Elasticsearch 是最受欢迎的企业搜索引擎,其次是 Apache Solr,也是基于 Lucene。

其功能的核心是分词倒排索引

2.1 分词

分词器工作的位置有两个,一个是在把文档入库的时候,要把文档需要索引的字段进行分词,维护一个文档的倒排索引单词词典。另一个是在进行搜索的时候,把搜索关键字进行分词,然后去倒排索引中查找。

 

假设我们的搜索条件是“华为手机平板电脑”,要求是只要满足了其中任意一个词语组合的数据都要查询出来。

Elasticseach 提供了三种分词方法:

  • 单字分词
  • 二分法分词
  • 词库分词

 

单字分词:

  • 如:“华为手机平板电脑”
  • 效果:“华”、“为”、“手”、“机”、“平”、“板”、“电”、“脑”

 

二分法分词:

  • 按两个字进行切分。
  • 如:“华为手机平板电脑”
  • 效果:“华为”、“为手”、“手机”、“机平”、“平板”、“板电”、“电脑”。

 

词库分词:按某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。

 

通常词库分词被认为是最理想的中文分词算法。而词库分词最常用的就是 IK 分词。

 

IK 分词器提供两种分词模式:

  • ik_max_word:会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query。
  • ik_smart:会将文本做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase Query。

 

 

2.2 倒排索引

对于搜索引擎来讲:

2.2.1 正排索引

正排索引也称为"前向索引"。它是创建倒排索引的基础,通过文档标识到关键字(doc->word)的映射,具有以下字段

(1)LocalId字段(表中简称"Lid"):表示一个文档的局部编号。

(2)WordId字段:表示文档分词后的编号,也可称为"索引词编号"。

(3)NHits字段:表示某个索引词在文档中出现的次数。

(4)HitList变长字段:表示某个索引词在文档中出现的位置,即相对于正文的偏移量。

基本结构可以理解为:

docID1 -> word1:出现次数,出现的位置List;word2:出现次数,出现的位置List;

docID2-> word1:出现次数,出现的位置List;word2:出现次数,出现的位置List;word3:出现次数,出现的位置List;

但是往往在网页检索或者其他搜索情况下是通过关键字来找文档,因此需要把正排索引转换为倒排索引,才能满足实际的需求。

 

2.2.2 倒排索引

倒排索引是单词到文档 ID 的关联关系。也就是说通过单词搜索到文档标识。

倒排索引的查询流程是:首先根据关键字搜索到对应的文档 ID和其正排索引,然后根据正排索引查询文档完整内容,最后返回给用户想要的结果。

 

2.2.3 倒排索引组成部分

 

倒排索引是ES搜索引擎的核心,主要包含两个部分:

  • 单词词典(Trem Dictionary):记录所有的文档分词后的结果。一般采用 B+Tree 的方式,来保证高效。
  • 倒排列表(Posting List):记录单词对应的文档的集合,由倒排索引项(Posting)组成。

倒排索引项(Posting)主要包含如下的信息:

  • 文档 ID,用于获取原始文档的信息。
  • 单词频率(TF,Term Frequency),记录该单词在该文档中出现的次数,用于后续相关性算分。
  • 位置(Position),记录单词在文档中的分词位置(多个),用于做词语搜索。
  • 偏移(Offset),记录单词在文档的开始和结束位置,用于高亮显示。

可以看出,倒排索引项其实就是存储了正排索引信息。下面我们根据几个案例来说明其存储方式。

 

示例说明

假设文档集合包含五个文档,每个文档内容如下图所示。在图中最左端一栏是每个文档对应的文档编号。我们的任务就是对这个文档集合建立倒排索引。

首先用分词系统将文档自动切分成单词序列。为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录哪些文档中包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引,如下图所示。

在图中,“单词 ID”一栏记录了每个单词的单词编号,第二栏是对应的单词,第三栏即每个单词对应的倒排列表。比如单词 谷歌,其单词编号为 1,倒排列表为 1,2,3,4,5,说明文档集合中每个文档都包含了这个单词。

为了方便大家理解,上图只是一个简单的倒排索引,只记录了哪些文档包含哪些单词。而事实上,索引系统还可以记录除此之外的更多信息。

下图则是一个相对复杂的倒排索引,在单词对应的倒排列表中不仅记录了文档编号,还记录了单词频率信息(TF),即这个单词在某个文档中出现的次数。

之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。

图中单词 创始人 的单词编号为 7,对应的倒排列表内容为 (3;1),其中 3 代表文档编号为 3 的文档包含这个单词,数字 1 代表词频信息,即这个单词在 3 号文档中只出现过 1 次。

实用的倒排索引还可以记录更多的信息,如下图所示索引系统除了记录文档编号和单词频率信息外,额外记载了两类信息,即每个单词对应的“文档频率信息”以及在倒排列表中记录单词在某个文档出现的位置信息(POS)。

 

有了这个索引系统,搜索引擎可以很方便地响应用户的查询,比如用户输入查询词“Facebook”,搜索系统查找倒排索引,从中读取包含这个单词的文档,利用单词频率信息、文档频率信息可以对这些候选搜索结果进行排序,计算文档和查询的相似性,按照相似性的得分由高到低排序输出,这些文档就是提供给用户的搜索结果。

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/751800
推荐阅读
相关标签
  

闽ICP备14008679号