什么是docValues?

docValues是一种记录doc字段值的一种形式,在例如在结果排序和统计Facet查询时,需要通过docid取字段值的场景下是非常高效的。

为什么要使用docValues?

这种形式比老版本中利用fieldCache来实现正排查找更加高效,更加节省内存。倒排索引将字段内存切分成一个term列表,每个term都对应着一个docid列表,这样一种结构使得查询能够非常快速,因为term对应的docid是现成就有的。但是,利用它来做统计,排序,高亮操作的时候需要通过docid来找到,field的值却变得不那么高效了。之前lucene4.0之前会利用fieldCache在实例启动的时候预先将倒排索引的值load到内存中,问题是,如果文档多会导致预加载耗费大量时间,还会占用宝贵的内存资源。

索引在lucene4.0之后引入了新的机制docValues,可以将这个理解为正排索引,是面向列存储的。

DocValues和 field的存储值(field属性设置为stored=“true”)有什么区别?

docValues和document的stored=ture存储的值,都是正排索引,单也是有区别的:

l  存储方式:

DocValues是面向列的存储方式,stored=true是面向行的存储方式,如果通过fieldid取列的值可定是用docValues的存储结构更高效。

l  是否分词:

Stored=true的存储方式是不会分词的,会将字段原值进行保存,而docValues的保存的值会进行分词。

DocValues的实现

docValues的类型:

查了一下lucene的源码,发现DocValues有四种实现方式:

  1. Memory

l  实现类:org.apache.lucene.codecs.memory.MemoryDocValuesFormat

运行时正排数据会全部加载到内存中,这部分数据在内存中是压缩存储的

  1. Direct

l  实现类:org.apache.lucene.codecs.memory.DirectDocValuesFormat

导入到内存中不压缩使用,这个实际使用的效果应该和老版本的fieldcache差不多吧

  1. SimpleText

l  实现类:org.apache.lucene.codecs.simpletext.SimpleTextDocValuesFormat

这个只是当娱乐只用,不用在环境中使用

以上三种类型定义在lucene-codecs-5.3.0.jar的META-INF/services目录下

  1. Lucene50(默认使用)

l  实现类:org.apache.lucene.codecs.lucene50.Lucene50DocValuesFormat

Lucene50定义存放在lucene-core-5.3.0.jar的META-INF/services目录下

Lucene50的实现方式和Memory的实现方式大同小异,支持的字段类型更加丰富

在lucene50中将docValues的值分成5种类型:

  1. Numeric
  2. Binary
  3. Sorted
  4. SortedSet
  5. SortedNumeric

类型是由Schema中的field类型决定的:

l  StrField或者UUIDField

如果字段不是多值字段,则类型是SORTED

如果是多值字段,则类型是SORTED_SET

l  数值字段Trie*或者EnumField

如MultiValue=false,则NUMERIC

如MultiValued=true,则SORTED_SET

如何使用

Schema field字段设置

<field name="manu_exact"

type="string" indexed="false" stored="false"

docValues="true" />

另外可以通过fieldtype的docValuesFormat属性来设置docValue的实现策略:

<fieldType name="string_in_mem_dv"

class="solr.StrField" docValues="true"

docValuesFormat="Memory" />

总结

如果在索引上要进行facet,gourp,highlight等查询尽量使用docValue,这样不用为内存开销烦恼了。

例如:solr4.0之后都会需要在schema中设置一个­­­_version_字段来实现对文档的原子操作,为了节省内存,可以加上docValues:

<field name="_version_"

type="long" indexed="true" stored="true" docValues="true"/>

一个朋友分析得不错的

http://blog.csdn.net/zteny/article/details/60633374

apache官方说明:

https://cwiki.apache.org/confluence/display/solr/DocValues

转自:http://mozhenghua.iteye.com/blog/2275932

