Comment obtenir une liste de tous les jetons de l'index Lucene 8.6.1?

Nov 20 2020

J'ai regardé comment obtenir une liste de tous les jetons de l'index Solr / Lucene? mais Lucene 8.6.1 ne semble pas offrir IndexReader.terms(). At-il été déplacé ou remplacé? Y a-t-il un moyen plus simple que cette réponse ?

Réponses

2 andrewjames Nov 20 2020 at 09:03

Un peu d'histoire

Vous avez demandé: Je me demande simplement si IndexReader.terms()a déménagé ou a été remplacé par une alternative.

La méthode Lucene v3 a IndexReader.terms()été déplacée AtomicReaderdans Lucene v4. Cela a été documenté dans les notes de mise à jour v4 alpha .

(Gardez à l'esprit que Lucene v4 a été publié en 2012.)

La méthode de la AtomicReaderv4 prend un nom de champ .

Comme l'indiquent les notes de version v4:

Une grande différence est que le champ et les termes sont désormais énumérés séparément: un TermsEnum fournit un BytesRef (encapsule un octet []) par terme dans un seul champ, pas un terme.

L'élément clé est "par terme dans un seul champ" . Ainsi, à partir de ce moment, il n'y avait plus un seul appel d'API pour récupérer tous les termes d'un index.

Cette approche s'est poursuivie dans les versions ultérieures - sauf que les classes AtomicReaderet AtomicReaderContextont été renommées en LeafReaderet LeafReaderContextdans Lucene v 5.0.0. Voir Lucene-5569 .

Versions récentes

Cela nous laisse la possibilité d'accéder à des listes de termes - mais uniquement par champ:

Le code suivant est basé sur la dernière version de Lucene (8.7.0), mais devrait également être vrai pour la version que vous mentionnez (8.6.1) - avec l'exemple utilisant Java:

private void getTokensForField(IndexReader reader, String fieldName) throws IOException {
    List<LeafReaderContext> list = reader.leaves();

    for (LeafReaderContext lrc : list) {
        Terms terms = lrc.reader().terms(fieldName);
        if (terms != null) {
            TermsEnum termsEnum = terms.iterator();

            BytesRef term;
            while ((term = termsEnum.next()) != null) {
                System.out.println(term.utf8ToString());
            }
        }
    }
}

L'exemple ci-dessus suppose un index comme suit:

private static final String INDEX_PATH = "/path/to/index/directory";
...
IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(INDEX_PATH)));

Si vous devez énumérer les noms de champ, le code de cette question peut fournir un point de départ.

Note finale

Je suppose que vous pouvez également accéder aux termes sur une base par document , plutôt que par champ , comme mentionné dans les commentaires. Je n'ai pas essayé ça.