Con Lucene:Perché ricevo l'errore Troppe clausole se eseguo una ricerca del prefisso?

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

  •  08-06-2019
  •  | 
  •  

Domanda

Ho un'app che esegue ricerche di prefissi da un po'.Recentemente la dimensione dell'indice è stata aumentata e si è scoperto che alcuni prefissi erano troppo numerosi perché lucene potesse gestirli.Continuava a lanciarmi un Troppe clausole errore, il che è stato molto frustrante poiché continuavo a guardare i miei JAR e a confermare che nessuno dei codici inclusi utilizzava effettivamente una query booleana.

Perché non genera qualcosa come un'eccezione Too Many Hits?E perché l'aumento del numero intero delle clausole massime statiche della query booleana fa effettivamente scomparire questo errore, quando sto sicuramente utilizzando solo una query con prefisso?C'è qualcosa di fondamentale nel modo in cui vengono eseguite le query che non capisco;è che diventano segretamente query booleane?

È stato utile?

Soluzione

Ne ho già parlato prima.Ha a che fare con il fatto che lucene, sotto le coperte, trasforma molte (tutte?) cose in query booleane quando chiami Query.rewrite()

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

Altri suggerimenti

La pagina di riferimento API di TooManyClauses mostra che PrefixQuery, FuzzyQuery, WildcardQuery e RangeQuery vengono espansi in questo modo (in BooleanQuery).Poiché è nel riferimento API, dovrebbe essere un comportamento su cui gli utenti possono fare affidamento.Lucene non pone limiti arbitrari al numero di risultati (a parte l'ID del documento che è un int), quindi un'eccezione "troppi risultati" potrebbe non avere senso.Forse PrefixQuery.rewrite(IndexReader) dovrebbe rilevare TooManyClauses e lanciare un'eccezione "troppi prefissi", ma in questo momento non si comporta in questo modo.

A proposito, un altro modo per cercare per prefisso è utilizzare PrefixFilter.Filtra la tua query con esso o avvolgi il filtro con ConstantScoreQuery.

Quando si esegue una query sul prefisso, Lucene cerca tutti i termini nel suo "dizionario" che corrispondono alla query.Se corrispondono più di 1024 (per impostazione predefinita), viene lanciata l'eccezione TooManyClauses.

È possibile chiamare BooleanQuery.setMaxClauseCount per aumentare il numero massimo di clausole consentite per BooleanQuery.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top