我有一个查询-license:"CC-BY-NC" AND -license:"CC-BY-ND 4.0 (Int)"要传递到 PrecedenceQueryParser.parse 中,如下所示:
Query query = new PrecedenceQueryParser().parse(filter, '')
Run Code Online (Sandbox Code Playgroud)
但在生成的查询中,您可以看到,诸如-lincense:CC-BY-NC, "" 之类的子句丢失了。
有什么设置可以保留“”吗?
=====================更新=============================
我明白,因为我正在寻找 CC-BY-ND 4.0 (Int) 的匹配,不带双引号(双引号只是用来使其成为一个短语)。这就是为什么 query.clauses[1].query 在 CC-BY-ND 4.0 (Int) 周围没有“”
现在我这样做:
def bqb = new BooleanQuery.Builder()
clauses.each { clause ->
bqb.add(clause.query, clause.prohibited ? BooleanClause.Occur.SHOULD : BooleanClause.Occur.MUST_NOT)
}
String s = bqb.build().toString()
Run Code Online (Sandbox Code Playgroud)
构建一个 BooleanQuery 并将子句放在一起,
那么 s 等于license:CC-BY-ND 4.0 (Int) license:CC-BY-NC
这绝对不是我想要的,我需要 CC-BY-ND 4.0 (Int) 用双引号括起来。有什么办法可以做到这一点吗?
吉布斯可能是一个解决方案,但我认为有点棘手。
一些附加信息,添加到 @gibbs 提供的答案中:
当使用经典查询解析器语法(问题中使用的语法)时,以下字符都具有特殊含义,因此在它们出现的任何搜索词中可能需要转义:
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /
Run Code Online (Sandbox Code Playgroud)
请注意,在两种情况下,这些是字符组:&&和||。
该列表记录在此处。
处理所有这些字符的最简单方法是在构建搜索表达式之前将每个搜索词传递给classic :QueryParser
org.apache.lucene.queryparser.classic.QueryParser;
Run Code Online (Sandbox Code Playgroud)
例如:
String escapedSearchTerm = QueryParser.escape(searchTerm)
Run Code Online (Sandbox Code Playgroud)