С Lucene: Почему я получаю ошибку Too Many Clauses, если я делаю поиск по префиксу? - PullRequest
8 голосов
/ 12 августа 2008

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

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

Ответы [ 3 ]

5 голосов
/ 12 августа 2008

Я ударил это раньше. Это связано с тем, что 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
3 голосов
/ 30 сентября 2008

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

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

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

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

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

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