当前位置:首页 > ES > 正文内容

elasticsearch中倒排索引详解

phpmianshi1年前 (2019-07-19)ES125

概念


Elasticsearch使用一种叫做倒排索引(inverted index)的结构来做快速的全文搜索。倒排索引由在文档中出现的唯一的单词列 表,以及对于每个单词在文档中的位置组成。


示例

我们有两个文档,每个文档 content 字段包含: 

1. The quick brown fox jumped over the lazy dog 

2. Quick brown foxes leap over lazy dogs in summer 


为了创建倒排索引,我们首先切分每个文档的 content 字段为单独的单词(我们把它们叫做词(terms)或者表征(tokens)) ,把所有的唯一词放入列表并 排序,结果是这个样子的:

image.png

现在,如果我们想搜索 "quick brown" ,我们只需要找到每个词在哪个文档中出现既可:

image.png

两个文档都匹配,但是第一个比第二个有更多的匹配项。 如果我们加入简单的相似度算法(similarity algorithm),计算匹配 单词的数目,这样我们就可以说第一个文档比第二个匹配度更高——对于我们的查询具有更多相关性。 


但是在我们的倒排索引中还有些问题: 

1. "Quick" 和 "quick" 被认为是不同的单词,但是用户可能认为它们是相同的。 

2. "fox" 和 "foxes" 很相似,就像 "dog" 和 "dogs" ——它们都是同根词。 

3. "jumped" 和 "leap" 不是同根词,但意思相似——它们是同义词


上面的索引中,搜索 "+Quick +fox" 不会匹配任何文档(记住,前缀 + 表示单词必须匹配到)。只有 "Quick" 和 "fox" 都在 同一文档中才可以匹配查询,但是第一个文档包含 "quick fox" 且第二个文档包含 "Quick foxes" 。


用户可以合理的希望两个文档都能匹配查询,我们也可以做的更好。


如果我们将词为统一为标准格式,这样就可以找到不是确切匹配查询,但是足以相似从而可以关联的文档。例如:

1. "Quick" 可以转为小写成为 "quick" 。 

2. "foxes" 可以被转为根形式 ""fox 。同理 "dogs" 可以被转为 "dog" 。 

3. "jumped" 和 "leap" 同义就可以只索引为单个词 "jump


现在的索引:

image.png

但我们还未成功。我们的搜索 "+Quick +fox" 依旧失败,因为 "Quick" 的确切值已经不在索引里,不过,如果我们使用相同的 标准化规则处理查询字符串的 content 字段,查询将变成 "+quick +fox" ,这样就可以匹配到两个文档。

这个表征化和标准化的过程叫做分词(analysis),关于分词更多参考:https://phpmianshi.com/?id=163

版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

ELK的安装与配置

Elasticsearch 安装安装 JDK这里选择 openjdk$ yum install java-11-openjdk-devel获取 elasticsearch ...

elasticsearch基于地理位置的搜索

场景现在基于地理位置的app层出不穷,支持地理位置的组件也有不少,Elasticsearch也不例外,并且ES可以把地理位置、全文搜索、结构化搜索和分析结合到一起,我们来看一下。注意本文章基于es7,...

elasticsearch高亮搜索highlight

概念我们在浏览器上搜索文本时,发现我们输入的关键字有高亮显示,查看html源码就知道,高亮的部分是加了<em>标签的,ES也支持高亮搜索这种操作的,并且在返回的文档中自动加了<em&...

elasticsearch模糊查询match match_phrase wildcard regexp prefix的区别

1.match查询会先对搜索词进行分词,比如“白雪公主和苹果”,会分成“白雪”“公主”“苹果”。含有相关内容的字段,都会被检索出来。2.match_phrase查询match_phrase与slop一...

logstash增量同步mysql到es配置详解

配置详解input {   jdbc {     # mysql相关jdbc配置   ...

elasticsearch中分析器的原理和使用

概念分析(analysis)机制用于进行全文文本(Full Text)的分词,以建立供搜索用的反向索引。原理分析器的工作过程大概分成两步:分词(Tokenization):根据停止词把文本分割成很多的...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。