Lucene как вывести результат поиска вместе с позицией

Я нахожу фразу "Kite World" с отступом между этими словами 1. Ищу в строке "Kite good world." . При проверке я вижу, что мы находим нашу фразу в строке, в переменной results totalHits = 1, и поэтому мы заходим в цикл:

for ( ScoreDoc scoreDoc: results.scoreDocs ) {...

Внутри него я делаю вывод всех term и их позиции. Как можно сделать вывод именно найденных слов, чтобы не перебирать все слова? Может есть какое-то еще решение, подскажите пожалуйста.

Весь код:

    Directory directory = new RAMDirectory();
    IndexWriterConfig indexWriterConfig = new IndexWriterConfig(new StandardAnalyzer());
    IndexWriter writer = new IndexWriter(directory, indexWriterConfig);

    Document doc = new Document();
    // Field.Store.NO, Field.Index.ANALYZED, Field.TermVector.YES
    FieldType type = new FieldType();
    type.setStoreTermVectors(true);
    type.setStoreTermVectorPositions(true);
    type.setStoreTermVectorOffsets(true);
    type.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
    Field fieldStore = new Field("tags", "Kite good world.", type);
    doc.add(fieldStore);
    writer.addDocument(doc);
    writer.close();
    
    DirectoryReader reader = DirectoryReader.open(directory);
    IndexSearcher searcher = new IndexSearcher(reader);
   
    //Поиск по словосочетанию с учетом отступа
    QueryParser queryParser = new QueryParser("tags", new StandardAnalyzer());
    Query query = queryParser.parse("\"Kite World\"~1");
    TopDocs results = searcher.search(query, 1);
    
    for ( ScoreDoc scoreDoc: results.scoreDocs ) {
        Fields termVs = reader.getTermVectors(scoreDoc.doc);
        Terms f = termVs.terms("tags");
        TermsEnum te = f.iterator();
        PostingsEnum docsAndPosEnum = null;
        BytesRef bytesRef;
        while ( (bytesRef = te.next()) != null ) {
            docsAndPosEnum = te.postings(docsAndPosEnum, PostingsEnum.ALL);
            // for each term (iterator next) in this field (field)
            // iterate over the docs (should only be one)
            int nextDoc = docsAndPosEnum.nextDoc();
            assert nextDoc != DocIdSetIterator.NO_MORE_DOCS;
            final int fr = docsAndPosEnum.freq();
            final int p = docsAndPosEnum.nextPosition();
            final int o = docsAndPosEnum.startOffset();
            System.out.println("Word: " + bytesRef.utf8ToString());
            System.out.println("Position: "+ p + ", startOffset: " + o + " length: " + bytesRef.length + " Freg: " + fr);
        
            if(fr > 1){
                for(int iter = 1; iter <= fr-1; iter++) {
                    System.out.println("Possition: "+ docsAndPosEnum.nextPosition());
                }
                
                //break;  //Чтобы не переходить на след. слова из текста
            }
        }
    }


Ответы (0 шт):