Как получить список сообщений для каждого термина в lucene index

Я читаю индекс Lucene и могу извлечь термины из индекса. Я хочу получить весь список сообщений для каждого термина в lucene index. Я использую lucene 7.4.0 jar. Каждый документ в этом индексе состоит из двух полей (1) text_es или text_fr или text_en (2) DocId. Ниже находится код.

public class LuceneTest {

public static void main(String[] args) {
    final String INDEX_DIRECTORY = "./index";
    Directory index;
        try {

            index = FSDirectory.open(Paths.get(INDEX_DIRECTORY));
            IndexReader indexReader = DirectoryReader.open(index);

            LeafReaderContext leafReaderContext_es = indexReader.leaves().get(0);
            LeafReaderContext leafReaderContext_fr = indexReader.leaves().get(1);
            LeafReaderContext leafReaderContext_en = indexReader.leaves().get(2);

            LinkedList<String> terms_es = new LinkedList<>();
            LinkedList<String> terms_en = new LinkedList<>();
            LinkedList<String> terms_fr = new LinkedList<>();

            LeafReader ir_es = leafReaderContext_es.reader();
            LeafReader ir_fr = leafReaderContext_fr.reader();
            LeafReader ir_en = leafReaderContext_en.reader();

            TermsEnum terms = ir_es.terms("text_es").iterator();
            BytesRef next = terms.next();
            while (next != null){
                terms_es.add(terms.term().utf8ToString());
                next = terms.next();
            }

            TermsEnum termsEnum_fr = ir_fr.terms("text_fr").iterator();
            BytesRef next_fr = termsEnum_fr.next();
            while (next_fr != null){
                terms_fr.add(termsEnum_fr.term().utf8ToString());
                next_fr = termsEnum_fr.next();
            }

            TermsEnum termsEnum_en = ir_en.terms("text_en").iterator();
            BytesRef next_en = termsEnum_en.next();
            while (next_en != null){
                terms_en.add(termsEnum_en.term().utf8ToString());
                next_en = termsEnum_en.next();
            }

            System.out.println("Espanish terms are as follows:");
            System.out.println(terms_es);

            System.out.println("French terms are as follows:");
            System.out.println(terms_fr);

            System.out.println("English terms are as follows:");
            System.out.println(terms_en);


        } catch (IOException e) {
            e.printStackTrace();
        }
}

Я просмотрел документацию lucene 7.4.0 и наткнулся на сообщения метода (термин термин), который возвращает PostingsEnum для указанного термина с помощью PostingsEnum.FREQS. Проблема в том, что этот метод принимает термин параметра класса Term, но я получаю TermsEnum. Как преобразовать это в класс Term, чтобы я мог использовать сообщения метода для получения соответствующего списка сообщений для каждого термина.

Спасибо.


person Siddharth Sinha    schedule 12.10.2018    source источник


Ответы (1)


Я использую lucene 8.2, вы можете попробовать код ниже:

    IndexReader indexReader = DirectoryReader.open(indexDir);
    Terms termVector = indexReader.getTermVector(0, "content");
    TermsEnum termIter = termVector.iterator();
    while (termIter.next() != null) {
        PostingsEnum postingsEnum = termIter.postings(null, PostingsEnum.ALL);
        while (postingsEnum.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
            int freq = postingsEnum.freq();
            System.out.printf("term: %s, freq: %d,", termIter.term().utf8ToString(), freq);
            while (freq > 0) {
                System.out.printf(" nextPosition: %d,", postingsEnum.nextPosition());
                System.out.printf(" startOffset: %d, endOffset: %d",
                        postingsEnum.startOffset(), postingsEnum.endOffset());
                freq--;
            }
            System.out.println();
        }
    }
person NiYanchun    schedule 25.09.2019