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 :指定你希望查找的模糊词。这里我们故意拼错了 ElasticsearchElasticserch

  • fuzziness

    :指定允许的模糊度。

    AUTO
    

    会自动计算适当的模糊程度。它根据字符串长度自动选择适合的

    fuzziness
    

    值:

    • 对于长度小于等于 3 的词,fuzziness 被设为 0(不允许编辑)。
    • 对于长度大于 3 的词,fuzziness 被设为 12,允许一定的编辑距离。
查询结果:
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"
        }
      }
    ]
  }
}

在这个例子中,ElasticserchElasticsearch 的拼写差异是允许的,因此所有包含 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:自动设置编辑距离。
    • 数字(如 12):指定允许的最大编辑距离。
    • 0:要求完全匹配。
  • prefix_length:设置匹配的前缀长度。
  • max_expansions:控制查询扩展的最大变体数量。
相关推荐
DavidSoCool4 小时前
es 3期 第25节-运用Rollup减少数据存储
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客4 小时前
使用 Elasticsearch 导航检索增强生成图表
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
Elastic 中国社区官方博客6 小时前
设计新的 Kibana 仪表板布局以支持可折叠部分等
大数据·数据库·elasticsearch·搜索引擎·信息可视化·全文检索·kibana
Dusk_橙子16 小时前
在elasticsearch中,document数据的写入流程如何?
大数据·elasticsearch·搜索引擎
喝醉酒的小白18 小时前
Elasticsearch 中,分片(Shards)数量上限?副本的数量?
大数据·elasticsearch·jenkins
熟透的蜗牛21 小时前
Elasticsearch 8.17.1 JAVA工具类
elasticsearch
九圣残炎1 天前
【ElasticSearch】 Java API Client 7.17文档
java·elasticsearch·搜索引擎
risc1234561 天前
【Elasticsearch】HNSW
elasticsearch
我的棉裤丢了1 天前
windows安装ES
大数据·elasticsearch·搜索引擎
乙卯年QAQ1 天前
【Elasticsearch】RestClient操作文档
java·大数据·elasticsearch·jenkins