solr 模糊 vs 通配符 vs 词干分析器

solr fuzzy vs wildcard vs stemmer

我有几个问题。

我想搜索一个字词jumps

有了模糊搜索,我可以做到jump~ 使用通配符搜索,我可以做到 jump* 我可以用词干分析器,jump

我的理解是,模糊搜索给出pump。通配符搜索也会给出 jumping。 Stemmer 也给出 "jumper"。

我完全同意这个结果。

  1. 这三者的表现如何?

    • 不建议在学期开头使用通配符 - 我的理解是它必须与索引中的所有标记匹配 - 但在这种情况下,它将是所有开始跳跃的代币

    • 模糊搜索给了我意想不到的结果——我假设它必须做某种拼写检查。

    • Stemmer 只适合特定的场景,它不能匹配泵。

  2. 我应该如何使用这些可以提供更多相关结果的东西?

我可能因为 this section 而对所有这些更加困惑。有什么建议吗?

对于问题 2,您可以从严格到宽松。

选项一:只给出严格的搜索结果。如果没有找到结果,请提供词干分析器结果。如果之前没有找到结果,则继续模糊搜索或通配符搜索。

选项二:给出所有结果,但按级别对它们进行排序(即首先完全匹配,然后是词干分析结果,...)

问题一

  1. 通配符查询(通常)未被分析(即它们未被标记化或 运行 通过过滤器),这意味着任何依赖于过滤器的东西都在处理 input/output 标记会给出奇怪的结果(例如,如果输入字符串被分成多个字符串)。

    匹配发生在标记上,因此您输入的内容几乎(小写仍然有效)直接与索引中标记的前缀/后缀匹配。一般来说,您希望避免对一般搜索查询使用通配符查询,因为它们对于自然搜索而言相当有限,并且会给出奇怪的结果(如图所示)。

  2. 模糊搜索 is based on "edit distance" - 即一个数字,告诉 Solr 有多少个字符可以 removed/inserted/changed 得到结果标记。这会给您的用户带来不错的结果,但是当允许的距离较大时(Lucene/Solr 最多支持 2 个编辑距离,这可能很难解释“为什么这会给我一个打击”)如果没有给出编辑距离,也是默认值。

  3. 词干化通常是可行的方法,因为它是实际的“正式”过程,将一个术语缩减为它的词干——实际的“意义”(它并不真正知道与自然语言处理术语中的含义有关的任何内容,但它根据单词的一组静态规则和配置语言的例外情况来执行。它可以根据语言调整为适合该语言的规则,而其他两个选项都不能。

    关于词干的缺点(“因为它不能匹配泵”)- 这实际上可能是一件好事。您的用户会更清楚搜索结果的依据,而不是在搜索结果中包含 pumps,而是将其作为拼写更正(“您是说 pump / pumps 代替?”)。它将为任何用户提供更好的体验,搜索结果将更接近他们正在搜索的内容。

    根据您的实际用例,要求可能会有所不同;即,如果它只是为了以编程方式尝试查找看起来相似的术语。

问题二

将您认为更相关的结果显示为第一个命中 - 如果您正在进行通配符或模糊搜索,则不能仅通过评分来完成此操作,因此您必须进行多次查询,然后再显示它们彼此。我通常建议在项目中讨论此问题时让搜索用户明确执行此操作。

相反,作为主要搜索,您可以在单独的字段中使用 NGramFilter 并使用 copyfield 指令将相同的内容放入两个字段 - 然后 ngramfilter 的得分远低于更“精确”的命中率场地。在这种情况下,通常您需要三个字段 - 一个用于精确匹配(非词干匹配),一个用于词干匹配,一个用于 ngram 匹配 - 然后使用 edismax 的 qf 参数对它们进行适当评分。它通常会为您的用户提供最快和最简单的结果,以获得体面的搜索结果,但请确保为他们提供体面的方式来过滤结果集(方面)或将他们的查询更改为更有意义的内容(您的意思是,另请参阅xyz 等)。

通常很难猜测用户的意图,除非您在个性化方面投入了大量时间和资源(想想 Google),所以请稍后再说 - 大多数用户会很高兴,只要他们有解决他们自己的问题的清晰和独特的方法,即使你没有得到完美的第一个结果。