16 doc values 正排索引
Posted cc299
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了16 doc values 正排索引相关的知识,希望对你有一定的参考价值。
搜索的时候,要依靠倒排索引;排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序,所谓的正排索引,其实就是doc values
在建立索引的时候,一方面会建立倒排索引,以供搜索用;一方面会建立正排索引,也就是doc values,以供排序,聚合,过滤等操作使用
doc values是被保存在磁盘上的,此时如果内存足够,os会自动将其缓存在内存中,性能还是会很高;如果内存不足够,os会将其写入磁盘上
向index中存储的文档
PUT /cc_article/long_article/1
"Title":"Thinking in Elastic Search",
"Price":30
PUT /cc_article/long_article/2
"Title":"Deep in Elastic Search",
"Price":25
建立倒排索引(假设索引中还有doc3、doc4)
注意:在ES中,每个被索引的字段,都有自己的倒排索引
Title的倒排索引:
term doc1 doc2 doc3 doc4
-----------------------------------------------------------
Thinking *
in * *
Elastic * *
Search * *
Deep *
Price的倒排索引:
term doc1 doc2 doc3 doc4
------------------------------------------------------------
30 *
25 *
22 *
27 *
搜索并排序
GET /cc_article/long_article/_search
"query":
"match":
"Title": "Elastic Search"
,
"sort": [
"Price":
"order": "asc"
]
返回:
doc2:Title:"Deep in E.S."
doc1:Title:"Thinking in E.S."
执行分析:
在执行搜索时,会直接去倒排索引中,查Elastic和Search后面,对应的文档。得到doc1,doc2
但是在执行按Price排序的时候,就不能使用Price的倒排索引了。加入使用Price倒排索引,需要遍历整个Price的倒排索引,才能知道doc1、doc2对应的Price,然后再进行排序。这就会带来检索Price=22、27等这种并不命中搜索结果的额外开销。
因此,高效的做法是,建立Price的正排索引。正排索引是列式存储的,即一个索引中,所有doc的同一字段,放在一起。不同字段,放在不同列中。
正排索引:
doc title
----------------------------------------------
doc1 Thinking, in, Elastic, Search
doc2 Deep,in,Elastic,Search
doc price
--------------------------------
doc1 30
doc2 25
doc3 22
doc4 27
执行排序:
因为在执行搜索时,确定了结果范围为doc1,doc2。
因此,在按Price排序时,直接去 price的正排索引中,取出doc1、doc2对应的price,再排序即可。(可以把索引理解为key-value集合,正排的key为docid,倒排的key为字段值)
以上是关于16 doc values 正排索引的主要内容,如果未能解决你的问题,请参考以下文章
Es官方文档整理-3.Doc Values和FieldData
ElasticSearch搜索引擎:常用的存储mapping配置项 与 doc_values详细介绍