在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|