Lucene как получить позиции слов при нахождении запроса в queryParser?

У меня есть такой текст:

Word[0]: Word0
Word[1]: Word1
Word[2]: War
Word[3]: Word3
Word[4]: Force
Word[5]: Word5
Word[6]: Word6

И я использую такой запрос, чтобы найти "War Force" с отступом между ними 1 слово:

        QueryParser queryParser = new QueryParser("tags", new StandardAnalyzer());
        Query query = queryParser.parse("\"War Force\"~1");
        TopDocs results = searcher.search(query, 1);

После этого я вижу, что запрос был найден, но в каких именно позициях было это, мне не удается найти. Я могу попробовать сделать так:

for (ScoreDoc scoreDoc : results.scoreDocs) {

            Fields termVs = reader.getTermVectors(scoreDoc.doc);
            Terms f = termVs.terms("tags");

            String searchTerm = "War".toLowerCase();
            BytesRef ref = new BytesRef(searchTerm);

            TermsEnum te = f.iterator();
            PostingsEnum docsAndPosEnum = null;
            if (te.seekExact(ref)) {
                
                docsAndPosEnum = te.postings(docsAndPosEnum, PostingsEnum.ALL);
                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: " + ref.utf8ToString());
                System.out.println("Position: " + p + ", startOffset: " + o + " length: " + ref.length + " Freg: " + fr);
                if (fr > 1) {
                    for (int iter = 1; iter <= fr - 1; iter++) {
                        System.out.println("Possition: " + docsAndPosEnum.nextPosition());
                    }
                }
            }

            System.out.println("Finish");
        }

Попробовать получить все позиции конкретного одного первого слова, а потом также и все позиции второго слова. Но это может быть долго, если у меня в запросе не 2 слова, а 3 или 4,5 и у каждого по 400 позиций. Мне видится такой подход долгим, хотя я могу ошибаться.


Подскажите есть ли способ сразу найти все позиции, при которых был найден запрос? Чтобы сразу выдавались позиции совпадения условия в query, например [2] и [4]. Или надо вручную (как в коде выше ) находить отдельно все позиции первого слова, а потом вручную искать все позиции второго слова и сравнивать их по условию (отступ 1 слово)? Есть ли еще какой-то другой подход? Заранее спасибо.


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