Elasticsearch:fuzzy 搜索 (模糊搜索)
在实际的搜索中,我们有时候会打错字,从而导致搜索不到。在 Elasticsearch 中,我们可以使用 fuzziness 属性来进行模糊查询,从而达到搜索有错别字的情形。
match 查询具有 “fuziness” 属性。它可以被设置为 “0”, “1”, “2”或 “auto”。“auto” 是推荐的选项,它会根据查询词的长度定义距离。在实际的使用中,当我们使用 auto 时,如果字符串的长度大于5,那么 funziness 的值自动设置为2,如果字符串的长度小于2,那么 fuziness 的值自动设置为 0。
Fuzzy query
返回包含与搜索词相似的词的文档,以 Levenshtein 编辑距离 测量。
编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。 这些更改可以包括:
- 更改字符(box→fox)
- 删除字符(black→lack)
- 插入字符(sic→sick)
- 转置两个相邻字符(act→cat)
为了找到相似的词,模糊查询会在指定的编辑距离内创建搜索词的所有可能变化或扩展的集合。 查询然后返回每个扩展的完全匹配。
例子
我们首先输入如下的一个文档到 fuzzyindex 索引中:
PUT fuzzyindex/_doc/1
{"content": "I like blue sky"
}
如果这个时候,我们进行如下的搜索:
GET fuzzyindex/_search
{"query": {"match": {"content": "ski"}}
}
那么是没有任何被搜索到的结果,这是因为 “I like blue sky" 里分词后没有 ski 这个词。
{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 0,"relation" : "eq"},"max_score" : null,"hits" : [ ]}
}
这个时候,如果我们使用如下的搜索:
GET fuzzyindex/_search
{"query": {"match": {"content": {"query": "ski","fuzziness": "1"}}}
}
那么显示的结果是:
{"took" : 18,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 0.19178805,"hits" : [{"_index" : "fuzzyindex","_type" : "_doc","_id" : "1","_score" : 0.19178805,"_source" : {"content" : "I like blue sky"}}]}
}
显然是找到我们需要的结果了。这是因为 sky 和 ski 时间上是只差别一个字母。
同样,如果我们选用“auto”选项看看:
GET fuzzyindex/_search
{"query": {"match": {"content": {"query": "ski","fuzziness": "auto"}}}
}
它显示的结果和上面的是一样的。也可以进行匹配。
如果我们进行如下的匹配:
GET fuzzyindex/_search
{"query": {"match": {"content": {"query": "bxxe","fuzziness": "auto"}}}
}
那么它不能匹配任何的结果,但是,如果我们进行如下的搜索:
GET fuzzyindex/_search
{"query": {"match": {"content": {"query": "bxxe","fuzziness": "2"}}}
}
我们也可以使用如下的格式:
GET /_search
{"query": {"fuzzy": {"content": {"value": "bxxe","fuzziness": "2"}}}
}
那么它可以显示搜索的结果,这是因为我们能够容许两个编辑的错误。
我们接着再做一个试验:
GET fuzzyindex/_search
{"query": {"match": {"content": {"query": "bluo ski","fuzziness": 1}}}
}
上面显示的结果是:
{"took" : 17,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 0.40754962,"hits" : [{"_index" : "fuzzyindex","_type" : "_doc","_id" : "1","_score" : 0.40754962,"_source" : {"content" : "I like blue sky"}}]}
}
在上面的搜索中 “bluo ski”,这个词语有两个错误。我们想,是不是超过了我们定义的 "funziness": 1。其实不是的。 fuziness 为1,表示是针对每个词语而言的,而不是总的错误的数值。
在 Elasticsearch 中,有一个单独的 fuzzy 搜索,但是这个只针对一个 term 比较有用。其功能和上面的是差不多的:
GET fuzzyindex/_search
{"query": {"fuzzy": {"content": {"value": "ski","fuzziness": 1}}}
}
上面的搜索返回的结果是:
{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 0.19178805,"hits" : [{"_index" : "fuzzyindex","_type" : "_doc","_id" : "1","_score" : 0.19178805,"_source" : {"content" : "I like blue sky"}}]}
}
总结
模糊性是拼写错误的简单解决方案,但具有很高的 CPU 开销和非常低的精度。
参考:
【1】Fuzzy query | Elasticsearch Guide [7.4] | Elastic
Elasticsearch:fuzzy 搜索 (模糊搜索)相关推荐
- ElasticSearch 全文搜索
ElasticSearch 全文搜索 对文档执行全文检索,包括单个或多个单词或词组查询,返回匹配条件的搜索结果. ElasticSearch 是基于Apache Lucene的搜索引擎,一个开源.免费 ...
- 【Elasticsearch】十九种Elasticsearch字符串搜索方式
1.概述 十九种Elasticsearch字符串搜索方式 刚开始接触Elasticsearch的时候被Elasticsearch的搜索功能搞得晕头转向,每次想在Kibana里面查询某个字段的时候,查出 ...
- 【Elasticsearch】十九种Elasticsearch字符串搜索方式终极介绍 各种 查询
本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 可以加我问问题,免费解答,有问题可以先私聊我,本人每天都在线,会帮助需要的人. 但是本博主因为某些原因, ...
- Elasticsearch的搜索命令
Elasticsearch的搜索命令 文章目录 Elasticsearch的搜索命令 数据准备 URI Search q(查询字符串) analyzer(指定查询字符串时使用的分析器) df(指定查询 ...
- ElasticSearch(七) 搜索
title: ElasticSearch(七) 搜索 tags: ElasticSearch author: Clown95 搜索 在前面,已经介绍了在ElasticSearch索引中处理数据的基础知 ...
- ElasticSearch分布式搜索框架
目录 一. ElasticSearch背景 1.1 Elasticsearch介绍 1.2 Elasticsearch现状 1.3 Es最佳实践 二. 环境配置安装 2.1 Elasticsearch ...
- elasticsearch分布式搜索配置文件详解
2019独角兽企业重金招聘Python工程师标准>>> Elasticsearch是一个开源的分布式实时搜索与分析引擎,支持云服务.它是基于Apache Lucene搜索引擎的类库创 ...
- 基于Elasticsearch实现搜索推荐
在基于Elasticsearch实现搜索建议一文中我们曾经介绍过如何基于Elasticsearch来实现搜索建议,而本文是在此基于上进一步优化搜索体验,在当搜索无结果或结果过少时提供推荐搜索词给用户. ...
- ElasticSearch学习29_基于Elasticsearch实现搜索推荐
2019独角兽企业重金招聘Python工程师标准>>> 在基于Elasticsearch实现搜索建议一文中我们曾经介绍过如何基于Elasticsearch来实现搜索建议,而本文是在此 ...
最新文章
- Spring AOP详解(转载)所需要的包
- 华为交换机ssh思科交换机_思科交换机交换机中ip、mac地址绑定
- 海龟绘图画花朵_我家宝宝最喜欢的一本图画书——我的连衣裙
- isinstance函数
- SX1268与SX1278、SX1276对比分析以及选型南
- 纯CSS实现3D照片墙
- mysql 官方镜像_运行官方mysql 镜像
- arduino编程语言教程_Arduino|编程语言说明
- git remote(远程仓库操作)
- c#异步文件传输功能
- 8. Browser 对象 - History 对象(2)
- 通信原理电子版_2021届通信工程专业保研经历分享+个人经验总结
- vue-router路由文档详解
- Opencv图像识别从零到精通(34)---SIFI
- 浅析export * from 与 export {default} from用法
- logstash全量导入es
- 判断是否已经注册过_你的手机号码一定绑定过很多软件,我们如何查询呢?
- 曾国藩家书-修身篇 致诸弟·明师益友虚心请教
- 【论文阅读】水下机器人控制视觉伺服部分
- 单射、满射和双射图解