Lucene QueryParse在解析时丢弃“

jyztefdp  于 2022-11-07  发布在  Lucene
关注(0)|答案(2)|浏览(158)

我有一个查询-license:"CC-BY-NC" AND -license:"CC-BY-ND 4.0 (Int)"要传递到PrecedenceQueryParser中。解析如下:

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

但是在生成的查询中可以看到,子句都像-lincense:CC-BY-NC一样,“”都丢失了。
是否有保留“"的设置?

更新更新更新
我理解这一点,因为我正在查找CC-BY-ND 4.0(Int)的匹配项,不带双引号(双引号只是用来使它成为一个短语)。这就是为什么query. clause [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)被双引号包围。有什么办法可以做到这一点吗?
吉布斯的可能是一个解决方案,但有点棘手,我认为。

zi8p0yeb

zi8p0yeb1#

一些额外的信息,添加到由@gibbs提供的答案中:
当使用经典查询解析器语法(问题中使用的语法)时,以下字符都具有特殊含义,因此可能需要在出现它们的任何搜索项中进行转义:

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

请注意,在两种情况下,这些是字符组:&&||中的一个或多个。
此列表记录在此处。
处理所有这些字符的最简单方法是在构建搜索表达式之前,将每个搜索项传递给classic QueryParser

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

例如:

String escapedSearchTerm = QueryParser.escape(searchTerm)
guicsvcw

guicsvcw2#

你需要逃离他们。
当您传递-license:"CC-BY-NC" AND -license:"CC-BY-ND 4.0 (Int)" this时,请使用下面的

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

相关问题