倒排索引
倒排索引(Inverted Index) 也叫反向索引,有反向索引必有正向索引。 通俗地来讲,正向索引是通过key找valug,反向索引则是通过value找key。 ES底层在检索时底层使用的就是倒排索引。
索引模型
先有索引和映射如下:
json
复制代码
{ "products" : { "mappings" : { "properties" : { "description" : { "type" : "text" }, "price" : { "type": "float" }, "title": { "type" : "keyword" } } } }
先录入如下数据,有三个字段title、price、description
_id |
title | price | description |
1 | 洗衣液 | 25 | 这个洗衣液很搞笑 |
2 | 手机 | 1999 | 很好用 |
3 | 小老鼠 | 0 | 很好吃 |
倒排索引的示意如下,这就是es的查询效率高的原因 | |||
title字段不分词,整块匹配 | |||
description字段分词,每个字都是一个匹配 |
索引区 | 元数据区 |
洗衣液 1 | 1 洗衣液 25 很搞笑 |
25 1 | ... |
很 [1,2,3] | |
搞 1 | |
笑 1 | |
手机 2 | |
1999 2 | |
好 2 | |
用 2 | |
... |
注意:Elasticsearch分别为每个字段都建立了一个倒排索引。因此查询时查询字段的term.就能知道文档ID,就能快速找到文档。 每个索引还建立了在元数据区出现的次数,出现的位置等信息,用于计算分数,按照特定顺序输出