倒排索引
倒排索引(Inverted Index) 也叫反向索引,有反向索引必有正向索引。 通俗地来讲,正向索引是通过key找valug,反向索引则是通过value找key。 ES底层在检索时底层使用的就是倒排索引。
索引模型
先有索引和映射如下:
{
"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,就能快速找到文档。 每个索引还建立了在元数据区出现的次数,出现的位置等信息,用于计算分数,按照特定顺序输出