how solr support DocValues

虽然说lucene,solr目前都是以相同版本同时release,并这并不意味着lucene级别的新功能,在solr级别一定会及时得到支持。拿lucene 4.0中的HighLight DocValues来说,在solr同版本中并没有得到支持。

如果让你来写一个patch,你会如何下手呢?

当然第一步是深入了解solr和lucene是如何结合在一起。

先看一下 lucene 4.0中是如何使用DocValues的

 Java |  copy code |? 
1
 
2
Document doc = new Document();
3
 doc.add(new IntDocValuesField(name, 22));
4
 doc.add(new IntField(name, 6, Field.Store.NO));
5
  

如上所示,同样是针对一个int value,如果使用DocValues,则使用的Field和一般场景是不一样的。

而目前solr 4.0中的现状是只针对IntField做了配置上处理以及映射。还未对IntDocValuesField作出支持。

再看一下solr是如何和lucene将这些field结合在一起的

step1 schema.xml中的配置:

 XML |  copy code |? 
01
02
<fields>
03
.......
04
<field name="popularity" type="int" indexed="true" stored="true" />
05
</fields>
06
 
07
<types>
08
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
09
</types>
10

其实真正理解这两部分是关键。

修改思路:
切入点:
solr有 solrInputField, SolrInputDocument, 这是很明显对应于lucene中的 Field, Document.

因此中间的一个所谓转换器 or其它概念的 东东 一定存在, 实际代码中就是:

DocumentBuilder
但实际上,这个类真的只是一个切入点。

对照schema.xml中的配置,

其实关键的是 schemaField, 以及各种 FieldType类。

各种不同的filed 都是通过FieldType create出来的。

花了点时间搞了个小patch,未全面测试,只提供了一个小test。
LOVE-219