Con Lucene:¿Por qué aparece el error Demasiadas cláusulas si hago una búsqueda de prefijo?

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

  •  08-06-2019
  •  | 
  •  

Pregunta

Hace tiempo que tengo una aplicación que realiza búsquedas de prefijos.Recientemente, se aumentó el tamaño del índice y resultó que algunos prefijos eran demasiado numerosos para que lucene los manejara.Me seguía lanzando un Demasiadas cláusulas error, lo cual fue muy frustrante ya que seguí mirando mis JAR y confirmando que ninguno de los códigos incluidos en realidad usaba una consulta booleana.

¿Por qué no arroja algo así como una excepción de Demasiados Hits?¿Y por qué aumentar el número entero de cláusulas máximas estáticas de la consulta booleana realmente hace que este error desaparezca, cuando definitivamente solo estoy usando una consulta de prefijo?¿Hay algo fundamental en la forma en que se ejecutan las consultas que no entiendo?¿Será que secretamente se convierten en consultas booleanas?

¿Fue útil?

Solución

He tocado esto antes.Tiene que ver con el hecho de que lucene, bajo las sábanas, convierte muchas (¿todas?) cosas en consultas booleanas cuando llamas a 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

Otros consejos

La página de referencia de API de TooManyClauses muestra que PrefixQuery, FuzzyQuery, WildcardQuery y RangeQuery se expanden de esta manera (a BooleanQuery).Dado que está en la referencia de API, debería ser un comportamiento en el que los usuarios puedan confiar.Lucene no impone límites arbitrarios al número de visitas (aparte de que el ID del documento sea un int), por lo que una excepción de "demasiadas visitas" podría no tener sentido.Quizás PrefixQuery.rewrite(IndexReader) debería detectar TooManyClauses y generar una excepción de "demasiados prefijos", pero en este momento no se comporta de esa manera.

Por cierto, otra forma de buscar por prefijo es utilizar PrefixFilter.Filtre su consulta con él o envuelva el filtro con ConstantScoreQuery.

Al ejecutar una consulta de prefijo, Lucene busca todos los términos en su "diccionario" que coincidan con la consulta.Si coinciden más de 1024 (por defecto), se lanza la excepción TooManyClauses.

Puede llamar a BooleanQuery.setMaxClauseCount para aumentar el número máximo de cláusulas permitidas por BooleanQuery.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top