Поиск в спящем режиме не возвращает ближайшие слова группы слов

У меня есть конечная точка поиска в спящем режиме, где мне нужно было вернуть ближайшее совпадение в группе слов. когда я пытаюсь выполнить поиск, самые близкие слова не найдены в первых 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);

Пожалуйста, как я могу вернуть ближайшее совпадение группы слов

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
131
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Для приблизительных совпадений у вас есть два решения:

  1. Используйте «нечеткие» запросы: это решение ограничено и не очень настраивается, но просто в настройке.
  2. Настроить анализатор. Более настраиваемый, но требует немного больше знаний.

Если вы выберете решение № 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». Документ будет выше в списке результатов.

Конечно, он тоже не идеален:

  1. Теперь вы получите совпадения с, возможно, несвязанными документами, такими как документ, содержащий «fickle» (=> «fic», «ick», «kle»). Это должно быть уравновешено сортировкой по релевантности, выводя лучшие совпадения вверху списка результатов: если пользователь находит то, что ему нужно, вверху списка, он не будет возражать, что другие результаты не имеют отношения к делу.
  2. Слово «рожденный» по-прежнему не было обнаружено как совпадение. Вы можете добавить 2 грамма поверх 3 граммов, чтобы совпало "wn", но будьте осторожны: вы получите еще больше нерелевантных совпадений.

Как видите, полнотекстовый поиск, который ведет себя именно так, как вы хотите, требует некоторой работы и настройки; не существует универсального решения. Вам просто нужно попробовать разные конфигурации и посмотреть, что подходит вам лучше всего.

учитывая, что я использую нечеткое одобрение, и вот фрагменты: ) .matching(searchparam).createQuery(); как мне отсортировать результат поиска> Используемая мной версия поиска 5.10.9.Final. Я пытался все это переварить

Blaze 22.12.2020 07:12

Если вы не настраивали индивидуальную сортировку, вы уже сортируете результаты по релевантности. Hibernate Search по умолчанию сортирует по релевантности.

yrodiere 04.01.2021 09:05

Другие вопросы по теме