Сведения о вопросе

profi

03:48, 18th August, 2020

Теги

search   lucene   solr    

Ошибка WildcardQuery в Solr

Просмотров: 511   Ответов: 7

Я использую 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).

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



  Сведения об ответе

nYU

06:18, 22nd August, 2020

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

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


  Сведения об ответе

#hash

15:01, 20th August, 2020

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

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

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


  Сведения об ответе

KOMP

04:50, 2nd August, 2020

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

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

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


  Сведения об ответе

dump

00:29, 15th August, 2020

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

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

Вы также можете найти список рассылки группы пользователей Solr по адресу http://www.mail-archive.com/solr-user@lucene.apache.org/ где такие вопросы возникают довольно часто.


  Сведения об ответе

darknet

03:04, 28th August, 2020

Следующая проблема 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...


  Сведения об ответе

KOMP

20:29, 24th August, 2020

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

При наличии таких значений в поле возможен поиск с помощью запроса id:A*

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


  Сведения об ответе

appple

01:24, 27th August, 2020

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

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться