Lucene2.9 范围查询Range Query

     Apache Lucene 2.9的改进 数字的处理方式的支持,尤其是在范围查询(如“给我找出价格在0.5到9.99英镑之间的CD”)的场景下。在2.9版之前,Lucene的查询完全基于文本,因此对于数字的处理则变成了基于字符串的精确编码。这种做法经常会生成大量独立的关键字,Lucene需要通过遍历的方式来构建整个结果集。在此之前,许多开发人员使用了自定义的编码规则来应对这种情况,不过Lucene 2.9已经自带对数字的处理方式。Field和Query类会采取合适的精度进行索引和搜索,这样大大降低了需要搜索的关键字数量,使查询的响应能力得以显著提高。

 

    在V2.9中,范围查询也有很大的变化,RangeQuery已经不推荐使用,使用TermRangeQuery和NumericRangeQuery两个替代。

    TermRangeQuery:

    NumericRangeQuery:该类还在测试实验中,在其api中,用红字标出:NOTE: This API is experimental and might change in incompatible ways in the next release.  
    NumericRangeQuery:要使用它,首先要使用NumericField 给数字建索引(当然这个的term就是数字的了)。如果你的term是文本,那就是使用TermRangeQuery

    新建NumericRangeQuery:

Query q = NumericRangeQuery.newFloatRange("weight", //field name
                 new Float(0.3f), //min 从它开始
                 new Float(0.10f),//max 到它结束
                 true,  //是否包含min
                 true); //是否包含max

   由于查询数字的term的时间相对更少,所以NumericRangeQuery的性能要比TermRangeQuery好(只对数的情况)。

For optimal performance, re-use the TokenStream and Field instance for more than one document:

  NumericTokenStream stream = new NumericTokenStream(precisionStep);
  Field field = new Field(name, stream);
  field.setOmitNorms(true);
  field.setOmitTermFreqAndPositions(true);
  Document document = new Document();
  document.add(field);

  for(all documents) {
    stream.setIntValue(value)
    writer.addDocument(document);
  }
 

This stream(NumericTokenStream ) is not intended to be used in analyzers; it's more for iterating the different precisions during indexing a specific numeric value.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值