Com Luceno:Por que recebo um erro Too Many Clauses se fizer uma pesquisa de prefixo?

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

  •  08-06-2019
  •  | 
  •  

Pergunta

Já faz algum tempo que tenho um aplicativo que faz pesquisas de prefixo.Recentemente, o tamanho do índice foi aumentado e descobriu-se que alguns prefixos eram numerosos demais para serem manipulados pelo lucene.Ele continuou me jogando um Muitas cláusulas erro, o que foi muito frustrante, pois continuei olhando meus JARs e confirmando que nenhum código incluído realmente usava uma consulta booleana.

Por que isso não lança algo como uma exceção Too Many Hits?E por que aumentar o número inteiro de cláusulas estáticas máximas da consulta booleana realmente faz com que esse erro desapareça, quando definitivamente estou usando apenas uma consulta de prefixo?Existe algo fundamental em como as consultas são executadas que não estou entendendo;será que eles secretamente se tornam consultas booleanas?

Foi útil?

Solução

Eu já acertei isso antes.Tem a ver com o fato de que lucene, nos bastidores, transforma muitas (todas?) coisas em consultas booleanas quando você chama Query.rewrite()

De: 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

Outras dicas

A página de referência da API de TooManyClauses mostra que PrefixQuery, FuzzyQuery, WildcardQuery e RangeQuery são expandidos desta forma (em BooleanQuery).Como está na referência da API, deve ser um comportamento no qual os usuários possam confiar.Lucene não impõe limites arbitrários ao número de ocorrências (além de um ID de documento ser um int), portanto, uma exceção de "muitas ocorrências" pode não fazer sentido.Talvez PrefixQuery.rewrite(IndexReader) deva capturar TooManyClauses e lançar uma exceção "muitos prefixos", mas no momento ele não se comporta dessa maneira.

A propósito, outra forma de pesquisar por prefixo é usar PrefixFilter.Filtre sua consulta com ele ou envolva o filtro com um ConstantScoreQuery.

Ao executar uma consulta de prefixo, o Lucene procura todos os termos em seu “dicionário” que correspondam à consulta.Se mais de 1.024 (por padrão) corresponderem, a exceção TooManyClauses será lançada.

Você pode chamar BooleanQuery.setMaxClauseCount para aumentar o número máximo de cláusulas permitidas por BooleanQuery.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top