Solr4.2 新特性 DocValues

原文地址: http://wiki.apache.org/solr/DocValues

DocValues 从 Lucene 4.2 和 Solr 4.2 开始加入,通过建立字段的正排索引,提升 sorting、faceting、grouping、function queries 等性能。

介绍

在 Solr 的配置文件 (schema.xml) 中,如果需要为一个 Field 建立倒排索引,可以通过配置 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 个这样的文档:

1
2
3
doc[0] = 1005
doc[1] = 1006
doc[2] = 1005

在这个例子中,每个文档仅需要一个 bit。

SORTED

每一个文档里面有一个这样类型的单值字段。这就像在整个索引里有一个很大的 String[],但用的是不同的寻址方式。每一个唯一的 value 被赋予一个数字代表其顺序。所以每个文档只是记录一个压缩后的整数,有字典来还原他们原来的词。

例如,假设有 3 个这样的文档:

1
2
3
doc[0] = "aardvark"
doc[1] = "beaver"
doc[2] = "aardvark"

值 “aardvark” 被映射成 0,”beaver” 映射成 1,建立两个数据结构如下:

1
2
3
4
5
6
doc[0] = 0
doc[1] = 1
doc[2] = 0

term[0] = "aardvark"
term[1] = "beaver"

SORTED_SET

每个文档里面有一个 string 类型的多值字段。这个和 SORTED 类型比较相似,每个文档有一个 value 的 “set”(按照递增存储)。

这里刻意的去除了重复的 value,并且忽略了原有 value 的排序。

例如,假设有 3 个这样的文档:

1
2
3
doc[0] = "cat", "aardvark", "beaver", "aardvark"
doc[1] =
doc[2] = "cat"

值 “aardvark” 被映射成 0,”beaver” 映射成 1,”cat” 映射成 2,建立两个数据结构如下:

1
2
3
4
5
6
7
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 实现。对于要排序的字段,这是一个不错的选择。

例子:

1
<field name="manu_exact" type="str" indexed="false" stored="false" docValues="true" default=""/>

StrField (multiValued=true)

这个背后实际上是由 SORTED_SET 实现。

例子:

1
<field name="productCategories" type="str" indexed="false" stored="false" multiValued="true" docValues="true"/>

TrieXXXField (multiValued=false)

这个背后实际上是由 NUMERIC 实现。这个对于排序字段或者用 function queries 打分的字段比较有益。

例子:

1
<field name="popularity" type="int" indexed="false" stored="false" docValues="true" default="0"/>

TrieXXXField (multiValued=true)

这个背后实际上是由 SORTED_SET 实现,数字编码的值由基础反推出原始的数字,可以用于排序。

例子:

1
<field name="specialCodes" type="int" indexed="false" stored="false" multiValued="true" docValues="true"/>

配置不同的 Codec 实现

你可以通过设置 fieldType 的 docValuesFormat 属性来选择不同的实现。

要启用 per-field DocValues 格式,必须在 solrconfig.xml 里面设置 SchemaCodecFactory:

1
<codecFactory class="solr.SchemaCodecFactory"/>

schema.xml 下面的配置:

  • docValuesFormat=”Lucene42”: 这是默认设置,所有数据会被加载到堆内存中。
  • docValuesFormat=”Disk”: 这是另外一个实现,将部分数据存储在磁盘上。
  • docValuesFormat=”SimpleText”: 文本格式,非常慢,用于学习。
© 2025 Solr Community of China All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero