Jak uzyskać listę wszystkich tokenów z indeksu Lucene 8.6.1?

Nov 20 2020

Przyjrzałem się, jak uzyskać listę wszystkich tokenów z indeksu Solr / Lucene? ale Lucene 8.6.1 nie wydaje się oferować IndexReader.terms(). Czy został przeniesiony lub wymieniony? Czy jest łatwiejszy sposób niż ta odpowiedź ?

Odpowiedzi

2 andrewjames Nov 20 2020 at 09:03

Trochę historii

Zapytałeś: Zastanawiam się tylko, czy IndexReader.terms()został przeniesiony lub zastąpiony przez alternatywę.

Metoda Lucene v3 IndexReader.terms()została przeniesiona do AtomicReaderLucene v4. Zostało to udokumentowane w informacjach o wersji alfa v4 .

(Pamiętaj, że Lucene v4 został wydany w 2012 roku).

Metoda w AtomicReaderwersji 4 przyjmuje nazwę pola .

Zgodnie z informacjami o wersji v4:

Jedną dużą różnicą jest to, że pole i terminy są teraz wyliczane osobno: TermsEnum dostarcza BytesRef (zawija bajt []) na termin w jednym polu, a nie Term.

Kluczową częścią jest „na termin w jednym polu” . Tak więc od tego momentu nie było już pojedynczego wywołania interfejsu API w celu pobrania wszystkich terminów z indeksu.

To podejście zostało zastosowane w późniejszych wydaniach - z tym wyjątkiem, że nazwy klas AtomicReaderi AtomicReaderContextzostały zmienione na LeafReaderiw LeafReaderContextLucene v 5.0.0. Zobacz Lucene-5569 .

Najnowsze wydania

To daje nam możliwość dostępu do list terminów - ale tylko na podstawie poszczególnych pól:

Poniższy kod jest oparty na najnowszej wersji Lucene (8.7.0), ale powinien również obowiązywać dla wersji, o której wspomniałeś (8.6.1) - na przykładzie wykorzystującym Javę:

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());
            }
        }
    }
}

W powyższym przykładzie przyjęto następujący indeks:

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

Jeśli chcesz wyliczyć nazwy pól, kod w tym pytaniu może stanowić punkt wyjścia.

Uwaga końcowa

Wydaje mi się, że można również uzyskać dostęp do warunków dla poszczególnych dokumentów , zamiast dla poszczególnych dziedzin , jak wspomniano w komentarzach. Nie próbowałem tego.