Странное поведение парсера запросов Lucene 5.1.0

Я использую Lucene Query Parser 5.1.0

Эти запросы фильтра не работают:

* AND {!tag=guid}guid:(*)
* && {!tag=guid}guid:(*)
* {!tag=guid}guid:(*)

это бросает

org.apache.solr.search.SyntaxError: Cannot parse 'guid:(*': Encountered \"<EOF>\" at line 1, column 7.\nWas expecting one of:\n <AND> ...\n <OR> ...\n <NOT> ...\n \"+\" ...\n \"-\" ...\n <BAREOPER> ...\n \"(\" ...\n \")\" ...\n \"*\" ...\n \"^\" ...\n <QUOTED> ...\n <TERM> ...\n <FUZZY_SLOP> ...\n <PREFIXTERM> ...\n <WILDTERM> ...\n <REGEXPTERM> ...\n \"[\" ...\n \"{\" ...\n <LPARAMS> ...\n <NUMBER> ...\n

И эти запросы фильтра работают:

* AND {!tag=guid}guid:*
* AND guid:(*)
* AND guid:*
* && {!tag=guid}guid:*
* && guid:(*)
* && guid:*
* {!tag=guid}guid:*
* guid:(*)
* guid:*
{!tag=guid}guid:(*)
{!tag=guid}guid:*
guid:(*)
guid:*

Почему первые три не работают? Это ошибка в парсере запросов?

РЕДАКТИРОВАТЬ: я обнаружил странное поведение также с пробелами:

Это работает:

* AND {!tag=guid}guid:"a"

Это не работает:

* AND {!tag=guid}guid:"a "

1 ответ

Теги FilterQueries просто особый вид LocalParameter используется в качестве точки отсчета для огранки в ГУМЗЕ.

Обратите внимание, что LocalParameters специфичны для SOLR и не анализируются каким-либо осмысленным образом с LuceneQueryParser.

Если вас интересует общий синтаксис LocalParameter, вы можете проверить:

https://cwiki.apache.org/confluence/display/solr/Local+Parameters+in+Queries

Согласно этому документу

Локальные параметры - это аргументы в запросе Solr, специфичные для параметра запроса.

а также

Основной синтаксис локальных параметров:

Чтобы указать локальный параметр, вставьте следующее перед изменяемым аргументом:

  • Начинается с {!
  • Вставьте любое количество пар ключ = значение, разделенных пробелом
  • Завершить} и сразу же следовать с аргументом запроса

Вы можете указать только один префикс локальных параметров для каждого аргумента.

Поэтому вам не следует добавлять префикс Local Parameters к каким-либо частям запроса, как вы. Если вам действительно нужно использовать несколько локальных параметров, рассмотрите возможность разделения большого FilterQuery на несколько меньших с помощью CNF


Дополнительный полезный ресурс: https://github.com/apache/lucene-solr/blob/master/solr/core/src/java/org/apache/solr/search/QParser.java

Другие вопросы по тегам