上篇我们介绍了 Lucene 多样的查询模式,每一种都是相互独立的用来解决特定查询目标的 Query 对象。本节我们要将这些查询模式使用 QueryParser 组合起来进行合并查询 —— 用一个文本字符串表达式来表示所有的查询模式。
QueryParser 的基本作用是将一个满足特定语法的字符串转换成相应的查询对象。我们可以不再需要使用组合对象的方式来手动构造复合逻辑查询,而是通过一个单行字符串就可以完成原先需要数行代码才能完成的查询功能。
关键词查询 TermQuery 与组合查询 BooleanQuery
关键词查询是最简单的查询,在 QueryParser 的语法里它就是一个「无空格」普通的字符串。
var analyser = new HanLPAnalyzer();
var parser = new QueryParser("content", analyser);
var query = parser.parse("北京大学");
System.out.println(query);
var hits = searcher.search(query, 10).scoreDocs;
--------------
content:北京大学
var query = parser.parse("北京 大学");
System.out.println(query);
------------
content:北京 content:大学
System.out.println(query.getClass());
------------
class org.apache.lucene.search.BooleanQuery
var query = parser.parse("+北京 +大学");
var query = parser.parse("+北京 -大学")
注意 QueryParser 会使用传递进去的 analyzer 对象对字符串进行分词,最开始例子的「北京大学」解析后之所以是单个字符串,那是因为「北京大学」本身就是一个完整的原子词汇。如果我们试试「北京林业大学」就会完全是不一样的结果,它是三个词汇的或运算。
var query = parse