Solr DocValues详解

 

什么是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

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

 

2.      
Direct

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

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

3.      
SimpleText

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

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

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

 

4.      
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"/>

时间: 2024-09-17 06:36:28

Solr DocValues详解的相关文章

python之import机制详解_python

本文详述了Python的import机制,对于理解Python的运行机制很有帮助! 1.标准import: Python中所有加载到内存的模块都放在 sys.modules .当 import 一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将模块的名字加入到正在调用 import 的模块的 Local 名字空间中.如果没有加载则从 sys.path 目录中按照模块名称查找模块文件,模块可以是py.pyc.pyd,找到后将模块载入内存,并加到 sys.modules 中,并

详解Android业务组件化之URL Schema使用_Android

前言:       最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Schema,所以想着现在还是在预研阶段,很有必要先了解一下URL Schema,看看是如何使用的?其实在之前做Hybrid混合编程的时候就接触过URL Schema,总来的来说还不算陌生,今天就来回顾总结一下. 什么是 URL Schema?      android中的scheme是一种页面内跳转协议,是一种非常好

Spring Boot的启动器Starter详解

  Spring Boot的启动器Starter详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs Spring Boot应用启动器基本的一共有44种,具体如下: 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2)spring-boot-starter-actuator 帮助监控和管理应用. 3)spring-boot-starter-amqp

Tomcat 6 --- JNDI详解

JNDI(Java Naming and Directory Interface, Java命名和目录接口),说白了,就是通过配置一些xml文件,方便用户直接调用API使用某些通用的资源. 举个简单的例子,如果在tomcat中部署了很多应用,应用都需要使用同一个数据库,如果每个应用都在代码中配置数据库的连接,肯定是很麻烦的. 所以通过JNDI就可以简单的通过 InitialContext 获取到统一配置的资源,简化代码的编写. 本篇主要内容按照上面来讲解,其中样例部分主要说明一下通用javabe

详解Python中的type()方法的使用

  这篇文章主要介绍了详解Python中的type()方法的使用,是Python入门中的基础知识,需要的朋友可以参考下 type()方法返回传递变量的类型.如果传递变量是字典那么它将返回一个字典类型. 语法 以下是type()方法的语法: ? 1 type(dict) 参数 dict -- 这是字典 返回值 此方法返回传递变量的类型. 例子 下面的例子显示type()方法的使用 ? 1 2 3 4 #!/usr/bin/python   dict = {'Name': 'Zara', 'Age'

【转】java枚举使用详解

在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数据集",春夏秋冬四个数据元素组成了四季的"数据集". 在Java中如何更好的使用这些"数据集"呢?因此枚举便派上了用场,以下代码详细介绍了枚举的用法. Java代码   package com.ljq.test;      /**   * 枚举用法详解   *

状态模式(state pattern) 详解

状态模式(state pattern): 允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 建立Context类, 包含多个具体状态(concrete state)类的组合, 根据状态的不同调用具体的方法, state.handle(), 包含set\get方法改变状态. 状态接口(state interface), 包含抽象方法handle(), 具体状态类(concrete state)继承(implement)状态类(state), 实现handle()方法; 具体方法

kafka详解一、Kafka简介

背景:      当今社会各种应用系统诸如商业.社交.搜索.浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它        如何及时做到如上两点      以上几个挑战形成了一个业务需求模型,即生产者生产(produce)各种信息,消费者消费(consume)(处理分析)这些信息,而在生产者与消费者之间,需要一个沟通两者的桥梁-消息系统.      从一个微观层面来说,这种需求也可理解为不同的系统之间如何传递消息. Kafka诞生

Cocos2d-x win7 + vs2010 配置图文详解

Cocos2d-x win7 + vs2010 配置图文详解(亲测)   下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d-1.01-x-0.9.1,具体下载位置如下图: 下载完之后,解压到当前文件夹.我把下载的程序放在F盘根目录,解压完毕之后,双击打开文件夹,看看里面有什么东西,红圈部分就是我们要安装使用的文件: 接下来,我们正式安装cocos2d-x到win7中去. 首先,双击上图中的cocos2d-w