[lucene3] 重写TermRangeFilter获得支持数字型数据区间检索的过滤器

在lucene2中,对于结果的区间过滤,是通过RangeFilter来实现的,其中一个主要的判断“大”“小”的方法就是

在上一篇  [lucene那点事儿]继承RangeFilter编写数字型过滤器 通过继承RangeFilter重写bits方法,实现对于数字型数据的区间大小判断逻辑,以对数字型数据的直接支持(现在较为普遍的方式,是通过建立索引的时候对数字型的数据进行字符串转换,通过动态加 0 的方式凑齐长度来使用lucene字符串比对的方式实现对数字型数据的区间过滤,属于取巧的一种)。

在lucene3中,RangeFilter已经不再支持,而其中对于区间搜索的支持,也转到了TermRangeFilter TermRangeQuery TermRangeTermEnum 几个类中,所以一旦系统升级,原有的lucene2的方式将不再支持。

而lucene3中对于区间大小的比对,依然是通过对字符串的大小比对,所以根本上如果要重写支持数字型,只要重写其中字符串大小比对的部分就可以了,在lucene3中,实现方式要变换一下。

lucene3中,区间过滤器TermRangeFilter,其实现过程借用了TermRangeQuery:

而TermRangeQuery,又借用TermRangeTermEnum来获取大小区间判断

而 TermRangeTermEnum 即在内部实现了针对字符串大小的判断:

源码的设计暂且不议,批判性的文章已经不少了,追踪到这里就可以知道本次重写需要涉及的地方,重写代码:

使用的方法

 

测试数据:

索引中数据如下:

|字段|值|

|price|1|

|price|1111|

检索条件为price: [1000 TO 2000]

检索后得到结果:

|字段|值|

|price|1111|

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值