Lucene包括很多种不同的搜索方式,首先生成一个检索器IndexSearcher searcher = new IndexSearcher("Index_Path", new StandardAnalyzer(), true),然后再调用searcher.search(query),其中典型的query查询方式有以下几种:

1)按词条搜索:TermQuery,即搜索某一词条。
方法如下:Query query = new TermQuery(new Term("field", "keyword"));
其中参数field指欲查找的字段,keyword指欲检索的关键字。

2)在某一范围类搜索:RangeQuery
方法如下:RangeQuery query = new RangeQuery(begin, end, include);
其中参数begin和end均是一个Term对象,分别指在索引中相应Term的起始位置和结束位置。include是一个boolean值,true表是包含起始和结束位置,false表示不包含边界值。

3)多关键字的搜索:PhraseQuery
方法如下:
PhraseQuery query = new PhraseQuery();
query.add(new Term("content","keyword1"));
query.add(new Term("content","keyword2"));
要 注意的是PhraseQuery类中有一个setSlop方法,该方法用于设定一个称之为"坡度"的变量,来确定关键字之间是否允许、允许多少个无关词汇 存在。默认值为0,即两个关键字之间无任何词汇存在,才能被搜索到。设置该值以后,只有当两个关键字之间无关词的数目小于等于坡度值是,才能被搜索 到。(文章末尾给出了具体例子)

4)使用通配符搜索:WildcardQuery
使用方法类似于1),只不过字段的关键字允许使用?(代表一个字符)、*(代表多个字符)

另外,还有以下不同的搜索方法:

“与或”搜索BooleanQuery、使用前缀搜索PerfixQuery、使用短语缀搜索PhrasePrefixQuery、模糊查询搜索FuzzyQuery等。


/*
 * 多关键字搜索的例子
*/
package  testlucene;
import  org.apache.lucene.analysis.standard. * ;
import  org.apache.lucene.document. * ;
import  org.apache.lucene.index. * ;
import  org.apache.lucene.search. * ;
public   class  PhraseQueryTest {
 
public   static   void  main(String[] args) throws  Exception{
  Document doc1 
=   new  Document();
  doc1.add(
new  Field( " content " , " david mary smith robert " ,Field.Store.YES,Field.Index.TOKENIZED));
  doc1.add(
new  Field( " title " , " doc1 " ,Field.Store.YES,Field.Index.TOKENIZED));
  Document doc2 
=   new  Document();
  doc2.add(
new  Field( " content " , " david smith mary robert " ,Field.Store.YES,Field.Index.TOKENIZED));
  doc2.add(
new  Field( " title " , " doc2 " ,Field.Store.YES,Field.Index.TOKENIZED));
  Document doc3 
=   new  Document();
  doc3.add(
new  Field( " content " , " david smith robert mary " ,Field.Store.YES,Field.Index.TOKENIZED));
  doc3.add(
new  Field( " title " , " doc3 " ,Field.Store.YES,Field.Index.TOKENIZED));
  
  IndexWriter writer 
=   new  IndexWriter( " c:\\index " , new  StandardAnalyzer(), true );
  
// writer.setUseCompoundFile(true);  // 设置为混合索引格式
  writer.addDocument(doc1);
  writer.addDocument(doc2);
  writer.addDocument(doc3);
  writer.close();
  
  
  IndexSearcher searcher 
=   new  IndexSearcher( " c:\\index " );
  Term word1 
=   new  Term( " content " , " david " );
  Term word2 
=   new  Term( " content " , " mary " );
  Term word3 
=   new  Term( " content " , " smith " );
  Term word4 
=   new  Term( " content " , " robert " );
  PhraseQuery query 
=   new  PhraseQuery();
  query.add(word1);
  query.add(word2);
  query.add(word3);
  query.setSlop(Integer.MAX_VALUE);
  Hits hits 
=  searcher.search(query);
  Print.printResult(hits,
" david and mary " );
 }
}


ExtJS教程- Hibernate教程- Struts2 教程- Lucene教程