【问题标题】:hibernate search not returning the closest words of group of words休眠搜索不返回一组单词中最接近的单词
【发布时间】:2020-12-15 04:37:27
【问题描述】:

我有休眠搜索端点,我需要返回一组单词中最接近的匹配项。 当我尝试进行搜索时,前 10 个结果中没有找到最接近的单词,下面是休眠搜索的 sn-p

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);

请问我怎样才能返回最接近的词组匹配

【问题讨论】:

    标签: java hibernate hibernate-search


    【解决方案1】:

    虽然全文搜索可以返回“相近匹配”(即考虑拼写错误等),但您仍然需要选择加入。

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

    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,例如here for example

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

    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. 单词“born”仍未被检测为匹配项。您可以在 3-gram 之上添加 2-gram,以便“wn”匹配,但要小心:您会得到更多不相关的匹配。

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

    【讨论】:

    • 考虑到我正在使用模糊批准,这里是 sn-ps: org.apache.lucene.search.Query luceneQuery = qb.keyword().fuzzy().withThreshold(.8f) 。 withPrefixLength(1).onFields("field") .matching(searchparam).createQuery();如何对搜索结果进行排序> 我使用的搜索版本是 5.10.9.Final。我一直在努力消化这些东西
    • 除非您一直在配置custom sorts,否则您已经按照相关性对结果进行了排序。 Hibernate Search 默认按相关性排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多