由于需要对数据的范围进行限制,所以就用到了这个类.
Term begin = new Term("field1","418815290");
Term end = new Term("field1","418847590");
RangeQuery query1 = new RangeQuery(begin, end, true);
当转换成BooleanQuery来查询的时候,会生成大于1024个TermQuery..
所以提示:org.apache.lucene.search.BooleanQuery$TooManyClauses
1.
ConstantScoreRangeQuery cQuery =new ConstantScoreRangeQuery("number","1","999999",true,true);
2.
BooleanQuery.setMaxClauseCount(10000000);
3.
通过RangeFilter
RangeFilter filter=new RangeFilter("viewedcount", "0000010000","0150000000", true, true);
IndexSearch.search(Query query,Filter filter),
ConstantScoreRangeQuery其实是通过用RangeFilter来实际这个范围查询的..
RangeFilter的实现方式是通过循环所有的document。先从Range中拿到最小的值的Term。看能不能在所有的document中找到相应的document。如果找不到的话。。就直接跳出循环。。。
如果能找到对应的document。直通过while循环。。那到一个个document.然后取对应Field的值与Range最大范围的值比较。如果小就加入Bits..
if (upperTerm != null) {
int compare = upperTerm.compareTo(term.text());
if ((compare < 0) ||
(!includeUpper && compare==0)) {
break;
}
}
termDocs.seek(enumerator.term());
while (termDocs.next()) {
bits.set(termDocs.doc());
}
Lucene 部分代码
另外有一个想法:()
把范围最小的封装成一个TermQuery.
把范围最大的也封装成一个TermQuery..
TermQuery query=new TermQuery(new Term("number","1"));
TermQuery query2=new TermQuery(new Term("number","9999"));
Hits hits1=indexSearcher.search(query);
Hits hits2=indexSearcher.search(query2);
拿到最小和最大的document id..循环从最小到最大doc id..