С Lucene: Почему я получаю ошибку Too Many Clauses, если я делаю поиск по префиксу?

У меня было приложение, выполняющее поиск префикса некоторое время. Недавно размер индекса был увеличен, и оказалось, что некоторые префиксы были слишком чертовски многочисленны для того, чтобы обрабатывать их. Он продолжал выдавать мне ошибку « Too Many Clauses» , которая очень расстраивала, так как я продолжал смотреть на свои JAR-файлы и подтверждал, что ни один из включенного кода на самом деле не использовал логический запрос.

Почему он не выбрасывает что-то вроде исключения Too Many Hits? И почему увеличение целочисленного значения статического max в булевых запросах фактически устраняет эту ошибку, когда я определенно использую только префиксный запрос? Есть ли что-то фундаментальное в том, как выполняются запросы, которые я не понимаю; это то, что они тайно становятся булевыми запросами?

12.08.2008 06:04:48
3 ОТВЕТА
РЕШЕНИЕ

Я ударил это раньше. Это связано с тем, что lucene под прикрытием превращает многие (все?) Вещи в логические запросы, когда вы вызываете Query.rewrite ()

От: http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/search/Query.html#rewrite(org.apache.lucene.index.IndexReader)

public Query rewrite(IndexReader reader)
              throws IOException

    Expert: called to re-write queries into primitive queries.
            For example, a PrefixQuery will be rewritten into a
            BooleanQuery that consists of TermQuerys.

    Throws:
        IOException
5
12.08.2008 17:58:08
И это Query.rewrite()преобразование всегда происходит до того, как запрос действительно выполняется? (Казалось бы разумным, что запрос должен быть разбит на примитивные запросы перед выполнением.)
KajMagnus 29.07.2013 05:17:35

При выполнении запроса префикса Lucene ищет в своем «словаре» все термины, которые соответствуют запросу. Если более 1024 (по умолчанию) совпадают, генерируется исключение TooManyClauses-Exception.

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

0
15.09.2008 20:07:19
Это имеет смысл, но проблема для меня заключалась в том, что у меня не было возможности узнать, что PrefixQuery фактически стал BooleanQuery.
dlamblin 22.09.2008 20:50:54

Справочная страница API TooManyClauses показывает, что PrefixQuery, FuzzyQuery, WildcardQuery и RangeQuery расширены таким образом (в BooleanQuery). Так как он есть в справочнике API, это должно быть поведение, на которое пользователи могут положиться. Lucene не устанавливает произвольных ограничений на количество обращений (кроме идентификатора документа, являющегося целым числом), поэтому исключение «слишком много обращений» может не иметь смысла. Возможно, PrefixQuery.rewrite (IndexReader) должен перехватить TooManyClauses и выдать исключение «слишком много префиксов», но сейчас это не так.

Кстати, другой способ поиска по префиксу - использовать PrefixFilter. Либо отфильтруйте запрос, либо оберните фильтр с помощью ConstantScoreQuery.

3
29.09.2008 20:44:09
Есть PrefixFilterтакже расширены в логические разделы? (Или это как-то реализовано по-другому?)
KajMagnus 29.07.2013 05:52:54