ES:倒排索引与全文搜索

倒排索引(Inverted index):通常的索引是通过文档找关键词,即通过文档id找到文档,再从中找关键词。而倒排索引则是通过关键词找到其所在的文档。即:

传统索引:文档 ---> 单词

倒排索引:单词 ---> 文档

ES:倒排索引与全文搜索_第1张图片

单词存在内存的“词典”中,相当于索引(传统意义上的索引,不是ES中的index)文件,获得单词后,通过字典树之类的方式确定存储该单词的倒排索引存储位置,其中存储了单词信息和指向倒排文件的指针,倒排文件中存储倒排列表,倒排列表中存储的是出现过该单词的所有文档,以及该单词在文档中出现的位置。这样就可以通过单词来获取文档了。

全文搜索

传统的数据库搜索如mysql,是结构化搜索,也就是文档(表中的一条数据)是结构化的(由很多指定的字段组成)

而全文搜索的文档内容不是结构化的,如一篇文章,一个句子这样,没有根据指定字段进行划分。而搜索引擎(使用全文搜索)通常处理的就是这类文档。

全文搜索处理的过程为(以ES为例):

对于存储文档:

先进行字符过滤,将一些无效字符(如HTML的标签)给过滤掉或转成合适的字符(如&转成and)

然后一个文档(可以是一个句子或文章)分词

例如:明天就放假了 分词为:明天 就 放假 了

接着通过token(就是指单词)过滤器对单词进行过滤 如:“了”没有意义根据算法可能会被token过滤器过滤掉。

然后根据分词创建倒排索引

以下过程为个人猜测,具体实现没有看,仅仅用于帮助理解:

例如:对于单词“明天” 先判断词典中是否有“明天“这个单词,如果有,则根据该单词的倒排索引找到倒排文件,将“明天就放假了”文档的指针(或者是id)添加到倒排文件中。如果词典中没有,就在词典中创建一个“明天“的倒排索引,并新建一个倒排文件存储出现“明天"的文档指针或id,然后将该倒排文件的指针添加到倒排索引中。

这样当搜索明天时,就会根据明天在词典中找到对应的倒排索引,从而获取文件,从中读出出现过明天的文档,“明天就放假了“就会被搜索出来,如果还有其他包含单词“明天”的文档也会被一起搜索出来。

对于搜索而言:

例如此时ES中有几个文档:

1“明天就放假了

2“明天不加班”

3“明天睡懒觉”

4“明天出去吃饭”

5“今晚不加班”

当搜索“明天“时,

与之前存储的过程类似,可以找到“明天“的倒排文件,从而获得前4个文档,然后根据评分算法

决定哪些文档可以显示,以什么顺序进行显示。

如以词频/逆文本(根据搜索词出现的频率以及不出现的频率评分)进行评分,显示超过0.2分(举个例子)的文档。1,4为1/3,2,3为2/5。那么4个文档都超过0.2分,都可以显示,

显示的结果就是2,3在前 1,4在后。

而当搜索“明天放假“时,分词结果为 “明天”“放假” 根据两个词进行检索,对于文档1,两个词都能检索到,即评分为 1/3+1/3=2/3,而对于2,“明天“命中得2/5分,“放假”不命中,扣分x(具体扣多少根据算法定)。最后文档1分大于文档2,结果显示文档1在文档2之前,对于文档2,若减分很多,低于了0.2就不显示了。



你可能感兴趣的:(学习笔记,ES,全文搜索)