弹性搜索区分模糊结果

时间:2014-04-24 01:42:46

标签: search elasticsearch lucene fuzzy-search

作为执行模糊搜索时的一项要求,我们需要区分没有模糊性的匹配结果与由于模糊性而匹配的结果。

例如,如果索引具有:

  • 红车
  • foxy cart
  • 蓝色汽车

查询是"紫色或汽车〜"如果模糊性为1,则所有结果都会产生结果,但是" foxy cart"将被标记为特别模糊的结果。我想知道是否有任何支持,或者有人建议如何实施此功能?我猜测的一个选项是将模糊性设置为0并重新执行查询,然后标记差异。如果有人能提供其他更好的建议,我感激不尽?提前谢谢。

2 个答案:

答案 0 :(得分:1)

运行两个单独的查询是对我来说最有意义的方法。

您可以运行两个查询,一个只获得完全匹配,另一个只获得 模糊结果,例如:

  • 仅限完全匹配:purple car
  • 仅限模糊匹配:purple car~ -car

哪个应该使这些集互斥,因此您不必麻烦将一个查询的结果与另一个查询的结果进行匹配。然而,它也失去了基于分数容易地交错模糊和精确结果的能力。无论哪种方法都符合您的目的。

另外,如果你只需要将你的精确匹配提升到顶部,那么使用模糊术语进行查询,并且使用一个重要的提升术语应该很好地完成这一点,例如:

purple car~ car^100

答案 1 :(得分:1)

.NEST示例:

                .Query(q => q
                .Bool(b => b
                        .Should(
                            st => st.Match(m => m.Query(term).Field(f => f.FullName).Fuzziness(Fuzziness.EditDistance(1)).Boost(1.1).MinimumShouldMatch("100%")),
                            st => st.Match(m => m.Query(term).Field(f => f.FullName).Boost(10).MinimumShouldMatch("100%"))
                        )))