lucene学习之多样化查询

来源:互联网 发布:吴知力图片 编辑:程序博客网 时间:2024/04/29 16:37

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();}}
总之就是查询方式的多样化

0 0