Я использую 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: * вы просто пытаетесь сопоставить все документы, верно?
Я никогда раньше не использовал solr, но в моем опыте Lucene, когда мы принимаем данные, мы добавляем скрытое поле в каждый документ, затем, когда нам нужно вернуть каждую запись, мы выполняем поиск строковой константы в этом поле, которое является то же самое для каждой записи.
Если вы не можете добавить подобное поле в вашей ситуации, вы можете использовать RegexQuery с регулярным выражением, которое будет соответствовать всему, что можно найти в поле id.
Изменить: на самом деле отвечая на вопрос. Я никогда не слышал о патче, чтобы заставить его работать, но я был бы удивлен, если бы его можно было заставить работать достаточно хорошо. Посмотрите этот вопрос, чтобы узнать причину, по которой неограниченные PrefixQuery могут вызвать проблемы.
На самом деле, я использовал обходной путь для этого. Я добавляю символ к идентификатору, например: A1, A2 и т. Д.
С такими значениями в поле можно искать с помощью запроса id:A*
Но хотелось бы узнать, существует ли настоящее решение.
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)
для получения любого из документов.
Если вы хотите все документы, сделайте запрос на *: *
Если вы хотите, чтобы все документы с определенным полем (например, id), попробуйте id: [* TO *]
Если вы просто пытаетесь получить все документы, Solr поддерживает запрос *: *. Это единственный раз, когда я знаю, что Solr позволит вам начать запрос с *. Я уверен, что вы, вероятно, видели это как запрос по умолчанию на странице администрирования Solr.
Если вы пытаетесь выполнить более конкретный запрос с * в качестве первого символа, например, скажем, id: * 456, то один из лучших способов, которые я видел, - дважды проиндексировать это поле. Один раз обычно (имя поля: идентификатор) и один раз со всеми символами в обратном порядке (имя поля: reverse_id). Тогда вы можете выполнить запрос id: 456, отправив запрос reverse_id: 654 . Надеюсь, что это имеет смысл.
Вы также можете выполнить поиск в списке рассылки группы пользователей Solr по адресу http://www.mail-archive.com/solr-user@lucene.apache.org/, где подобные вопросы возникают довольно часто.
Следующая проблема Solr - это запрос на возможность настройки анализатора запросов lucene по умолчанию. https://issues.apache.org/jira/browse/SOLR-218
В этом выпуске вы можете найти следующее описание, как «исправить» 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 ...