ElasticSearch(ES)倒排索引原理

转载自:https://www.jianshu.com/p/323547de1bb2

ElasticSearch(ES)倒排索引原理

  • Elasticsearch(ES)使用称为倒排索引的结构达到快速全文搜索的目的
  • 一个倒排索引由文档中所有不重复词的列表构成
  • 对于其中每个词,有一个包含它的文档列表
  • 倒排索引建立的是分词(Term)和文档(Document)之间的映射关系,在倒排索引中,数据是面向词(Term)而不是面向文档的

在这里插入图片描述

例如,假设我们有两个文档,每个文档的content域包含如下内容:

文档一:The quick brown fox jumped over the lazy dog
文档二:Quick brown foxes leap over lazy dogs in summer

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

TermDoc_1Doc_1
QuickX
TheX
brownXX
brownXX
dogX
dogsX
foxX
foxesX
inX
jumpedX
lazyXX
leapX
overXX
quickX
summerX
theX

现在,如果我们想搜索quick brown,我们只需要查找包含每个词条的文档:

TermDoc_1Doc_1
brownXX
quickX
Total21

结论:
如果我们仅使用计算匹配词条数量的简单相似性算法,那么,我们可以说,对于我们查询的相关性来讲,第一个文档比第二个匹配度更高

但是,我们目前的倒排索引有一些问题:(大小写、同义词,扩展词

  • Quick和quick以独立的词条出现,然而用户可能认为它们是相同的词
  • fox和foxes非常相似, 就像dog和dogs;他们有相同的词根
  • jumped和leap, 尽管没有相同的词根,但他们的意思很相近。他们是同义词

使用前面的索引搜索 +Quick +fox 不会得到任何匹配文档。( +前缀表明这个词必须存在,即,只有同时出现Quick和fox的文档才满足这个查询条件),虽然第一个文档包含quick fox,第二个文档包含Quick foxes。

我们的用户可以合理的期望两个文档与查询匹配。我们可以做的更好。

如果我们将词条规范为标准模式,那么我们可以找到与用户搜索的词条不完全一致,但具有足够相关性的文档。例如:

  • Quick可以小写化为quick。
  • foxes可以词干提取–变为词根的格式-- 为fox。类似的,dogs可以为提取为dog。
  • jumped和leap是同义词,可以索引为相同的单词jump。

现在索引看上去像这样:

TermDoc_1Doc_1
brownXX
dogXX
foxXX
inX
jumpXX
lazyXX
overXX
quickXX
summerX
theXX

这还远远不够。我们搜索+Quick +fox仍然会失败,因为在我们的索引中,已经没有Quick了。但是,如果我们对搜索的字符串使用与content域相同的标准化规则,会变成查询+quick +fox,这样两个文档都会匹配!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值