在某些情況下,使用者需要查找一定範圍内的文檔,比如時間,ID等。
package com.querytype;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.RangeQuery;
import org.apache.lucene.search.TermQuery;
public class RangeQueryDemo {
public static void main(String[] args) {
try {
IndexSearcher search = new IndexSearcher("d://demo");
Term t1 = new Term("bookname","001");
Term t2 = new Term("bookname","005");
RangeQuery query = new RangeQuery(t1,t2,false);
Hits hits = search.search(query);
for(int i=0;i<hits.length();i++)
{
System.out.println(hits.doc(i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
首先為QUERY設定一個上屆和一個下屆,然後設定一個布爾值,布爾值表示,如果為TRUE,那麼這兩個臨界值加入到結果中,如果為FALSE那麼就不加到結果中。在RangeQuery判斷某個TERM是否在某一範圍内時,使用的是STRING的toString方法。
由于該類的rewrite方法将對某個範圍内的查詢轉化為一個由多個TERMQUERY組成的布爾查詢,而且每個子查詢的條件都為SHOULD,是以查詢滿足的條件文檔較大的時候,性能非常的低。
如果你設定的查詢的範圍超過了1024,那麼就會抛出異常,TooManyClause就是由于地層采用的是BooleanQuery來查詢。