休眠搜索不返回词组中最接近的词

hibernate search not returning the closest words of group of words

我有休眠搜索端点,我需要在其中 return 一组词中最接近的匹配项。 当我尝试进行搜索时,在前 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);

请问如何才能return最接近的词组

虽然全文搜索可以return“接近匹配”(即解决拼写错误等),但您仍然需要选择加入。

对于近似匹配,您有两种解决方案:

  1. 使用"fuzzy" queries:此解决方案有局限性且可配置性不强,但设置简单。
  2. 配置分析器。更可配置,但需要更多知识。

如果您采用解决方案 #2,我建议您查看这些资源以熟悉全文搜索:

(这是 Hibernate Search 6 的文档,但概念与 Hibernate Search 5 中的相同)

然后看看how to configure an analyzer in Hibernate Search 5

现在您应该对什么是分析器有了更好的了解:在索引和查询时将文本转换为将完全匹配的标记。近似匹配是通过近似转换实现的:如果分析将“Résumé”转换为“resume”,则查询“resume”将匹配包含“Résumé”的文档。

例如:

Document: "Quick Brown Fox" => "quick", "brown", "fox"
Queried: "Qick borwn fox" => "qick", "borwn", "fox"
Matching: "fox"

查询中有错字。该文档在搜索中的命中率应该很高,但不会,因为只有一个词匹配,“fox”。

要获得更近似的匹配,一种策略是将单词分解为所谓的“ngram”。为此,请使用 NGramFilterFactory,例如

如果我们设置分析将单词分解为 3-grams,我们将得到:

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. 您现在将获得与可能不相关的文档的匹配项,例如包含“ficle”的文档(=>“fic”、“ick”、“kle”)。这应该通过按相关性排序来平衡,将最佳匹配放在结果列表的顶部附近:如果用户在顶部附近找到他想要的内容,他们不会介意其他结果不相关。
  2. 仍未检测到“borwn”一词的匹配项。您可以在 3-gram 之上添加 2-gram,以便匹配“wn”,但要小心:您会得到更多不相关的匹配项。

如您所见,要获得按您希望的方式运行的全文搜索需要一些工作和配置;没有“一刀切”的解决方案。您只需要尝试不同的配置,看看哪种配置最适合您。