2008-08-19 6 views
10

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

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: * вы просто пытаетесь сопоставить все документы, верно?

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

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

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

1

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

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

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

6

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

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

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

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

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

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

14

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

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

4

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

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

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

2

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

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

Jonas Salk: Я в основном обновил только один файл 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 ...

 Смежные вопросы

  • Нет связанных вопросов^_^