1.fuzzy搜索的概念应用
fuzzy query是一种模糊索索,其原理是查询词与词之间出存在的相似度,在计算两个单词之间的相似度之前就需要了解Levenshtein Edit Distance(做莱文斯坦距离),它是编辑距离的一种。指两个字串之间,由一个字符串转成另一个字符串所需的最少编辑操作次数。允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如,单词 “ski”变为 “sky”,的编辑距离为 1,这里使用“y”替换掉了“i”。
PUT fuzzyindex/_doc/1
{
"content": "I like blue sky"
}
GET fuzzyindex/_search
{
"query": {
"match": {
"content": {
"query": "ski",
"fuzziness": 1
}
}
}
}
当上面的请求发出以后,由于ski与sky之间存在一个编辑长度,因此可以匹配到“I like blue sky”。
{
"took" : 22,
"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"
}
}
]
}
}
2.如何设置fuzziness属性
前面通过一个简单的例子让我们对Fuzzy query 有所了解,其中fuzziness属性的配置是重中之重,这里我们再用几个例子展开说明。
如图所示,这里列举了几种fuzziness配置的场景。
- Fuzziness=1,“shark”和“shard”之间有一个字符存在差异就是“k”和“d”,它们之间是替换关系。Fuzziness=1差距是1,两个字符串可以匹配。
- Fuzziness=2,“allocation”和“allocation”之间存在两个字符的差异,“alocasion”比“allocation”少了一个“l”,同时“allocation”用“t”把“alocasion”中的“s”替换掉了。Fuzziness=2差距是2,两个字符串可以匹配。
- Fuzziness=1,“matche queri”和“match query”存在两处差异,Fuzziness=2差距是2,两个字符串不能匹配。
在fuzziness参数还有一种配置方法是ATUO,它会根据词的长度计算编辑距离,形式为AUTO:[low],[high],两个参数分别表示短距离参数和长距离参数。如果没有指定,默认值是 AUTO:3,6 。
当短距离参数和长距离参数表示为 3和6 的时候,其要传达的意思如下:
单词长度为 0 到 2 之间时,fuzziness=0,表示必须要精确匹配。
单词长度 3 到 5 个字母时,fuzziness=1。
单词长度大于 5 个字母时,fuzziness=2。
最佳实践: fuzziness 在绝大多数场合都应该设置成 AUTO。