• 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为字段值)
     
     
  • 相关阅读:
    C#循环页面form中控件
    鼠标放到按钮上页面样式发生变化
    access INSERT INTO 语句的语法错误
    更改水晶报表数据源
    C# byte[]与string互转
    禁用右键
    showModalDialog IE9 报错
    ListBox 循环删除当前项
    showModalDialog 刷新本页面,不重新发送信息,则无法刷新网页,Page_PreRender
    敏捷模式开发(转)
  • 原文地址:https://www.cnblogs.com/cc299/p/11032857.html
Copyright © 2020-2023  润新知