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
}
创建倒排索引(假设索引中还有doc三、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的倒排索引,才能知道doc一、doc2对应的Price,而后再进行排序。这就会带来检索Price=2二、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的正排索引中,取出doc一、doc2对应的price,再排序便可。(能够把索引理解为key-value集合,正排的key为docid,倒排的key为字段值)
相关文章
相关标签/搜索