你有没有想过,谷歌等搜索引擎工具是如何在你输入时准确预测你的搜索查询的?或者纠正你的搜索查询中的错别字?不,这不是类似人类的推理。
这种功能之所以能够实现,是因为一种叫做模糊逻辑、模糊性或模糊搜索的概念。
什么是模糊性?
模糊性或模糊逻辑指的是一种数学逻辑,它描述了一个数值的真实性可以是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。其他方法包括。
- constant_core_boolean
- score_boolean
- top_terms_boost_N
- top_terms_N
- top_terms_blended_freqs_N
注意:避免改变重写方法,除非你确信你在做什么。
总结
Elasticsearch本身就是一个强大的工具。然而,正如本教程所显示的,当它与模糊查询等功能结合起来时,可以提供巨大的力量。
值得注意的是,Elasticsearch模糊查询的内容比本指南中讨论的要多。