Ответ 1
Если вы хотите все документы, выполните запрос на *: *
Если вы хотите, чтобы все документы с определенным полем (например, id) пытались использовать id: [* TO *]
Я использую 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).
Есть ли какой-либо патч, чтобы заставить это работать только с *? Или это очень дорого для выполнения такого запроса?
Если вы хотите все документы, выполните запрос на *: *
Если вы хотите, чтобы все документы с определенным полем (например, id) пытались использовать id: [* TO *]
Lucene не позволяет запускать WildcardQueries со звездочкой по умолчанию, потому что это невероятно дорогостоящие запросы и будет очень, очень и очень медленно на больших индексах.
Если вы используете Lucene QueryParser, вызовите setAllowLeadingWildcard (true), чтобы включить его.
Если вы хотите, чтобы все документы с определенным полем были установлены, вам гораздо лучше запросить или перейти по индексу программно, чем с помощью QueryParser. Вы действительно должны использовать QueryParser для анализа пользовательского ввода.
id:[a* TO z*] id:[0* TO 9*] etc.
Я только что сделал это в lukeall по моему индексу, и он сработал, поэтому он должен работать в Solr, который использует стандартный синтаксический анализатор запросов. Я фактически не использую Solr.
В базе Lucene есть прекрасная причина, почему вы никогда не запрашиваете для каждого документа, потому что, чтобы запросить документ, вы должны использовать new indexReader("DirectoryName")
и применить к нему запрос. Поэтому вы можете полностью отказаться от применения запроса к нему и использовать методы indexReader
numDocs()
, чтобы получить подсчет всех документов, и document(int n)
для извлечения любого из документов.
Если вы просто пытаетесь получить все документы, Solr поддерживает запрос *: *. Это единственный раз, когда я знаю, что Solr позволит вам начать запрос с помощью *. Я уверен, что вы, вероятно, видели это как запрос по умолчанию на странице администрирования Solr.
Если вы пытаетесь выполнить более конкретный запрос с помощью * в качестве первого символа, например say id: * 456, то один из лучших способов, который я видел, - это дважды проиндексировать это поле. Как обычно (имя поля: id) и один раз со всеми обратными символами (имя поля: reverse_id). Тогда вы могли бы по существу выполнить идентификатор запроса: 456, отправив вместо этого запрос reverse_id: 654. Надеюсь, что это имеет смысл.
Вы также можете найти список рассылки группы пользователей Solr в http://www.mail-archive.com/[email protected]/, где такие вопросы возникают довольно часто.
Следующая проблема 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...
Я предполагаю с id: * вы просто пытаетесь сопоставить все документы, верно?
Я никогда не использовал solr раньше, но в моем опыте Lucene при проглатывании данных мы добавили скрытое поле в каждый документ, а затем, когда нам нужно вернуть каждую запись, мы выполняем поиск строковой константы в этом поле, которое одинаково для каждой записи.
Если вы не можете добавить такое поле в свою ситуацию, вы можете использовать RegexQuery с регулярным выражением, которое соответствовало бы всем, что можно было бы найти в поле id.
Изменить: на самом деле отвечает на вопрос. Я никогда не слышал о патче, чтобы заставить его работать, но я был бы удивлен, если бы его даже можно было сделать достаточно хорошо. См. этот вопрос по той причине, что неподдерживаемый префиксQuery может вызвать проблему.
На самом деле, я использовал обходной путь для этого. Я добавляю символ к id, например: A1, A2 и т.д.
С такими значениями в поле можно выполнить поиск с помощью запроса id:A*
Но хотелось бы найти, существует ли истинное решение.