Ошибка WildcardQuery в Solr

Я использую solr для поиска документов и при попытке поиска документов с помощью этого запроса "id:*", я получаю это исключение синтаксиса запроса, говоря, что он не может разобрать запрос с помощью * или? как первый символ.

HTTP Status 400 - org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery

type Status report

message org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery

description The request sent by the client was syntactically incorrect (org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery).

Есть ли какой-либо патч, чтобы заставить это работать только с *? Или это очень дорого для выполнения такого запроса?

Ответ 1

Если вы хотите все документы, выполните запрос на *: *

Если вы хотите, чтобы все документы с определенным полем (например, id) пытались использовать id: [* TO *]

Ответ 2

Lucene не позволяет запускать WildcardQueries со звездочкой по умолчанию, потому что это невероятно дорогостоящие запросы и будет очень, очень и очень медленно на больших индексах.

Если вы используете Lucene QueryParser, вызовите setAllowLeadingWildcard (true), чтобы включить его.

Если вы хотите, чтобы все документы с определенным полем были установлены, вам гораздо лучше запросить или перейти по индексу программно, чем с помощью QueryParser. Вы действительно должны использовать QueryParser для анализа пользовательского ввода.

Ответ 3

id:[a* TO z*] id:[0* TO 9*] etc.

Я только что сделал это в lukeall по моему индексу, и он сработал, поэтому он должен работать в Solr, который использует стандартный синтаксический анализатор запросов. Я фактически не использую Solr.

В базе Lucene есть прекрасная причина, почему вы никогда не запрашиваете для каждого документа, потому что, чтобы запросить документ, вы должны использовать new indexReader("DirectoryName") и применить к нему запрос. Поэтому вы можете полностью отказаться от применения запроса к нему и использовать методы indexReader numDocs(), чтобы получить подсчет всех документов, и document(int n) для извлечения любого из документов.

Ответ 4

Если вы просто пытаетесь получить все документы, Solr поддерживает запрос *: *. Это единственный раз, когда я знаю, что Solr позволит вам начать запрос с помощью *. Я уверен, что вы, вероятно, видели это как запрос по умолчанию на странице администрирования Solr.

Если вы пытаетесь выполнить более конкретный запрос с помощью * в качестве первого символа, например say id: * 456, то один из лучших способов, который я видел, - это дважды проиндексировать это поле. Как обычно (имя поля: id) и один раз со всеми обратными символами (имя поля: reverse_id). Тогда вы могли бы по существу выполнить идентификатор запроса: 456, отправив вместо этого запрос reverse_id: 654. Надеюсь, что это имеет смысл.

Вы также можете найти список рассылки группы пользователей Solr в http://www.mail-archive.com/[email protected]/, где такие вопросы возникают довольно часто.

Ответ 5

Следующая проблема Solr - это запрос, чтобы иметь возможность настроить парсер запросов lucene по умолчанию. https://issues.apache.org/jira/browse/SOLR-218

В этом выпуске вы можете найти следующее описание, как "patch" Solr. Эта модификация позволит вам запускать запросы с помощью *.

Джонас Салк: Я в основном обновил только один файл Java: SolrQueryParser.java.

public SolrQueryParser(IndexSchema schema, String defaultField) { 
    ... 
    setAllowLeadingWildcard(true); 
    setLowercaseExpandedTerms(true); 
    ... 
}

 ...

public SolrQueryParser(QParser parser, String defaultField, Analyzer analyzer) {
    ... 
    setAllowLeadingWildcard(true); 
    setLowercaseExpandedTerms(true);
    ... 
}

Я не уверен, что требуется setLowercaseExpandedTerms...

Ответ 6

Я предполагаю с id: * вы просто пытаетесь сопоставить все документы, верно?

Я никогда не использовал solr раньше, но в моем опыте Lucene при проглатывании данных мы добавили скрытое поле в каждый документ, а затем, когда нам нужно вернуть каждую запись, мы выполняем поиск строковой константы в этом поле, которое одинаково для каждой записи.

Если вы не можете добавить такое поле в свою ситуацию, вы можете использовать RegexQuery с регулярным выражением, которое соответствовало бы всем, что можно было бы найти в поле id.

Изменить: на самом деле отвечает на вопрос. Я никогда не слышал о патче, чтобы заставить его работать, но я был бы удивлен, если бы его даже можно было сделать достаточно хорошо. См. этот вопрос по той причине, что неподдерживаемый префиксQuery может вызвать проблему.

Ответ 7

На самом деле, я использовал обходной путь для этого. Я добавляю символ к id, например: A1, A2 и т.д.

С такими значениями в поле можно выполнить поиск с помощью запроса id:A*

Но хотелось бы найти, существует ли истинное решение.