У меня было приложение, выполняющее поиск префикса некоторое время. Недавно размер индекса был увеличен, и оказалось, что некоторые префиксы были слишком чертовски многочисленны для того, чтобы обрабатывать их. Он продолжал выдавать мне ошибку « Too Many Clauses» , которая очень расстраивала, так как я продолжал смотреть на свои JAR-файлы и подтверждал, что ни один из включенного кода на самом деле не использовал логический запрос.
Почему он не выбрасывает что-то вроде исключения Too Many Hits? И почему увеличение целочисленного значения статического max в булевых запросах фактически устраняет эту ошибку, когда я определенно использую только префиксный запрос? Есть ли что-то фундаментальное в том, как выполняются запросы, которые я не понимаю; это то, что они тайно становятся булевыми запросами?
Я ударил это раньше. Это связано с тем, что lucene под прикрытием превращает многие (все?) Вещи в логические запросы, когда вы вызываете Query.rewrite ()
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
При выполнении запроса префикса Lucene ищет в своем «словаре» все термины, которые соответствуют запросу. Если более 1024 (по умолчанию) совпадают, генерируется исключение TooManyClauses-Exception.
Вы можете вызвать BooleanQuery.setMaxClauseCount, чтобы увеличить максимальное количество предложений, разрешенных для BooleanQuery.
Справочная страница API TooManyClauses показывает, что PrefixQuery, FuzzyQuery, WildcardQuery и RangeQuery расширены таким образом (в BooleanQuery). Так как он есть в справочнике API, это должно быть поведение, на которое пользователи могут положиться. Lucene не устанавливает произвольных ограничений на количество обращений (кроме идентификатора документа, являющегося целым числом), поэтому исключение «слишком много обращений» может не иметь смысла. Возможно, PrefixQuery.rewrite (IndexReader) должен перехватить TooManyClauses и выдать исключение «слишком много префиксов», но сейчас это не так.
Кстати, другой способ поиска по префиксу - использовать PrefixFilter. Либо отфильтруйте запрос, либо оберните фильтр с помощью ConstantScoreQuery.
PrefixFilter
также расширены в логические разделы? (Или это как-то реализовано по-другому?)
Query.rewrite()
преобразование всегда происходит до того, как запрос действительно выполняется? (Казалось бы разумным, что запрос должен быть разбит на примитивные запросы перед выполнением.)