BooleanQuery实际开发中常用到的一种Query查询,它其实是一个组合的Query,在使用时可以把各种Query对象加进去并标明他们之间的逻辑关系。BooleanQuery本身是一个布尔子句的容器,它提供了专门的API方法往其中添加子句,并标明他们之间的关系。多个关键词匹配搜索的业务场景不少,代码如下,简单的例子。
public static void main(String[] args) throws IOException {
//索引读取
IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get("indexdir")));
//构建索引搜索
IndexSearcher searcher = new IndexSearcher(reader);
//构建搜索条件
Query query1 = new TermQuery(new Term("title","美国"));
Query query2 = new TermQuery(new Term("content","学生"));
BooleanClause bc1 = new BooleanClause(query1, BooleanClause.Occur.MUST);
BooleanClause bc2 = new BooleanClause(query2, BooleanClause.Occur.MUST_NOT);
BooleanQuery booleanQuery = new BooleanQuery.Builder().add(bc1).add(bc2).build();
//执行搜索
TopDocs topDocs = searcher.search(booleanQuery,10);
for (ScoreDoc sd : topDocs.scoreDocs) {
Document doc = searcher.doc(sd.doc);
System.out.println("DocID:" + sd.doc);
System.out.println("id:" + doc.get("id"));
System.out.println("title:" + doc.get("title"));
System.out.println("文档评分:" + sd.score);
}
}
很显然,描述子句之间的关系,用Occur枚举类,列举说明子句之间在匹配文档时,如何并存的方式。
Specifies how clauses are to occur in matching documents.
-
MUST 表示该子句必须参与匹配文档中。
-
FILTER 除了这些子句不参与评分外,其他与MUST相似。
-
SHOULD "应该",出现在匹配的文档中。
-
MUST_NOT 表示该子句不允许出现在匹配的文档中。
OCCUR.FILTER类型示例,过滤了评分。
来源:oschina
链接:https://my.oschina.net/FXLoba/blog/3236291