Lucene: доступ к полезной нагрузке результатов запроса

Когда я ищу запрос в Lucene, в результате я получаю список документов. Но как я могу получить хиты в этих документах? Я хочу получить доступ к полезной нагрузке тех слов, которые были найдены по запросу.

Если ваш запрос содержит только один термин, вы можете просто использовать TermPositions для доступа к полезной нагрузке этого термина. Но если у вас есть более сложный запрос с поиском по фразе, поиском по близости, ... вы не можете просто искать отдельные термины в TermPositions.

Я хотел бы получить List<Token>, TokenStream или что-то подобное, содержащее все Токены, которые были найдены по запросу. Затем я могу перебрать список и получить доступ к полезной нагрузке каждого токена.


person ethan123    schedule 02.05.2012    source источник


Ответы (2)


Я решил свою проблему с помощью SpanQueries. Почти каждый запрос может быть выражен как SpanQuery. SpanQuery предоставляет доступ к промежуткам, в которых находится попадание в документе. Поскольку обычный QueryParser не создает SpanQueries, мне пришлось написать свой собственный синтаксический анализатор, который создает только SpanQueries. Другим вариантом может быть SurroundParser от Lucene-Contrib, который также создает SpanQueries.

person ethan123    schedule 21.05.2012

Я думаю, вы захотите начать с просмотра Lucene Highlighter, так как он выделяет совпадающие термины в документе.

person Mark Leighton Fisher    schedule 03.05.2012
comment
Lucene Highlighter делает довольно хорошую работу, но у меня все еще есть проблемы с доступом к полезной нагрузке. Яm trying to write my own formatter. The Highlighter is passing a TokenGroup to the Formatter. When I call the getPayload() Function of the Tokens in the TokenGroup I always receive null. But when I access the payloads over TermPositions itс работаю. Почему это не работает для токенов? Весь TokenStream, который я использую для подсветки, не всегда имеет значение null. - person ethan123; 04.05.2012
comment
Я получаю TokenStream со следующим кодом: TokenStream tokenStream = TokenSources.getAnyTokenStream(searcher.getIndexReader(), id,contents, Analyzer); Вы должны сделать это по-другому? - person ethan123; 04.05.2012