Странное поведение парсера запросов 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