solr模糊vs通配符vs词干



我有几个问题。

我想搜索一个术语jumps

使用模糊搜索,我可以执行jump~使用通配符搜索,我可以执行jump*我可以用干细胞仪jump

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

我完全同意结果。

  1. 这三者的表现如何?

    • 如果外卡在学期开始时,不推荐使用-我的理解是,它必须与索引中的所有令牌匹配-但在这种情况下,它将是所有开始跳的令牌

    • 模糊搜索给了我意想不到的结果——我认为它必须进行某种拼写检查。

    • Stemmer只适合特定的场景;t匹配泵。

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

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

问题1

  1. 通配符查询(通常)不会被分析(即它们没有被标记化或通过过滤器运行),这意味着任何依赖于过滤器处理输入/输出标记的事情都会产生奇怪的结果(例如,如果输入字符串被分解为多个字符串)。

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

  2. 模糊搜索是基于";编辑距离"-即告诉Solr可以移除/插入/改变多少字符以获得结果令牌的数字。这会给你的用户带来不错的结果,但可能很难从";为什么这会给我一个打击";当允许的距离较大时(Lucene/Solr支持最多2英寸的编辑距离,如果没有给定编辑距离,这也是默认值)。

  3. 填鸭通常是一种方式,因为这是真正的"填鸭";正式的";取一个术语并将其简化为词干的过程——实际的"词干";意思是";(它并不像自然语言处理术语那样真正了解单词的含义,但它是根据一组静态规则和所配置语言的例外情况来做的)。它可以按语言调整为适合该语言的规则,而其他两个选项都不能。

    对于你在堵塞方面的缺点("因为它无法匹配泵"),这实际上可能是一件好事。您的用户将更清楚地了解搜索结果的基础,并且不要在搜索结果中包含pumps,而是将其作为拼写更正("您是指pump/pumps吗?")。它将为任何用户提供更好的体验,搜索结果将与他们搜索的内容更加匹配。

    需求可能会根据您的实际用例而有所不同;即,如果只是为了程序化地尝试查找看起来相似的术语。

问题2

将那些你认为更相关的结果作为第一次点击呈现出来——如果你在进行通配符或模糊搜索,你不能单独通过评分来完成,所以你必须进行几个查询,然后依次呈现。我通常建议搜索用户在项目中讨论这一点时,将其作为明确的行动。

相反,作为主搜索,你可以在一个单独的字段中使用NGramFilter,并使用copyfield指令将相同的内容输入到两个字段中,然后NGramFilter的得分远低于"更多"字段中的命中率;精确的";领域在这种情况下,通常需要三个字段——一个用于精确命中(非词干),一个用于词干命中,另一个用于ngram命中——然后使用edismax的qf参数对它们进行适当的评分。它通常会为用户提供最快、最简单的搜索结果,但一定要为他们提供过滤结果集(facets)或将查询更改为更有意义的内容的体面方法(你的意思是,也可以参见xyz等)

除非你在个性化方面投入了大量的时间和资源(比如谷歌),否则猜测用户的意图通常是非常困难的,所以以后再说吧——只要他们有一个清晰而独特的方法来解决自己的问题,大多数用户都会很高兴,即使你没有得到完美的第一个结果。

对于问题2,可以从严格到允许。

选项一:只给出严格的搜索结果。如果没有发现结果,给出stemmer结果。如果之前未找到结果,则继续进行模糊或通配符搜索。

选项二:给出所有结果,但按级别排列(即,首先是完全匹配,然后是stemmer结果,…)

最新更新