Lucene 搜索方法(范围搜索)

在某些情况下,用户需要查找一定范围内的文档,比如时间,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 {

 /**
  * @param args
  */
 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来查询。

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