文章目录
在 Elasticsearch 中,fuzzy 查询用于执行模糊匹配,通常用于处理拼写错误、变体或者近似匹配的场景。它基于 Levenshtein 编辑距离算法(即编辑距离,也叫做编辑距离算法)来比较字符串之间的相似度。fuzzy 查询可以通过设置允许的最大编辑距离来控制匹配的宽松度。
1. fuzzy 查询的基本用法
假设我们有一个 articles 索引,包含 title 字段。我们想通过模糊查询来查找包含与 title 字段中某个单词拼写相似的词。
示例文档:
json
POST /articles/_bulk
{ "index": { "_id": 1 } }
{ "title": "Elasticsearch Basics" }
{ "index": { "_id": 2 } }
{ "title": "Learning Elasticsearch" }
{ "index": { "_id": 3 } }
{ "title": "Advanced Elasticsearch" }
{ "index": { "_id": 4 } }
{ "title": "Understanding Search Engines" }
2. 基本的 fuzzy 查询
假设我们要查找与 Elasticsearch 拼写相似的文章,我们可以使用 fuzzy 查询来实现。下面是一个基本的 fuzzy 查询,查找 title 字段中与 Elasticserch 类似的文档(注意拼写故意错误)。
json
POST /articles/_search
{
"query": {
"fuzzy": {
"title": {
"value": "Elasticserch", // 错误拼写
"fuzziness": "AUTO" // 自动调整模糊匹配的容忍度
}
}
}
}
解释:
-
value:指定你希望查找的模糊词。这里我们故意拼错了Elasticsearch为Elasticserch。 -
fuzziness:指定允许的模糊度。
AUTO会自动计算适当的模糊程度。它根据字符串长度自动选择适合的
fuzziness值:
- 对于长度小于等于 3 的词,
fuzziness被设为0(不允许编辑)。 - 对于长度大于 3 的词,
fuzziness被设为1或2,允许一定的编辑距离。
- 对于长度小于等于 3 的词,
查询结果:
json
{
"hits": {
"total": { "value": 3, "relation": "eq" },
"hits": [
{
"_id": "1",
"_source": {
"title": "Elasticsearch Basics"
}
},
{
"_id": "2",
"_source": {
"title": "Learning Elasticsearch"
}
},
{
"_id": "3",
"_source": {
"title": "Advanced Elasticsearch"
}
}
]
}
}
在这个例子中,Elasticserch 和 Elasticsearch 的拼写差异是允许的,因此所有包含 Elasticsearch 的文档都返回了。
3. fuzziness 的不同设置
fuzziness 设置为数字(编辑距离)
除了 AUTO,你还可以手动指定一个数字,表示允许的最大编辑距离。编辑距离是指从一个字符串转换到另一个字符串所需的最小字符编辑次数(包括插入、删除或替换字符)。
例如,fuzziness 设置为 2 表示最多允许 2 次字符编辑:
json
POST /articles/_search
{
"query": {
"fuzzy": {
"title": {
"value": "Elasticserch",
"fuzziness": 2 // 允许最多 2 次编辑
}
}
}
}
fuzziness 设置为 0
如果你将 fuzziness 设置为 0,那么 Elasticsearch 会要求字段完全匹配,不允许任何类型的字符修改:
json
POST /articles/_search
{
"query": {
"fuzzy": {
"title": {
"value": "Elasticserch",
"fuzziness": 0 // 不允许任何编辑
}
}
}
}
4. 更多的 fuzzy 查询选项
你还可以在 fuzzy 查询中使用更多选项来定制查询:
prefix_length:指定匹配的前缀长度。此参数可以提高查询性能。如果一个词的前缀部分没有变化,那么fuzzy查询会只在剩下的部分进行匹配。max_expansions:限制查询扩展的最大数量。用于控制在查询中允许的最大变体数量,从而提高查询效率。
示例:
json
POST /articles/_search
{
"query": {
"fuzzy": {
"title": {
"value": "Elasticserch",
"fuzziness": 2,
"prefix_length": 3, // 前 3 个字符必须完全匹配
"max_expansions": 10 // 允许最多 10 次变体扩展
}
}
}
}
5. 总结
fuzzy查询:用于执行基于编辑距离的模糊匹配,适用于拼写错误、变体或近似匹配。fuzziness:AUTO:自动设置编辑距离。数字(如1、2):指定允许的最大编辑距离。0:要求完全匹配。
prefix_length:设置匹配的前缀长度。max_expansions:控制查询扩展的最大变体数量。