Lucene查询的两种方式
1.Query查询
1).MatchAllDocsQuery
2).TermQuery
3).NumberRangeQuery
4).BooleanQuery
2.QueryParser
1).QueryParser
2).MultiFieldQueryParser
先写一下获取IndexSearcher对象的set方法
1.IndexReader对象的get/set方法
setIndexReader();
public void setIndexReader() {
String path = "D:\\project\\temp\\index";
File file = new File(path);
try {
Directory directory = FSDirectory.open(file);
IndexReader indexReader1 = DirectoryReader.open(directory);
this.indexReader = indexReader1;
} catch (IOException e) {
e.printStackTrace();
}
}
getIndexReader()
public IndexReader getIndexReader() {
return indexReader;
}
2.IndexSearcher对象的set方法
public void setIndexSearcher() {
IndexReader indexReader = getIndexReader();
IndexSearcher indexSearcher1 = new IndexSearcher(indexReader);
this.indexSearcher = indexSearcher1;
}
查询方法
- MatchAllDocsQuery
public void matchAllDocsQuery(){
MatchAllDocsQuery matchAllDocsQuery = new MatchAllDocsQuery();
System.out.println(matchAllDocsQuery.toString());
//获取索引查询对象
IndexSearcher indexSearcher = getIndexSearcher();
try {
TopDocs topDocs = indexSearcher.search(matchAllDocsQuery, 100);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
//打印查询结果
printResult(scoreDocs,indexSearcher);
} catch (IOException e) {
e.printStackTrace();
}
}
- TermQuery
public void termQuery(){
//查询文件名是"倔强.txt"的文件
Term term = new Term("name","倔强.txt");
Query query = new TermQuery(term);
System.out.println(query.toString());
IndexSearcher indexSearcher = getIndexSearcher();
try {
TopDocs search = indexSearcher.search(query, 100);
ScoreDoc[] scoreDocs = search.scoreDocs;
printResult(scoreDocs,indexSearcher);
} catch (IOException e) {
e.printStackTrace();
}
}
- NumberRangeQuery
public void numberQuery () {
//查询文件大小在1-2000之间的文件,包含1和2000,单位是字节
NumericRangeQuery numericRangeQuery = NumericRangeQuery.newLongRange("size",1L,2000L,true,true);
IndexSearcher indexSearcher = getIndexSearcher();
System.out.println(numericRangeQuery.toString());
try {
TopDocs topDocs = indexSearcher.search(numericRangeQuery, 1000);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
printResult(scoreDocs,indexSearcher);
} catch (IOException e) {
e.printStackTrace();
}
}
- BooleanQuery
public void booleanQuery () {
BooleanQuery booleanClauses = new BooleanQuery();
IndexSearcher indexSearcher = getIndexSearcher();
try {
//第一个查询条件
Query query1 = new TermQuery(new Term("name","倔强.txt"));
//第二个查询条件
Query query2 = new TermQuery(new Term("name","时光机.txt"));
//第一个查询条件文件名应该是倔强.txt
//Occur.SHOULD 应该
//Occur.MUST 必须
//Occur.MUST_NOT 不必须
booleanClauses.add(query1, BooleanClause.Occur.SHOULD);
booleanClauses.add(query2, BooleanClause.Occur.SHOULD);
System.out.println(booleanClauses.toString());
TopDocs topDocs = indexSearcher.search(booleanClauses, 100);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
printResult(scoreDocs,indexSearcher);
} catch (IOException e) {
e.printStackTrace();
}
}
- QueryParser
public void queryParser () {
IndexSearcher indexSearcher = getIndexSearcher();
//默认查询域
QueryParser queryParser = new QueryParser("name",new IKAnalyzer());
try {
Query query = queryParser.parse("name:倔强.txt");
System.out.println(query.toString());
TopDocs topDocs = indexSearcher.search(query, 100);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
printResult(scoreDocs,indexSearcher);
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
- MultiFieldQueryParser
public void multiFieldQueryParsesr () {
IKAnalyzer ikAnalyzer = new IKAnalyzer();
//默认域
String[] fields = new String[]{"name","content"};
MultiFieldQueryParser multiFieldQueryParser = new MultiFieldQueryParser(fields,ikAnalyzer);
try {
//索引文件名或文件内容包含倔强或者害怕的文件
Query query = multiFieldQueryParser.parse("倔强.txt OR 害怕");
System.out.println(query.toString());
IndexSearcher indexSearcher = getIndexSearcher();
TopDocs topDocs = indexSearcher.search(query, 100);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
printResult(scoreDocs,indexSearcher);
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
- printResult
打印结果方法
public void printResult (ScoreDoc[] scoreDocs,IndexSearcher indexSearcher) {
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
System.out.println("====开始===");
try {
Document doc1 = indexSearcher.doc(doc);
String name = doc1.get("name");
System.out.println("文件名:" + name);
String size = doc1.get("size");
System.out.println("大小:" + size);
String filePath = doc1.get("path");
System.out.println("大小:" + filePath);
//String content = doc1.get("content");
//System.out.println("文件内容:"+content);
System.out.println("-------结束--------");
} catch (IOException e) {
e.printStackTrace();
}
}
}
再接再励