Lucene QueryParse отбрасывает "при разборе - PullRequest
0 голосов
/ 06 августа 2020

У меня есть запрос -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()

build a BooleanQuery и объедините предложения,

s тогда будет равно license:CC-BY-ND 4.0 (Int) license:CC-BY-NC

Это определенно не то, что я хочу, мне нужно CC -BY-ND 4.0 (Int), чтобы быть заключены в двойные кавычки. Есть ли способ сделать это?

Гиббс мог бы быть решением, но я думаю, немного сложнее.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Некоторая дополнительная информация, чтобы добавить к ответу @gibbs:

При использовании classi c синтаксиса парсера запроса (это то, что используется в вопросе) , то все следующие символы имеют особое значение и, следовательно, их может потребоваться экранирование в любом из условий поиска, где они появляются:

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

Обратите внимание, что в двух случаях это группы символов: && и ||.

Этот список задокументирован здесь .

Самый простой способ обработать все эти символы - передать каждый поисковый запрос в classi c QueryParser, перед построением поискового выражения:

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

Например:

String escapedSearchTerm = QueryParser.escape(searchTerm)
1 голос
/ 06 августа 2020

Вам нужно избежать их.

Когда вы передаете -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)\""
...