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为字段值)

原文地址:https://www.cnblogs.com/cc299/p/11032857.html

时间: 2024-10-09 14:49:14

16 doc values 【正排索引】的相关文章

es倒排索引和正排索引

搜索的时候,要依靠倒排索引:排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序,所谓的正排索引,其实就是doc values.在建立索引的时候,一方面会建立倒排索引,以供搜索用:一方面会建立正排索引,也就是doc values,以供排序,聚合,过滤等操作使用.doc values是被保存在磁盘上的,此时如果内存足够,os会自动将其缓存在内存中,性能还是会很高:如果内存不足够,os会将其写入磁盘上. 倒排索引举例:doc1: hello world you and

Elasticsearch系列---相关性评分算法及正排索引

概要 上一篇中多次提到了按相关性评分,本篇我们就来简单了解一下相关性评分的算法,以及正排索引排序的优势. 评分算法 Elasticsearch进行全文搜索时,Boolean Model是匹配的基础,先用boolean model将匹配的文档挑选出来,然后再运用评分函数计算相关度,参与的函数如我们提到的TF/IDF.Length Norm等,再加上一些控制权重的参数设置,得到最后的评分. Boolean Model 作为全文搜索的基础,Boolean Model的结果决定文档是否要进行下一步的评分

正排索引和倒排索引简单介绍

在搜索引擎中,数据被爬取后,就会建立index,方便检索. 在工作中经常会听到有人问,你这个index是正排的还是倒排的?那么什么是正排呢?什么又是倒排呢?下面是一些简单的介绍. 网页A中的内容片段: Tom is a boy. Tom is a student too. 网页B中的内容片段: Jon works at school. Tom's teacher is Jon. 正排索引: 正排索引是指文档ID为key,表中记录每个关键词出现的次数,查找时扫描表中的每个文档中字的信息,直到找到所

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

# index_box 提供搜索功能的实现- 持有std::vector<ITEM> _buffer; 存储所有文章信息- 持有ForwardIndex _forward_index;    - _forward_index.build_findex( _buffer )    - get_all_items _forward_index.get_all_items    - get_items _forward_index.get_items(docid_vect, result, filt

正排索引与倒排索引(转)

正排索引与倒排索引 什么是正排索引(forward index)? 由key查询实体的过程,是正排索引. 在搜索引擎中每个文件都对应一个文件ID,文件内容被表示为一系列关键词的集合(实际上在搜索引擎索引库中,关键词也已经转换为关键词ID.简单的,正排索引可以理解为(文件内容会对应一个分词后的集合list<< item >>) Map< id,list< item>>,能够由id快速(时间复杂度O(1))找到内容的一个数据结构. 什么是倒排索引(inverte

夺命雷公狗—玩转SEO---51---建库,正排索引与倒排索引和浅入关键词密度

搜索引擎其实和我们书本上的目录原理是一样的,书本上我们是可以通过目录找到我们相应的内容, 比如导航站其实也就是一个索引的结构: 正排索引: 网站001   =   关键词A  +   关键词B   如此类推...... 网站002   =   关键词A  +   关键词B   如此类推...... 像这种页面被分成一个个的关键词就是正排索引 倒排索引: 1.文档 就像一个网站,里面分成一个个文件(如 TXT.RAR.JS.CSS.EXE.JPG),这就称呼为文档 2.文档集合 有很多的文档组成的

MapReduce-倒排索引

环境: Hadoop1.x,CentOS6.5,三台虚拟机搭建的模拟分布式环境 数据:任意数量.格式的文本文件(我用的四个.java代码文件) 方案目标: 根据提供的文本文件,提取出每个单词在哪个文件中出现了几次,组成倒排索引,格式如下 Ant FaultyWordCount.java : 1 , WordCount.java : 1 思路: 因为这个程序需要用到三个变量:单词.文件名.出现的频率,因此需要自定义Writable类,以单词为key,将文件名和出现的频率打包. 1.先将每行文本的单

随笔编号-16 MySQL查看表及索引大小方法

目标:阿里云OS数据库DMS,单个主库最大存储空间为2T.最近公司业务扩展很快,一天数据量达到7.9G左右.要求备份清理历史数据,备份到其他磁盘. 准备: 如果想知道MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE_SCHEMA : 数据库名TABLE_NAME:表名ENGINE:所使用的存储引擎TABLES_ROWS:记录数DATA_LENGTH:数据大

Hadoop--倒排索引过程详解

倒排索引就是根据单词内容来查找文档的方式,由于不是根据文档来确定文档所包含的内容,进行了相反的操作,所以被称为倒排索引 下面来看一个例子来理解什么是倒排索引 这里我准备了两个文件 分别为1.txt和2.txt 1.txt的内容如下 I Love Hadoop I like ZhouSiYuan I love me 2.txt的内容如下 I Love MapReduce I like NBA I love Hadoop 我这里使用的是默认的输入格式TextInputFormat,他是一行一行的读的