Lucene QueryParse 在解析时丢弃 "

Lucene QueryParse discards " when parsing

我有一个查询 -license:"CC-BY-NC" AND -license:"CC-BY-ND 4.0 (Int)" 要传递给 PrecedenceQueryParser.parse,如下所示:

Query query = new PrecedenceQueryParser().parse(filter, '')

但是在生成的查询中您可以看到,子句像 -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()

构建一个 BooleanQuery 并将子句放在一起,

然后 s 等于 license:CC-BY-ND 4.0 (Int) license:CC-BY-NC

这绝对不是我想要的,我需要CC-BY-ND 4.0 (Int) 被双引号括起来。有什么办法吗?

Gibbs 可能是一个解决方案,但我认为有点棘手。

你需要逃离他们。

当你通过 -license:"CC-BY-NC" AND -license:"CC-BY-ND 4.0 (Int)" 这个时,使用下面的

-license:"\"CC-BY-NC\"" AND -license:"\"CC-BY-ND 4.0 (Int)\""

一些附加信息,添加到@gibbs 提供的答案中:

当使用 classic query parser syntax(问题中使用的是什么)时,以下字符都具有特殊含义,因此可能需要在它们出现的任何搜索词中进行转义:

+  -  &&  ||  !  (  )  {  }  [  ]  ^  "  ~  *  ?  :  \  /

请注意,在两种情况下,这些是字符组:&&||

此列表已记录 here

处理所有这些字符的最简单方法是在构建搜索表达式之前将每个搜索词传递给 classic QueryParser

org.apache.lucene.queryparser.classic.QueryParser;

例如:

String escapedSearchTerm = QueryParser.escape(searchTerm)