学习Elasticsearch模糊搜索

210 阅读4分钟

你有没有想过,谷歌等搜索引擎工具是如何在你输入时准确预测你的搜索查询的?或者纠正你的搜索查询中的错别字?不,这不是类似人类的推理。

这种功能之所以能够实现,是因为一种叫做模糊逻辑、模糊性或模糊搜索的概念。

什么是模糊性?

模糊性或模糊逻辑指的是一种数学逻辑,它描述了一个数值的真实性可以是0到1之间的数字范围,其中1代表绝对真实,0代表绝对错误。

不像布尔逻辑有两个不同的值。0和1,模糊逻辑接受一个可变范围的真和假。

简单地说,模糊性描述了一个值的清晰程度。比如说,一个错字。你怎么知道这是一个错别字?你评估现有的字母,并确定这个词想要描述的是什么。

在模糊逻辑中,我们可以用0和1的范围来表达。如果一个错字是helli,它更有可能描述hello或hell,而不是描述 "人 "或 "番茄"。

Elasticsearch中的模糊搜索

模糊搜索将根据特定的标准,在初始查询的基础上找到匹配的值。

Elasticsearch使用Levenshtein编辑距离算法来实现模糊性。

编辑距离是指为了达到目标词而对初始词进行的编辑、删除、替换或转置等词的变化总数。

Elasticsearch模糊搜索如何工作

这个算法很容易理解。你从两个词开始,按顺序逐个字符进行比较。

如果字符不同,你就把两个词之间的距离递增1。然后你确定字母之间的最终距离值。

Elasticsearch模糊查询

模糊查询与普通的Elasticsearch查询没有太大区别。要使用它,在搜索查询中添加模糊性参数。

你也可以在查询中添加最大的列文斯坦距离来使用。

GET kibana_sample_data_ecommerce/_search
{
"query": {
"fuzzy": {
"category": {
"value": "Men's",
"fuzziness": 0.5
  }
    }
  }
}

我们运行一个模糊查询来匹配术语 "Men's",并在上面的例子中设置一个自定义的模糊度值。

下面是一个响应的例子:

如果你降低编辑距离,Elasticsearch会限制搜索距离,这将导致遗漏一些值。

例如,下面这个编辑距离为0.2的查询将不会返回任何结果。

GET kibana_sample_data_ecommerce/_search
{
"query": {
"fuzzy": {
"category": {
"value": "Men's",
"fuzziness": 0.2
  }
    }
  }
}

响应如下所示:

Elasticsearch模糊度参数

如前所述,查询中的fuzziness参数设置了最大的Levenshtein编辑距离或编辑次数。

我们可以指定模糊度的值为。0,1,2,或AUTO。

当你为你的模糊查询手动设置编辑距离时,你可能会错过一些结果。Elasticsearch提供了一个自动值,让Elasticsearch决定编辑距离。

例如:

GET kibana_sample_data_ecommerce/_search
{
"query": {
"fuzzy": {
"category": {
"value": "Men's",
"fuzziness": "AUTO"
  }
    }
  }
}

如果你把数值设置为AUTO,Elasticsearch会根据搜索词的长度来编辑距离。你也可以为auto指定低值和高值,如。

AUTO:[低] AUTO:[高] 。

模糊的多匹配查询

你可以使用带有模糊性的Elasticsearch多重查询,如下面的查询例子所示。

GET kibana_sample_data_ecommerce/_search
{
"query": {
"multi_match": {
"query": "Shoes",
"fields": ["category", "customer_first_name"],
"fuzziness": "AUTO"
  }
  }
}

这个的响应是:

Elasticsearch模糊搜索参数

在Elasticsearch中使用模糊查询时,字段和值参数是必须的。其他参数,如模糊性是可选的,但在查询中可以发挥重要作用。

其他参数包括。

max_expansions:控制创建的变化数量。默认情况下,它被设置为60。Elasticsearch不鼓励为max_expansions指定一个高的值,因为它可能导致性能不佳。

转位:决定编辑距离是否包括两个相邻字符的转位。这个值默认设置为 "true"。

prefix_length:设置在扩展过程中不被改变的初始字符数。这个值默认设置为0。

Rewrite:设置重写查询的方法。默认值被设置为constant_core。其他方法包括。

  1. constant_core_boolean
  2. score_boolean
  3. top_terms_boost_N
  4. top_terms_N
  5. top_terms_blended_freqs_N

注意:避免改变重写方法,除非你确信你在做什么。

总结

Elasticsearch本身就是一个强大的工具。然而,正如本教程所显示的,当它与模糊查询等功能结合起来时,可以提供巨大的力量。

值得注意的是,Elasticsearch模糊查询的内容比本指南中讨论的要多。