在使用lucene进行建立索引搜索时,排序与范围查询常会使用到数值型字段,int、long、float等,lucene在6.0版本后很多老的api被删除,启用了很多新的处理api,对于数值型字段多了新的处理,原来lucene对于数值型字段还是相对较弱的。
lucene主要是采用倒排索引的形式进行建立索引进行查询的,通过term到doc映射达到快速索引的目的,但是在排序、高亮、统计时这种方式也并不高效,所以后来lucene加入了docvalue特性,可以把这个特性理解为正排索引。在构建索引时如果开启了这一特性会额外建立一个字段级别的排序好的文档索引,实现磁盘空间换内存,加速功能实现。具体关于docvalue 的介绍可参考:
以前使用solr时,关于字段的设置都是在xml文件中完成,现在使用lucene的api后需要自己实现,首先建立索引时的逻辑:
//浮点型
doc.add(new FloatPoint("duration", 2.51f));//倒排索引
doc.add(new FloatDocValuesField("duration", 2.51f));//正派索引用于排序、聚合
doc.add(new StoredField("duration", 2.51f));//需要存储
//整型
doc.add(new LongPoint("size", 515));//倒排索引
doc.add(new NumericDocValuesField("size", 515));//正派索引用于排序、聚合
doc.add(new StoredField("size", 515));//需要存储
6.0后的版本,数值型建立索引的字段都更改为Point结尾,FloatPoint,LongPoint,DoublePoint等,对于浮点型的docvalue是对应的
DocValuesField,整型为
NumericDocValuesField,
FloatDocValuesField等都为NumericDocValuesField的实现类。
在进行检索时,需要进行排序时:
//true为倒序
Sort sort = new Sort(new SortField("duration",SortField.Type.FLOAT,true));
TopDocs docs = searcher.search(query, 10,sort);
范围查询:
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(FloatPoint.newRangeQuery("duration", 0f, 3f),Occur.SHOULD);
Sort sort = new Sort(new SortField("duration",SortField.Type.FLOAT,true));
TopDocs docs = searcher.search(builder.build(), 10,sort);
具体测试用例没有给出,这里只介绍具体使用的字段及设置。