RangeQuery替代方案

由于需要对数据的范围进行限制,所以就用到了这个类.
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"truetrue);
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..

 

               

你可能感兴趣的:(apache,Lucene)