WildcardQuery ошибка в Solr

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

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

19.08.2008 10:59:17
7 ОТВЕТОВ

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

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

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

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

1
23.05.2017 11:46:11

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

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

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

1
20.08.2008 06:19:10

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

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

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

7
22.08.2008 18:19:22
id:[a* TO z*] id:[0* TO 9*] etc.

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

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

5
22.08.2008 21:33:14

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

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

14
19.09.2008 20:13:54

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

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

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

4
10.10.2008 20:58:33

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

2
1.08.2011 14:26:06