Saya telah melihat cara mendapatkan daftar semua token dari indeks Solr/Lucene? tetapi Lucene 8.6.1 tampaknya tidak menawarkan IndexReader.terms(). Apakah sudah dipindahkan atau diganti? Apakah ada cara yang lebih mudah daripada jawaban ini?

2
PSK 20 November 2020, 01:38

1 menjawab

Jawaban Terbaik

Beberapa Sejarah

Anda bertanya: Saya hanya ingin tahu apakah IndexReader.terms() telah dipindahkan atau diganti dengan alternatif.

Metode Lucene v3 IndexReader.terms() dipindahkan ke AtomicReader di Lucene v4. Ini didokumentasikan dalam catatan rilis alfa v4< /a>.

(Ingatlah bahwa Lucene v4 dirilis pada tahun 2012.)

Metode di AtomicReader di v4 menggunakan nama bidang.

Sebagai catatan rilis v4 menyatakan:

Satu perbedaan besar adalah bahwa bidang dan istilah sekarang disebutkan secara terpisah: TermsEnum menyediakan BytesRef (membungkus byte[]) per istilah dalam satu bidang, bukan Istilah.

Bagian kuncinya adalah "per istilah dalam satu bidang". Jadi sejak saat itu tidak ada lagi panggilan API tunggal untuk mengambil semua istilah dari indeks.

Pendekatan ini telah dibawa ke rilis selanjutnya - kecuali bahwa kelas AtomicReader dan AtomicReaderContext diubah namanya menjadi LeafReader dan LeafReaderContext di Lucene v 5.0.0. Lihat Lucene-5569.

Rilis Terbaru

Itu membuat kami memiliki kemampuan untuk mengakses daftar istilah - tetapi hanya berdasarkan per bidang:

Kode berikut didasarkan pada rilis terbaru Lucene (8.7.0), tetapi juga berlaku untuk versi yang Anda sebutkan (8.6.1) - dengan contoh menggunakan 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());
            }
        }
    }
}

Contoh di atas mengasumsikan indeks sebagai berikut:

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

Jika Anda perlu menghitung nama bidang, kode di pertanyaan ini mungkin memberikan titik awal.

Catatan Akhir

Saya kira Anda juga dapat mengakses persyaratan dengan basis per dokumen, alih-alih basis per bidang, seperti yang disebutkan dalam komentar. Saya belum mencoba ini.

2
andrewjames 20 November 2020, 02:03