С Люсене:Почему я получаю сообщение об ошибке «Слишком много предложений» при выполнении поиска по префиксу?

StackOverflow https://stackoverflow.com/questions/8532

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Я уже сталкивался с этим раньше.Это связано с тем, что 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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top