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有四种实现方式:

  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
















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6669306.html,如需转载请自行联系原作者

相关文章
|
缓存 NoSQL API
GraphQL(三)DataLoader 详解
本文为GraphQL DataLoader详解,主要包括批处理及缓存的相关内容。DataLoader是一个通用实用程序,用作应用程序数据获取层的一部分,通过和为各种远程数据源(如数据库或 Web 服务)提供简化且一致的 API
|
3月前
|
JavaScript 安全 API
告别 Vuex?Pinia:轻量高效的状态管理新选择
告别 Vuex?Pinia:轻量高效的状态管理新选择
215 84
|
存储 数据管理 关系型数据库
分布式系统设计之套路Master-Slave架构
分布式系统设计之套路Master-Slave架构
1533 0
|
监控 网络协议 NoSQL
五分钟带你读懂 TCP全连接队列(图文并茂)
今天有个小伙伴跑过来告诉我有个奇怪的问题需要协助下,问题确实也很奇怪。客户端调用RT比较高并伴随着间歇性异常Connection reset出现,而服务端CPU 、线程栈等看起来貌似都很正常,而且服务端的RT很短
五分钟带你读懂 TCP全连接队列(图文并茂)
|
监控 Dubbo 搜索推荐
No application config found or it‘s not a valid config! Please add <dubbo:application name=“...“ />
No application config found or it‘s not a valid config! Please add <dubbo:application name=“...“ />
1613 1
|
搜索推荐 Android开发
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
本文分享了不同价位电脑配置对于编译AOSP安卓系统源代码的影响,提供了从6000元到更高价位的电脑配置实例,并比较了它们的编译时间,以供学习AOSP源代码时电脑配置选择的参考。
982 0
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
|
存储 算法 对象存储
倒排索引:ES倒排索引底层原理及FST算法的实现过程(三)
倒排索引:ES倒排索引底层原理及FST算法的实现过程(三)
倒排索引:ES倒排索引底层原理及FST算法的实现过程(三)
|
存储 算法 开发者
Lucene底层关键字数据结构(FST状态机) | 学习笔记
快速学习Lucene底层关键字数据结构(FST状态机)。
Lucene底层关键字数据结构(FST状态机) | 学习笔记
|
算法 数据可视化 编译器
第二代上位机开发环境搭建
欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。 在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。 在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资
|
机器学习/深度学习 自然语言处理 算法
正向最大匹配(Forward Maximum Matching)
正向最大匹配(Forward Maximum Matching)是一种查找文本字符串中词语的算法。
613 1