WildcardQuery ошибка в Solr - PullRequest
       28

WildcardQuery ошибка в Solr

10 голосов
/ 19 августа 2008

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

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

Ответы [ 7 ]

14 голосов
/ 16 сентября 2008

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

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

6 голосов
/ 22 августа 2008

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

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

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

5 голосов
/ 23 августа 2008
id:[a* TO z*] id:[0* TO 9*] etc.

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

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

4 голосов
/ 19 сентября 2008

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

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

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

2 голосов
/ 01 августа 2011

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

1 голос
/ 20 августа 2008

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

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

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

1 голос
/ 19 августа 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...