搜索的时候,要依靠倒排索引;排序的时候,需要依靠正排索引,看到每个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 【正排索引】的更多相关文章

  1. Elasticsearch由浅入深(十)搜索引擎:相关度评分 TF&IDF算法、doc value正排索引、解密query、fetch phrase原理、Bouncing Results问题、基于scoll技术滚动搜索大量数据

    相关度评分 TF&IDF算法 Elasticsearch的相关度评分(relevance score)算法采用的是term frequency/inverse document frequen ...

  2. 52.基于doc value正排索引的聚合内部原理

    主要知识点: 本节没有太懂,以后复习时补上       聚合分析的内部原理是什么????aggs,term,metric avg max,执行一个聚合操作的时候,内部原理是怎样的呢?用了什么样的数据结 ...

  3. es倒排索引和正排索引

    搜索的时候,要依靠倒排索引:排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序,所谓的正排索引,其实就是doc values.在建立索引的时候,一方面会建立倒排索引, ...

  4. 正排索引(forward index)与倒排索引(inverted index) (转)

    一.正排索引(前向索引) 正排索引也称为"前向索引".它是创建倒排索引的基础,具有以下字段. (1)LocalId字段(表中简称"Lid"):表示一个文档的局部 ...

  5. 正排索引(forward index)与倒排索引(inverted index)

    正常的索引一般是指关系型数据库里的索引. 把不同的数据存放到不同的字段中.如果要实现baidu或google那种搜索,就需要与一条记录的多个字段进行比对,需要 全表扫描,如果数据量比较大的话,性能就很 ...

  6. 后端程序员之路 35、Index搜索引擎实现分析4-最终的正排索引与倒排索引

    # index_box 提供搜索功能的实现- 持有std::vector<ITEM> _buffer; 存储所有文章信息- 持有ForwardIndex _forward_index;  ...

  7. Elasticsearch的索引模块(正排索引、倒排索引、索引分析模块Analyzer、索引和搜索、停用词、中文分词器)

    正向索引的结构如下: “文档1”的ID > 单词1:出现次数,出现位置列表:单词2:出现次数,出现位置列表:…………. “文档2”的ID > 此文档出现的关键词列表. 一般是通过key,去 ...

  8. ElasticSearch(二十一)正排和倒排索引

    1.区别 搜索的时候,要依靠倒排索引:排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序,所谓的正排索引,其实就是doc values 在建立索引的时候,一方面会建立 ...

  9. 56.doc values

    主要知识点 doc values     搜索的时候,要依靠倒排索引:在54小节中写到在聚合排序的时候如果仅仅依靠倒排索引的话是不能得出准确的结果的,需要依靠正排索引,所谓的正排索引,其实就是doc ...

随机推荐

  1. <每日 1 OJ> -LeetCode 21. 合并两个有序链表

    题目: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4输出:1->1-> ...

  2. Cesium中导入三维模型方法(dae到glft/bgltf)[转]

    Cesium中导入三维模型方法(dae到glft/bgltf) Cesium中目前支持gltf和bgltf两种格式.“gltf是khronos组织(起草OpenGL标准的那家)定义的一种交换格式,用于 ...

  3. springmvc@RequestMapping-params参数规则

    springmvc@RequestMapping-params参数规则 https://blog.csdn.net/qq_33439525/article/details/78193190 版权声明: ...

  4. 650. Find Leaves of Binary Tree

    class Solution { public: vector<vector<int>> findLeaves(TreeNode* root) { vector<vect ...

  5. swap 释放

    #swap 释放 -------------------------------- swapoff -a wwapon -a

  6. Spark连续特征转化成离散特征

    当数据量很大的时候,分类任务通常使用[离散特征+LR]集成[连续特征+xgboost],如果把连续特征加入到LR.决策树中,容易造成overfit. 如果想用上连续型特征,使用集成学习集成多种算法是一 ...

  7. JS 从整数里 随机选一个

    比如:现有数字随机一个 num = 3)) // 现有数随机一个 randomNum 的值只会是 0 1 2 3 里的随机一个 如果想要从数组随机一个下标index 就不要+1 如: parseInt ...

  8. Ubuntu下配置Window CIFS共享

    转自:https://blog.csdn.net/wanfengzhong/article/details/52550074 1. 准备windows共享文件夹 2. 安装 cifs-utilssud ...

  9. postman 测试Excel文件导入导出功能

    1.导入的测试方法 选择form-data,key值填写方法对应的参数,选择File,Value处上传文件即可. 2. 导出的测试方法 在导出文件的时候,响应结果是乱码,然后在测试的时候选择下载,下载 ...

  10. Docker 运行ES和Kibana

    1. docker pull image docker pull elasticsearch:6.7.2 docker pull mobz/elasticsearch-head:5 docker pu ...