概述
继续跟中华石杉老师学习ES,第27篇
课程地址: https://www.roncoo.com/view/55
官方指导
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html
官方Blog : https://www.elastic.co/blog/found-fuzzy-search 强烈推荐
例子
我们知道,搜索的时候,可能输入的搜索文本会出现误拼写的情况。 举个例子 如下两个doc
doc1: hello world
doc2: hello java
我们本来是想搜索hello world ,结果手误输成了hallo world ?怎么办呢 ,还能继续搜索hello world吗?
fuzzy搜索技术 --> 自动将拼写错误的搜索文本,进行纠正,纠正以后去尝试匹配索引中的数据
实例 如下:
模拟一批数据
POST /my_index/my_type/_bulk
{ "index": { "_id": 1 }}
{ "text": "Surprise me!"}
{ "index": { "_id": 2 }}
{ "text": "That was surprising."}
{ "index": { "_id": 3 }}
{ "text": "I wasn't surprised."}
查询
GET /my_index/my_type/_search
{
"query": {
"fuzzy": {
"text": {
"value": "surprize",
"fuzziness": 2
}
}
}
}
返回结果:
,让我们来分析下
surprize --> 拼写错误 --> surprise --> s -> z
surprize --> surprise -> z -> s,纠正一个字母,就可以匹配上,所以在fuziness指定的2范围内
surprize --> surprised -> z -> s,末尾加个d,纠正了2次,也可以匹配上,在fuziness指定的2范围内
surprize --> surprising -> z -> s,去掉e,ing,3次,总共要5次,才可以匹配上,始终纠正不了
- fuzzy搜索以后,会自动尝试将你的搜索文本进行纠错,然后去跟文本进行匹配
- fuzziness,你的搜索文本最多可以纠正几个字母去跟你的数据进行匹配,默认如果不设置,就是2
推荐写法
一般不用上面的那种写法,常用写法如下:
GET /my_index/my_type/_search
{
"query": {
"match": {
"text": {
"query": "SURPIZE ME",
"fuzziness": "AUTO",
"operator": "and"
}
}
}
}
返回结果: