Avec Lucene:Pourquoi dois-je obtenir un Trop grand Nombre de Clauses d'erreur si je fais une recherche par préfixe?

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

  •  08-06-2019
  •  | 
  •  

Question

J'ai eu une application faisant préfixe des recherches pendant un certain temps.Récemment, la taille de l'index a été augmenté et il s'est avéré que certains préfixes étaient trop sacrément nombreux pour lucene à manipuler.Il l'a gardé en me jetant un Trop De Clauses erreur, ce qui est très frustrant car je n'arrêtais pas de regarder mes Pots et confirmant qu'aucun de code en fait utilisé une requête booléenne.

Pourquoi ne pas jeter quelque chose comme un Trop grand Nombre de Hits exception?Et pourquoi ne l'augmentation de la requête booléenne statique max clauses entier réellement faire cette erreur de s'en aller, quand je suis certainement seulement à l'aide d'un préfixe de la requête?Est-il quelque chose de fondamental à la façon dont les requêtes sont exécutées que je ne suis pas la compréhension;est-ce qu'ils ont secrètement devenir des requêtes Booléennes?

Était-ce utile?

La solution

J'ai touché à cette avant.Il a à voir avec le fait que lucene, sous les couvertures, se transforme beaucoup (tous?) les choses dans des requêtes booléennes lorsque vous appelez la Requête.réécriture()

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

Autres conseils

La référence de l'API de la page de TooManyClauses montre que PrefixQuery, FuzzyQuery, WildcardQuery, et RangeQuery sont développées de cette façon (en BooleanQuery).Depuis qu'il est dans la référence de l'API, il devrait être un comportement que les utilisateurs peuvent compter sur.Lucene ne placez pas de limites arbitraires sur le nombre de hits (autre qu'un document ID de type int), donc un "trop grand nombre de hits" exception ne pourrait pas faire de sens.Peut-Être PrefixQuery.réécriture(IndexReader) doivent attraper le TooManyClauses et lancer un "trop grand nombre de préfixes" l'exception", mais pour l'instant il ne se comporte pas de cette façon.

Par la voie, une autre façon de faire une recherche par préfixe est d'utiliser PrefixFilter.Filtrer votre recherche avec ou envelopper le filtre avec un ConstantScoreQuery.

Lors de l'exécution d'un préfixe requête Lucene recherche tous les termes dans son "dictionnaire" qui correspondent à la requête.Si plus de 1024 (par défaut) du match, le TooManyClauses-Exception est levée.

Vous pouvez appeler BooleanQuery.setMaxClauseCount d'augmenter le nombre maximum de clauses autorisées par BooleanQuery.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top