Elasticsearch-63-误拼写时的fuzzy模糊搜索

fuzzy搜索

我们在搜索的时候,可能会出现单词误拼写的情况,举个例子,有两个document
document1: hello world
document2: hello java
这时候搜索请求误写成了hallo world, 我们期望的结果是全查询出来,但是hallo world是匹配不上doc2的,那么用fuzzy技术,可以将拼写错误的搜索文本进行纠正,纠正以后去尝试匹配索引中的数据.

准备数据

删除之前用的my_index,然后执行以下添加

1
2
3
4
5
6
7
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."}

示例

如果我们的搜索不用fuzzy,就用之前的match直接搜索surprize, 这样呢是搜索不出来的,然后使用fuzzy搜索

1
2
3
4
5
6
7
8
9
10
11
GET  my_index/my_type/_search
{
"query": {
"fuzzy": {
"text": {
"value": "surprize",
"fuzziness": 2
}
}
}
}

返回值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"took": 50,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.22585157,
"hits": [
{
"_index": "my_index",
"_type": "my_type",
"_id": "1",
"_score": 0.22585157,
"_source": {
"text": "Surprise me!"
}
},
{
"_index": "my_index",
"_type": "my_type",
"_id": "3",
"_score": 0.1898702,
"_source": {
"text": "I wasn't surprised."
}
}
]
}
}

fuzziness,这个参数的意思是,你的搜索文本最多可以纠正几个字母去跟你的数据匹配,不设置的话,默认就是2

上面的结果中返回了两条数据
第一条中,只要将surprize中的z换成s就匹配到了,只要纠正一个字母就可以了,在我们设置的fuzziness范围内的
第二条中,需要将surprize中的z换成s,然后末尾加个d,纠正了两次,也在fuzziness范围内的

没有查询出来的内容是surprising,这个需要把z变成s,去掉e,再加上ing,需要5次才可以匹配到,所以没返回, 但是将fuzziness设置成5 之后,依然没用,是因为es中有最大纠正次数的限制

改进

上面这种搜索是不常用的,常用的会直接在match中设置一个 fuzziness属性,值为AUTO就可以了,如下

1
2
3
4
5
6
7
8
9
10
11
12
GET my_index/my_type/_search
{
"query": {
"match": {
"text": {
"query": "SURPIZE ME",
"operator": "and",
"fuzziness": "AUTO"
}
}
}
}

返回值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"took": 15,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.44248468,
"hits": [
{
"_index": "my_index",
"_type": "my_type",
"_id": "1",
"_score": 0.44248468,
"_source": {
"text": "Surprise me!"
}
}
]
}
}