Solr4.2 新特性 DocValues
DocValues从Lucene4.2和Solr4.2开始加入,通过建立字段的正排索引,提升sorting, faceting, grouping, function queries等性能。
介绍
在Solr的配置文件(schema.xml)中,如果需要为一个Filed建立倒排索引,可以通过配置(indexed=”true”)来实现,DocValues是一种正排索引方式,通过设置(DocValues=”true”)来实现。
1、docvalues的特性
近实时索引:在每一个索引段里面都会有一个docvalues数据结构,这个结构与索引同时建立,并且能够快速更新、生效;
基本的查询和过滤支持:你可以做基本的词、范围等基本查询,但是不参与评分,并且速度较慢,如果你对速度和评分排序有要求,你可以讲该字段设置为(indexed=”true”)
更好的压缩比: Docvalues fields 的压缩效果比 fieldcache好,但不强调做到极致。
节约内存:你可以定义一个fieldType的 docValuesFormat (docValuesFormat="Disk"),这样的只有一小部分数据加载到内存,其它部分保留在磁盘上。
2、docvalues不能实现的
不能用来代替存储字段:这和字段存储完全不同,只是一些便于(sort/facet/group/join/scoring)检索的数据存储结构。
对于静态索引不是最有选择:如果你有一个完全不更新的索引,docvalues看起来不会很吸引你。另一方面如果你需要和fieldcache对比,继续往下看。
风险较大:这个功能在4.2版本整合到Solr,非常新,可能仍有一些未知的bug!
Lucene的 DocValues 格式
Lucene有四个基础字段类型可以使用docvalues。目前Solr使用了其中三种:
NUMERIC:每一个文档里面只有一个这样类型的单值字段。这就像在整个索引里有一个很大的long[],数据基于实际使用的值经过压缩的。
例如,假设有3个这样的文档:
doc[0] = 1005
doc[1] = 1006
doc[2] = 1005
在这个例子中,每个文档仅需要一个bit。
SORTED:每一个文档里面有一个这样类型的单值字段。这就像在整个索引里有一个很大的String[], 但用的是不同的寻址方式。.每一个唯一的value被赋予一个数字代表其顺序。所以每个文档只是记录一个压缩后的整数,有字典来还原他们原来的词。
例如,假设有3个这样的文档:
doc[0] = “aardvark”
doc[1] = “beaver”
doc[2] = “aardvark”
值 “aardvark” 被映射成0,”beaver”映射成1, 建立两个数据结构如下:
doc[0] = 0
doc[1] = 1
doc[2] = 0
term[0] = “aardvark”
term[1] = “beaver”
SORTED_SET: 每个文档里面有一个string类型的多值字段。这个和SORTED类型比较相似,每个文档有一个value的”set”。(按照递增存储)。 这里刻意的去除了重复的value,并且忽略了原有value的排序。
例如,假设有3个这样的文档:
doc[0] = “cat”, “aardvark”, “beaver”, “aardvark”
doc[1] =
doc[2] = “cat”
值 “aardvark” 被映射成0,”beaver”映射成1, “cat”映射成2,建立两个数据结构如下:
doc[0] = [0, 1, 2]
doc[1] = []
doc[2] = [2]
term[0] = “aardvark”
term[1] = “beaver”
term[2] = “cat”
BINARY: 每个文档存在一个 byte[] array。这个编码及数据结构可以由用户自定义。
Solr的 DocValues 类型
StrField (multiValued=false):这个背后实际上是由SORTED实现。对于要排序的字段,这是一个不错的选择。
例子:
<field name=”manu_exact” type=”str” indexed=”false” stored=”false” docValues=”true” default=””/>
StrField (multiValued=true):这个背后实际上是由SORTED_SET实现。
例子:
<field name=”productCategories” type=”str” indexed=”false” stored=”false” multiValued=”true” docValues=”true”/>
TrieXXXField (multiValued=false):这个背后实际上是由NUMERIC实现。这个对于排序字段或者用function queries打分的字段比较有益。
例子:
<field name=”popularity” type=”int” indexed=”false” stored=”false” docValues=”true” default=”0″/>
TrieXXXField (multiValued=true):这个背后实际上是由SORTED_SET实现,数字编码的值由基础反推出原始的数字,可以用于排序。
例子:
<field name=”specialCodes” type=”int” indexed=”false” stored=”false” multiValued=”true” docValues=”true”/>
配置不同的 Codec 实现
你可以通过设置fieldType的docValuesFormat属性来选择不同的实现。
要启用 per-field DocValues 格式, 必须在solrconfig.xml里面设置SchemaCodecFactory:
<codecFactory class=”solr.SchemaCodecFactory”/>
schema.xml下面的配置:
- docValuesFormat="Lucene42": 这是默认设置,所有数据会被加载到堆内存中。
- docValuesFormat="Disk": 这是另外一个实现,将部分数据存储在磁盘上。
- docValuesFormat="SimpleText": 文本格式,非常慢,用于学习。
作者:明翼(XGogo)
-------------
公众号:TSparks
微信:shinelife
扫描关注我的微信公众号感谢
-------------