lucene DocValues——本质是为通过docID查找某field的值
什么是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有四种实现方式:
- Memory
l 实现类:org.apache.lucene.codecs.memory.MemoryDocValuesFormat
运行时正排数据会全部加载到内存中,这部分数据在内存中是压缩存储的
- Direct
l 实现类:org.apache.lucene.codecs.memory.DirectDocValuesFormat
导入到内存中不压缩使用,这个实际使用的效果应该和老版本的fieldcache差不多吧
- SimpleText
l 实现类:org.apache.lucene.codecs.simpletext.SimpleTextDocValuesFormat
这个只是当娱乐只用,不用在环境中使用
以上三种类型定义在lucene-codecs-5.3.0.jar的META-INF/services目录下
- Lucene50(默认使用)
l 实现类:org.apache.lucene.codecs.lucene50.Lucene50DocValuesFormat
Lucene50定义存放在lucene-core-5.3.0.jar的META-INF/services目录下
Lucene50的实现方式和Memory的实现方式大同小异,支持的字段类型更加丰富
在lucene50中将docValues的值分成5种类型:
- Numeric
- Binary
- Sorted
- SortedSet
- 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的值的更多相关文章
- lucene DocValues——本质是为通过docID查找某field的值 看图
Why DocValues? The standard way that Solr builds the index is with an inverted index. This style bui ...
- C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,
//将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...
- lucene DocValues——没有看懂
前言: 在Lucene4.x之后,出现一个重大的特性,就是索引支持DocValues,这对于广大的solr和elasticsearch用户,无疑来说是一个福音,这玩意的出现通过牺牲一定的磁盘空间带来的 ...
- Elasticsearch压缩索引——lucene倒排索引本质是列存储+使用嵌套文档可以大幅度提高压缩率
注意:由于是重复数据,词法不具有通用性!文章价值不大! 摘自:https://segmentfault.com/a/1190000002695169 Doc Values 会压缩存储重复的内容. 给定 ...
- 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 ...
- 使用FindControl("id")查找控件 返回值都是Null的问题
做了一个通过字符串ID查找页面控件并且给页面控件赋值的功能,过程中遇到了this.FindControl("id")返回值都是Null的问题,记录一下解决办法. 问题的原因是我所要 ...
- mysql查找以逗号分隔的值-find_in_set
有了FIND_IN_SET这个函数.我们可以设计一个如:一只手机即是智能机,又是Andriod系统的. 比如:有个产品表里有一个type字段,他存储的是产品(手机)类型,有 1.智能机,2.Andri ...
- C#算法设计查找篇之03-插值查找
插值查找(Interpolation Search) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/701 访问. 插值 ...
- JavaScript 数组中查找符合条件的值
数组实例的find方法,用于找出第一个符合条件的数组成员.它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员.如果没有符合条件的成员,则返回u ...
随机推荐
- 【模板】manacher算法
传送门 某篇好文章 #include <cstdio> #include <cstring> #define N 22200000 #define min(x, y) ((x) ...
- lubuntu通过Smb访问Windows共享目录
lubuntu通过Smb访问Windows共享目录 如果未安装Smb,先安装: apt-get install smbclient smbfs 安装后,查看共享主机上的共享目录: CentOS/Red ...
- 转 Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
转自: http://www.cnblogs.com/huangcong/archive/2011/08/29/2158268.html 黄聪:Python 字符串操作(string替换.删除.截取. ...
- hdu 4046 Panda [线段树]
Panda Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- Codeforces 549C(博弈)
C. The Game Of Parity time limit per test 1 second memory limit per test 256 megabytes input standar ...
- UESTC 1087 【二分查找】
问了某明==shit 中文题意不解释. 因为数据的范围是1e9以内的所以我们可以通过二分的方法枚举可能的中位数. 用二分法每次判断某一数字比中位数大还是比中位数小. 判断方法是,枚举以第n个数为起点的 ...
- POJ 1511 【heap+dij】
题意: t组样例. 每组有n个节点,有m条单向边. 有m组输入,每组a b c 表示从a到b的单向边的权值是c. 求解,从编号为1的节点出发,有n-1个人,要求他们分别到达编号从2到n的节点再返回,所 ...
- 如何解决XML文件中的警告提示“No grammar constraints (DTD or XML Schema) referenced in the document.”
解决方法:加上 <!DOCTYPE xml> <?xml version="1.0" encoding="UTF-8"?> <!D ...
- ArcGIS engine中Display类库——Display
转自原文 ArcGIS engine中Display类库——Display Display类库包括了用于显示GIS数据的对象.除了负责实际输出图像的主要显示对象(display object)外,这 ...
- 247. Segment Tree Query II
最后更新 二刷 09-Jna-2017 利用线段树进行区间查找,重点还是如何判断每一层的覆盖区间,和覆盖去见与当前NODE值域的关系. public class Solution { public i ...