В Lucene я использую SnowballAnalyzer для индексации и поиска.
Когда я строю индекс, я делаю запросы к своему индексу.Например, я делаю запрос «специализированный» для поля «тело».IndexSearcher возвращает документы, содержащие «специализированные, специализированные и т. Д.»из-за стебля, сделанного SnowballAnalyzer.
Теперь, имея лучшие документы, я хочу получить текстовый фрагмент из поля тела.Этот фрагмент должен содержать основанную на словах версию слова запроса.
Например, один из возвращенных документов имеет поле body: «К сожалению, в некоторых штатах слепые люди имеют доступ только к общим реабилитационным агентствам, которые обслуживают людей с различнымиинвалидности. В этих случаях специализированные услуги для людей с нарушениями зрения не всегда доступны ».Затем я хотел бы получить часть «В этих случаях специализированные услуги для визуально» в качестве фрагмента.Кроме того, я хочу получить термины из этого фрагмента.Код, который будет это делать, но с одним знаком «?»персонаж, где у меня есть вопрос:
Как я хочу это сделать IndexReader ir = IndexReader.open(fsDir);<br>
TermPositionVector tv = (TermPositionVector)ir.getTermFreqVector(hits.scoreDocs[i].doc, "body");
?- здесь: запрос - запрос должен быть термином.Таким образом, если реальный запрос был «специализированным», то запрос должен быть специализированным, как обычно делает анализатор снежного кома.Как получить анализируемый анализатором термин для отдельного слова или фразы, поскольку запрос может содержать фразу: «специализированные машины».
int idx = tv.indexOf(query);<br>
int [] idxs = tv.getTermPositions(idx);<br>
for(String t : tv.getTerms()){<br>
int iidx = tv.indexOf(t);<br>
int [] iidxs = tv.getTermPositions(iidx);<br>
for(int ni : idxs){<br>
tmpValue = 0.0f;<br>
for(int nni : iidxs){<br>
if(Math.abs(nni-ni)<= Settings.termWindowSize){
edit
Я нашел способ получить основанный термин:
Query q = queryParser.parse("some text to be parsed");
String parsedQuery = q.toString();
Существует метод для объекта Query toString (String fieldName) ;