【问题标题】:Elastic Search Distinguish Fuzzy Results弹性搜索区分模糊结果
【发布时间】:2014-06-09 02:43:09
【问题描述】:
作为执行模糊搜索时的一项要求,我们需要区分没有模糊性匹配的结果和由于模糊性而匹配的结果。
例如,如果索引有:
如果查询是“purple OR car~”,模糊度为 1,那么所有结果都将是结果,但“foxy cart”将被特别标记为模糊结果。我想知道是否对此有任何支持,或者有人对如何实现此功能有任何建议?我猜测的一个选项是将模糊度设置为 0 并重新执行查询,然后标记差异。我很感激是否有人可以提供任何其他更好的建议?提前谢谢你。
【问题讨论】:
标签:
search
elasticsearch
lucene
fuzzy-search
【解决方案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%"))
)))
【解决方案2】:
运行两个单独的查询是对我来说最有意义的方法。
您可以运行两个查询,一个只得到完全匹配,另一个得到只模糊结果,例如:
- 仅精确匹配:
purple car
- 仅模糊匹配:
purple car~ -car
这应该使集合互斥,因此您不必费心将一个查询的结果与另一个查询的结果进行匹配。但是,它也失去了根据分数轻松交织模糊和精确结果的能力。因此,无论哪种方法都符合您的目的。
此外,如果您只需要将精确匹配提升到顶部,则使用模糊术语和重度提升精确术语进行查询应该可以很好地做到这一点,例如:
purple car~ car^100