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 слово)? Есть ли еще какой-то другой подход? Заранее спасибо.