一.介绍
使用搜索引擎,你通常为字段构建倒排索引(indexed="true"):值指向文档。
DocValues 是一种建立前向索引(docValues="true")的方式,以便文档指向值。
1.docValues是什么?
NRT兼容: 这些是在索引时构建每段数据结构,并设计对数据快速变化的使用情况有效。
基本查询/过滤支持:你可以对docValues字段执行基本的术语,范围等查询,而不对其进行索引,但是这些查询通常是常数分数,通常比较慢。如果你关系性能和得分,请索引这个字段。
比字段缓存压缩更好: DocValues 字段比fieldCache有更好的压缩,让人觉得不可思议。
能够在堆内存中存储数据:你可以在fieldType(docValuesFormat="Disk")上指定一个不同的docValuesFormat,以便在堆上加载少量的数据,大部分数据保存在磁盘上。
2.docValues不是什么
- 不是存储字段的替代:这些于存储字段无关,而是用于搜索的数据结构(sort/facet/group/join/scoring)。
- 静态索引没有什么大的改进: 如果你有一个完全静态的索引,docValues似乎不会有什么有趣地方,如果你打算用fileldCache,可以看看。
二. 更详细信息
Lucene有四种可以用的docValues类型,目前solr用了其中三个:
- NUMERIC:单值的每个文档数字类型。这就像整个索引有一个大的long[]数组,尽管数据是基于实际使用的值压缩的。
考虑一下三个值的文档:
doc[0] = 1005
doc[1] = 1006
doc[2] = 1005
在这里面,字段将使用1个bit位标示docValues,因为可以标示2个值已经够用了。
- SORTED: 单值每个文档字符串类型。这就像为整个索引有一个大的String[] 数组,但是有一个有附加额外级别。每个唯一的值都被分配一个表示其真实Term值的顺序编号。因此每个文档真正存储的是一个压缩的整数,并且单独有个“字典”,将这些顺序编号映射到其真实的值上。
举个例子,有下面三个值的文档:
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:一个多值的文档字符串类型。类似于SORTED,除了每个文档有一个Set值(以增加的顺序排序)。因此,它有意丢失文档中的重复值,并且在文档中失去了顺序。
举个例子,有以下三个文档:
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: 单值的每文档字节[]数组。 这可以用于编码自定义的每个文档的数据结构。