lucene DocValues——本质是为通过docID查找某field的值的更多相关文章

  1. lucene DocValues——本质是为通过docID查找某field的值 看图

    Why DocValues? The standard way that Solr builds the index is with an inverted index. This style bui ...

  2. C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,

    //将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...

  3. lucene DocValues——没有看懂

    前言: 在Lucene4.x之后,出现一个重大的特性,就是索引支持DocValues,这对于广大的solr和elasticsearch用户,无疑来说是一个福音,这玩意的出现通过牺牲一定的磁盘空间带来的 ...

  4. Elasticsearch压缩索引——lucene倒排索引本质是列存储+使用嵌套文档可以大幅度提高压缩率

    注意:由于是重复数据,词法不具有通用性!文章价值不大! 摘自:https://segmentfault.com/a/1190000002695169 Doc Values 会压缩存储重复的内容. 给定 ...

  5. 421. Maximum XOR of Two Numbers in an Array——本质:利用trie数据结构查找

    Given a non-empty array of numbers, a0, a1, a2, - , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  6. 使用FindControl("id")查找控件 返回值都是Null的问题

    做了一个通过字符串ID查找页面控件并且给页面控件赋值的功能,过程中遇到了this.FindControl("id")返回值都是Null的问题,记录一下解决办法. 问题的原因是我所要 ...

  7. mysql查找以逗号分隔的值-find_in_set

    有了FIND_IN_SET这个函数.我们可以设计一个如:一只手机即是智能机,又是Andriod系统的. 比如:有个产品表里有一个type字段,他存储的是产品(手机)类型,有 1.智能机,2.Andri ...

  8. C#算法设计查找篇之03-插值查找

    插值查找(Interpolation Search) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/701 访问. 插值 ...

  9. JavaScript 数组中查找符合条件的值

    数组实例的find方法,用于找出第一个符合条件的数组成员.它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员.如果没有符合条件的成员,则返回u ...

随机推荐

  1. winform中ComboBox控件的简单使用

    在开发winform中用到了ComboBox,但是发现和asp.net中的DropDownList差别比我想象中的大. 给ComboBox添加数据总结的有两种方法(绑定数据库在这里不说): 第一种方法 ...

  2. unittest多线程执行用例

    前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时... 那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线 ...

  3. 大数据学习——HADOOP集群搭建

    4.1 HADOOP集群搭建 4.1.1集群简介 HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起 HDFS集群: 负责海量数据的存储,集群中的角色主 ...

  4. 大数据学习——yum练习安装jdk

    yum list | grep jdk 安装jdk-1.8.0版本 -openjdk* 安装后,执行java -version 配置环境变量 使用vim /etc/profile 编辑profile文 ...

  5. 潘多拉的盒子(bzoj 1194)

    Description Input 第一行是一个正整数S,表示宝盒上咒语机的个数,(1≤S≤50).文件以下分为S块,每一块描述一个咒语机,按照咒语机0,咒语机1„„咒语机S-1的顺序描述.每一块的格 ...

  6. CF778A:String Game

    给出字符串s和t,以及s的长度n的一个全排列,求按照这个排列依次删除s的字符,删到何时s中不含子序列t. 解法一: t中的每个字符的位置在s中跳啊跳,合法的情况下t中的字符在s中的位置应该是单调递增的 ...

  7. windows 下安装Apache httpd 只需三步

    1.下载 Apache 官网地址:http://httpd.apache.org/docs/current/platform/windows.html#down 找到这个, 看到这几个选项: Apac ...

  8. BZOJ——2697: 特技飞行

    http://www.lydsy.com/JudgeOnline/problem.php?id=2697 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: ...

  9. asterisk 通道变量

    ${ACCOUNTCODE}: 用户计费帐号 sip.conf 里的 account=XXXX ${ANSWEREDTIME}: 通话时长(秒) ${BLINDTRANSFER}: 通道是否为转接类型 ...

  10. 【.Net 学习系列】-- Windows身份模拟(WindowsIdentity.Impersonate)时读取Access数据库

    参考资料: WindowsIdentity.Impersonate https://msdn.microsoft.com/zh-cn/library/w070t6ka(v=vs.110).aspx A ...