对要搜索的信息创建Query查询对象,Lucene会根据Query查询对象生成最终的查询语法,类似关系数据库Sql语法一样Lucene也有自己的查询语法,比如:“name:lucene”表示查询Field的name为“lucene”的文档信息。
公共代码提取,以下例子会用到该方法:
//公共代码提取——获得IndexSearcher对象
public IndexSearcher getIndexSearcher() throws IOException {
//第一步:创建一个Directory对象,也就是索引库存放的位置。
Directory directory = FSDirectory.open(new File("E:\\eclipse-workspace\\ww_19lucene&solr\\index"));
//第二步:创建一个indexReader对象,需要指定Directory对象。
IndexReader indexReader = DirectoryReader.open(directory);
//第三步:创建一个indexsearcher对象,需要指定IndexReader对象
return new IndexSearcher(indexReader);
}
//公共代码提取——输出查询到的document
public void printResult(Query query,IndexSearcher indexSearcher) throws IOException {
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("查询结果总条数:"+topDocs.totalHits);
//第六步:返回查询结果。遍历查询结果并输出。
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
//获得document的id
int doc = scoreDoc.doc;
//根据documentId获得document
Document document = indexSearcher.doc(doc);
//输出文件信息:文件名、文件大小、文件路径、文件内容
System.out.println(document.get("fileName"));
System.out.println(document.get("filePath"));
System.out.println(document.get("fileSize"));
System.out.println(document.get("fileContent"));
System.out.println("-------------------------------------");
}
}
1、使用query子类查询
(1)MatchAllDocsQuery
查询索引库中的所有document
@Test
public void testMatchAllDocsQuery() throws IOException {
IndexSearcher indexSearcher = getIndexSearcher();
Query query = new MatchAllDocsQuery();
printResult(query, indexSearcher);
indexSearcher.getIndexReader().close();
}
(2)TermQuery
TermQuery,通过项查询,TermQuery不使用分析器所以建议匹配不分词的Field域查询,比如订单号、分类ID号等。
@Test
public void testTermQuery() throws IOException {
IndexSearcher indexSearcher = getIndexSearcher();
Query query = new TermQuery(new Term("fileName", "apache"));
printResult(query, indexSearcher);
indexSearcher.getIndexReader().close();
}
(3)NumericRangeQuery
根据数值返回查询
@Test
public void testNumericRangeQuery() throws IOException {
IndexSearcher indexSearcher = getIndexSearcher();
Query query = NumericRangeQuery.newLongRange("fileSize", 0L, 200L, true, true);
printResult(query, indexSearcher);
indexSearcher.getIndexReader().close();
}
(4)BooleanQuery
组合条件查询
@Test
public void testBooleanQuery() throws IOException {
IndexSearcher indexSearcher = getIndexSearcher();
BooleanQuery query = new BooleanQuery();
//后两个boolean表示是否包含左右边界值
Query query1 = NumericRangeQuery.newLongRange("fileSize", 0L, 200L, true, true);
Query query2 = new TermQuery(new Term("fileName", "apache"));
query.add(query1,Occur.SHOULD);
query.add(query2,Occur.MUST);
printResult(query, indexSearcher);
indexSearcher.getIndexReader().close();
}
Occur.MUST:必须满足此条件,相当于and
Occur.SHOULD:应该满足,但是不满足也可以,相当于or
Occur.MUST_NOT:必须不满足。相当于not
2、
2、使用queryparser查询
使用需要添加jar包
(1)QueryParser
@Test
public void testQueryParser() throws Exception {
IndexSearcher indexSearcher = getIndexSearcher();
//第一个参数设置默认field
QueryParser queryParser = new QueryParser("fileName", new IKAnalyzer());
//Query query = queryParser.parse("fileName:lucene");
//空格相当于or
//Query query = queryParser.parse("fileName:lucene fileName:apache");
//+相当于Must,没有符号表示条件可有可无
//Query query = queryParser.parse("fileName:lucene +fileName:apache");
//相当于and
//Query query = queryParser.parse("+fileName:lucene +fileName:apache");
//and、not、or必须大写
//Query query = queryParser.parse("fileName:lucene AND fileName:apache");
Query query = queryParser.parse("NOT fileName:lucene AND fileName:apache");
//Query query = queryParser.parse("fileName:lucene OR fileName:apache");
printResult(query, indexSearcher);
indexSearcher.getIndexReader().close();
}
语法:
1、基础的查询语法,关键词查询:
域名+“:”+搜索的关键字
例如:content:java
- 范围查询
域名+“:”+[最小值 TO 最大值]
例如:size:[1 TO 1000]
范围查询在lucene中支持数值类型,不支持字符串类型。在solr中支持字符串类型。
- 组合条件查询
1)+条件1 +条件2:两个条件之间是并且的关系and
例如:+filename:apache +content:apache
- +条件1 条件2:必须满足第一个条件,应该满足第二个条件
例如:+filename:apache content:apache
- 条件1 条件2:两个条件满足其一即可。
例如:filename:apache content:apache
4)-条件1 条件2:必须不满足条件1,要满足条件2
例如:-filename:apache content:apache
Occur.MUST 查询条件必须满足,相当于and | +(加号) |
Occur.SHOULD 查询条件可选,相当于or
| 空(不用符号) |
Occur.MUST_NOT 查询条件不能满足,相当于not非 | -(减号) |
第二种写法:
条件1 AND 条件2
条件1 OR 条件2
条件1 NOT 条件2
(2)MultiFieldQueryParser
可以指定多个默认搜索域
@Test
public void testMultiFiledQueryParser() throws Exception {
IndexSearcher indexSearcher = getIndexSearcher();
String[] fields = {"fileName","fileContent"};
QueryParser queryParser = new MultiFieldQueryParser(fields, new IKAnalyzer());
Query query = queryParser.parse("lucene AND apache");
printResult(query, indexSearcher);
indexSearcher.getIndexReader().close();
}