elasticsearch中使用fuzzy查询

文章目录

      • [1. `fuzzy` 查询的基本用法](#1. fuzzy 查询的基本用法)
      • [2. 基本的 `fuzzy` 查询](#2. 基本的 fuzzy 查询)
      • [3. `fuzziness` 的不同设置](#3. fuzziness 的不同设置)
        • [**`fuzziness` 设置为数字(编辑距离)**](#fuzziness 设置为数字(编辑距离))
        • [`fuzziness` 设置为 `0`](#fuzziness 设置为 0)
      • [4. 更多的 `fuzzy` 查询选项](#4. 更多的 fuzzy 查询选项)
      • [5. 总结](#5. 总结)

在 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,允许一定的编辑距离。
查询结果:
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:控制查询扩展的最大变体数量。
相关推荐
Elastic 中国社区官方博客20 小时前
Elastic 重大事件功能如何将 100 条日志样本转化为检测规则
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎
Elasticsearch1 天前
使用 OpenTelemetry 在 Elastic 中实现 Claude 平台的人工智能 agent 可观测性
elasticsearch
keyipatience2 天前
Git学习(2)撤销与分支操作全指南
大数据·elasticsearch·搜索引擎
加洛斯2 天前
万字推演Elasticsearch修炼方法,从炼气到元婴
后端·elasticsearch·面试
说实话起个名字真难啊2 天前
Git常用小问题笔记
笔记·git·elasticsearch
Elasticsearch2 天前
三个区域、三个 Kibana、一个视图:跨集群搜索登陆 Elastic 合成监测
elasticsearch
keyipatience2 天前
Git学习(3)合并冲突全解析:从原理到实战解决
大数据·elasticsearch·搜索引擎
刘老高2 天前
微服务架构实战:ShardingSphere Proxy + Canal 分库分表与 ES 同步全链路
elasticsearch·微服务·架构
Elasticsearch2 天前
Elastic 重大事件功能如何将 100 条日志样本转化为检测规则
elasticsearch
Elastic 中国社区官方博客3 天前
5 分钟内将 56 页扫描文档转化为带引用的答案:面向搜索无法读取的文档的检索增强生成流水线
大数据·运维·人工智能·elasticsearch·搜索引擎·信息可视化·全文检索