天天看點

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 {

 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來查詢。