Как вернуть термин запроса, который получил попадание в индекс - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь вернуть оригинальные термины, которые вызвали хиты в моем индексе Lucene.Например, строка «Мой поиск» выглядит так: «Быстрая коричневая лиса перепрыгивает через ленивую собаку».Термин «собака» имеет хиты в индексе, такие как «собачий поводок», «выгуливание собаки».Аналогично, у «лисы» есть такие хиты, как «перчатка лисы», «лисица локси».

Итак, я хочу распечатать оригинальную «быструю коричневую лисичку» для пользователя с выделенными словами (собака и лиса).Вот пара примеров, таких как Получить совпадающие термины в запросе , которые используют метод объяснения, но ответы не доходят до последнего дюйма.Я думаю, что Lucene не будет делать это легко, и мне придется использовать регулярные выражения.

1 Ответ

0 голосов
/ 17 июня 2018

Я придумал один способ получить строку, которая представляет собой оригинальный текст пользователя с выделенными терминами совпадений.Исходный пользовательский текст запрашивается к индексу обычным способом.Исходный пользовательский текст и результаты передаются в «обратный» метод запроса.То есть: исходный текст пользователя превращается в основанный на памяти индекс и запрашивается по исходным результатам.Это противоположно тому, что мы делали изначально.В результате общие слова в результатах сравниваются со строкой.Это работает в моем индексе, потому что все результаты являются «строгими» определениями.

Подсветка используется для вставки разделителей вокруг найденных общих слов [..] в исходных результатах.Регулярное выражение (? <= \ [) (. *?) (? = \]) Используется для удаления отдельных найденных слов с помощью разделителей. </p>

Отдельные найденные слова и исходный текст пользователя передаютсяследующий метод, который удаляет дубликаты терминов и выделяет слова в исходной строке пользователя:

//remove found term duplicates and produce a single string with all the hits highlighted

private static void removeTermDuplicates (List textResult, String searchText) {

// to be the final modified string with all highlights
String strOutput = searchText;

// creating a hashset using the incoming list
Set<String> textSet = new LinkedHashSet<String>(textResult);
// remove all the elements from the list 
textResult.clear();
// add all the elements of the set to create a

// list of found terms without duplicates
textResult.addAll(textSet);

// add html elements to found terms
for(String term : textResult){
    replacementWord.add("<b>"+term+"</b>");
}
//put original term and the same term with highlights in a hash map
for(int i=0; i<replacementWord.size(); ++i) {
    oldAndNewTerms.put(textResult.get(i), replacementWord.get(i));

}

//use a hash map to modify the original string
for (String key : oldAndNewTerms.keySet()){       

      strOutput = strOutput.replace(key,oldAndNewTerms.get(key) );      }

System.out.println(strOutput);

}

Надеюсь, это поможет кому-то в будущем.Фил

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...