DocValues
在solr4.2以后,引入了一个令人兴奋的功能,这个功能在lucene存在已经一段时间了,但是还没有在solr中使用.
在某些方面,DocValue 是一种非常有效的索引方式.
为什么用DocValues?
标准的建立索引方式是一中倒排序索引方式,这种方式就是对索引中的所有文档的词语(terms)构造一个列表,挨着term是一个词语(term)所属文档的列表(同样包含词语在一篇文档中出现的次数).这种方式会使搜索速度很快,因为用户通过词语来搜索的,有一个准备好的词语到文档关系的值会使查询处理非常快.
对于其他常见的搜索相关的功能,如排序,分面,高亮.这种方法并不是很有效.这个分面工具,必须查找每篇文档中的每一个词语,然后组成结果集列表,抽取文档的id用来构建分面结果列表.在solr中,这主要是在内存中,并且加载比较慢.(主要依赖于文档数,词数terms等.)
在lucene4.0中,引入了一个新的方法,DocValue字段现在是一个以列为主的字段,具有在索引的时候构建的文档到值(document-to-value)的映射.这个方法保证减轻了一些字段缓存的内存要求,并且是查找分面,排序,分组速度更快.
如何使用DocValue
使用DocValue,只需要在field中开启即可.就整个框架(schema)来说,你需要定义一个字段类型,然后使用docValues定义那个字段类型的字段.所有的这些动作都是在schema.xml中完成的.
使DocValue生效,只需要docValue="true"即可,例子如下:
<field name="manu_exact" type="string" indexed="false" stored="false" docValues="true"/>
在solr4.5以前,使用docValues的字段不能为空,在solr4.5以后,这个限制已经取消.
提示:如果你已经索引过你的数据,在schem.xml改变之后,需要重新建立索引,这样才能使docValue起到作用.
DocValue只对于指定的字段类型有作用.类型的选择,决定了下面使用的Lucene DocValue的类型.可用的solr字段类型是:
字符串字段类型:strField
如果是单值字段,Lucene将使用SORTED类型.
如果是多值字段,Lucene将使用SORTED_SET类型.
所有的Trie*类型:
如果是单值字段,Lucene将使用NUMERIC类型
如果是多值字段,Lucene将使用SORTED_SET类型.
UUID字段.
这些Lucene的类型关系到这些值是如何排序和存储的.
还有一个配置选项可用,在字段类型中修改docValuesFormat.默认的实现是使用一个混合的加载,一部分东西在内存中,一部分东西在硬盘上.在有些情况下,你可能会选择保存所有的东西在硬盘上或者保存所有的东西到内存中,你可以在字段类型中定义docValuesFormat="Disk"或者docValuesFormat="Memory"来实现.
<fieldType name="string_ondisk" class="solr.StrField" docValuesFormat="Disk" />
这个选项,保存所有东西到硬盘上降低了性能.但是它试着保持了一个合理的性能.即使这样它仍旧比字段缓存(fieldCache)好.保存所有东西到内存中可能会增加对内存要求.
请注意docValuesFormat选项在将来可能会发生改变.
DocValue对solr来说是一个很新的东西,更多背景知识请参考:
Introducing Lucene Index Doc Values