Lucene提供了多种针对于区间的查询的实现方式,诸如RangeQuery和RangeFilter等,通常而言,RangeQuery是最容易联想的方式,使用起来很非常的简单,但是,使用它却很容易出现TooManyClause exception,我在另一篇文章
http://blog.csdn.net/quzishen/archive/2010/08/17/5818068.aspx 已经讲述了出现这个问题的原因。而且,这种方式很容易造成内存溢出,使系统的运行受到严重影响。
所以推荐的,是使用RangeFilter,装配进Query中进行过滤。Lucene提供的RangeFilter的过滤机制是通过对比字符来进行的,比如搜索a - e 之间的字符的方式,这样就很容出现搜索 1 - 5,却能将 200 搜出来的原因。是因为 字符'2' 处于 '1' 和 '5' 之间。
所以如果希望能够正确的过滤数字型的数据,需要我们特殊处理。这里我提出一种方案:
继承RangeFilter编写自己的数字型过滤器,看看源代码:
这样就实现了数字型数据的过滤。看看如何使用(为了对比,我将另一种采用QueryRange的方式也写入了并注释掉)
先判断当前的数据是否是数字型的,如果非数字型,则使用Lucene的RangeFilter。