lucend的多样化查询主要是通过一些内置的QUERY类型来实现:
TermQuery:进行项搜索
Term t = new Term("filename","4167");
Query query = new TermQuery(t);
TopDocs docs = searcher.search(query, 100);
System.out.println("一共搜索到结果:"+docs.totalHits+"条");
TermRangeQuery:在指定范围内搜索
TermRangeQuery query = TermRangeQuery.newStringRange("filename","4193","4198",true,true);
//查找文件名域值为4193到4198内的索引
NumericRangeQuery:在指定数字范围内进行搜索
prefixQuery:通过字符串搜索
BooleanQuery:组合查询
PhaseQuery:短语搜索
FuzzyQuery:搜索类似项
import java.nio.file.Paths;
import org.apache.lucene.analysis.core.*;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.store.*;
import org.apache.lucene.util.Version;
import junit.framework.TestCase;
public class BasicSearchTest extends TestCase{
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//testTerm();
testQueryParser();
}
public static void testTerm() throws Exception{//查找一个term并使用Junit来测试
Directory dir = FSDirectory.open(Paths.get("G:\\luceneout"));
DirectoryReader reader = DirectoryReader.open(dir);
IndexSearcher searcher = new IndexSearcher(reader);
Term t = new Term("filename","4167");
Query query = new TermQuery(t);
TopDocs docs = searcher.search(query, 100);
System.out.println("一共搜索到结果:"+docs.totalHits+"条");
assertEquals("找到了4167",4,docs.totalHits);
t = new Term("filename","4206");
docs = searcher.search(new TermQuery(t), 100);
System.out.println("一共搜索到结果:"+docs.totalHits+"条");
assertEquals("找到了4206",4,docs.totalHits);
dir.close();
}
public static void testQueryParser() throws Exception{
Directory dir = FSDirectory.open(Paths.get("G:\\luceneout"));
DirectoryReader reader = DirectoryReader.open(dir);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser("content",new StandardAnalyzer());
Query query = parser.parse("数据挖掘");
TopDocs docs = searcher.search(query, 10);
System.out.println("一共搜索到结果2:"+docs.totalHits+"条");
assertEquals(216,docs.totalHits);
Document d = searcher.doc(docs.scoreDocs[0].doc);
System.out.print(d.get("path"));
//assertEquals("找到交通规则",d.get("content"));
}
public void testTermRangeQuery() throws Exception{
Directory dir = FSDirectory.open(Paths.get("G:\\luceneout"));
IndexReader reader = DirectoryReader.open(dir);
TermRangeQuery query = TermRangeQuery.newStringRange("filename","4193","4198",true,true);//指定项范围内搜索
//NumericRangeQuery query = NumericRangeQuery.newIntRange("filename",(Integer)4193,(Integer)4198,true,true);//指定数字范围内搜索
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs hits = searcher.search(query, 3);
System.out.println("一共搜索到结果3:"+hits.totalHits+"条");
dir.close();
}
}
总之就是查询方式的多样化