zoukankan      html  css  js  c++  java
  • 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为字段值)
     
     
  • 相关阅读:
    自己写的SqlHelper
    宿叶网思路
    phpMyAdmin教程 之 创建新用户/导入/导出数据库
    什么是主机空间?干什么用?
    转 sql注入
    xUtils
    仿360状态,类流量监控桌面浮动显示
    在Yii Framework中利用PHPMailer发送邮件(2011-06-02 14:06:23)
    MD5类库(hex_md5)
    MYSQL的随机查询的实现方法
  • 原文地址:https://www.cnblogs.com/cc299/p/11032857.html
Copyright © 2011-2022 走看看