У меня есть конечная точка поиска в спящем режиме, где мне нужно было вернуть ближайшее совпадение в группе слов. когда я пытаюсь выполнить поиск, самые близкие слова не найдены в первых 10 результатах, ниже приведен фрагмент поиска в спящем режиме
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Test.class).get();
org.apache.lucene.search.Query luceneQuery = qb.keyword().onFields("arg")
.matching(searchTerm).createQuery();
javax.persistence.Query jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, Test.class);
Пожалуйста, как я могу вернуть ближайшее совпадение группы слов




Хотя полнотекстовый поиск может возвращать «близкие совпадения» (т. е. для учета опечаток и т. д.), вам все равно необходимо включить его.
Для приблизительных совпадений у вас есть два решения:
Если вы выберете решение № 2, я предлагаю вам ознакомиться с этими ресурсами, чтобы ознакомиться с полнотекстовым поиском:
(Это документация Hibernate Search 6, но концепции такие же, как и в Hibernate Search 5)
Тогда посмотрите как настроить анализатор в Hibernate Search 5.
Теперь вы должны иметь лучшее представление о том, что такое анализаторы: они преобразуют текст как при индексации, так и при запросе в токены, которые будут точно соответствовать. Приблизительные совпадения достигаются приблизительным преобразованием: если анализ преобразует «резюме» в «резюме», то запрос «резюме» будет соответствовать документу, содержащему «резюме».
Например:
Document: "Quick Brown Fox" => "quick", "brown", "fox"
Queried: "Qick borwn fox" => "qick", "borwn", "fox"
Matching: "fox"
В запросе опечатка. Документ должен занимать высокие места в результатах поиска, но этого не будет, потому что соответствует только один термин «лиса».
Чтобы получить еще более приблизительные совпадения, одна из стратегий состоит в том, чтобы разбить слова на так называемые «энграммы». Для этого используйте NGramFilterFactory, как здесь, например.
Если мы настроим анализ на разбиение слов на 3-граммы, мы получим это:
Document: "quick brown fox" => "qui", "uic", "ick", "bro", "row", "own", "fox"
Queried: "qick borwn fox" => "qic", "ick", "bor", "orw", "rwn", "fox"
Matching: "ick", "fox"
Теперь немного лучше: совпадут два термина: «ick» и «fox». Документ будет выше в списке результатов.
Конечно, он тоже не идеален:
Как видите, полнотекстовый поиск, который ведет себя именно так, как вы хотите, требует некоторой работы и настройки; не существует универсального решения. Вам просто нужно попробовать разные конфигурации и посмотреть, что подходит вам лучше всего.
Если вы не настраивали индивидуальную сортировку, вы уже сортируете результаты по релевантности. Hibernate Search по умолчанию сортирует по релевантности.
учитывая, что я использую нечеткое одобрение, и вот фрагменты: ) .matching(searchparam).createQuery(); как мне отсортировать результат поиска> Используемая мной версия поиска 5.10.9.Final. Я пытался все это переварить