You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Elasticsearch中查询数组内相似度超80%的匹配文档

该需求完全可以在Elasticsearch中实现,Elasticsearch原生支持数组字段的任意元素匹配规则,无需改造现有存储结构,你可以根据相似度算法要求选择对应方案:

方案1:内置编辑距离相似度方案(轻量无额外开发)

如果你的相似度计算规则采用Levenshtein编辑距离(统计两个字符串之间的字符增、删、改操作次数判断相似度),直接使用match查询配置模糊阈值即可实现需求:

{
  "query": {
    "match": {
      "names.keyword": {
        "query": "name testson",
        "fuzziness": "80%"
      }
    }
  }
}

参数说明:

  • names.keyword 对应完整未分词的姓名字段,确保对整个姓名串做相似度计算,如果你允许对姓名拆分单词后匹配,可以改为names字段
  • fuzziness: "80%" 即设定相似度阈值为80%,低于该阈值的匹配结果会被自动过滤,只要数组内存在任意一个姓名满足阈值,文档就会被返回
方案2:自定义相似度算法方案

如果你的业务要求使用非内置的指定相似度算法(如Jaccard系数、余弦相似度、自定义姓名匹配规则等),可以通过Painless脚本实现自定义计算逻辑:

{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": {
            "source": """
              for (String name : doc['names.keyword']) {
                // 此处替换为你的自定义相似度计算逻辑,入参为数组内的姓名和输入姓名,返回0-1之间的相似度值
                double similarity = customSimilarityCalc(name, params.inputName);
                if (similarity >= 0.8) {
                  return true;
                }
              }
              return false;
            """,
            "params": {
              "inputName": "name testson"
            }
          }
        }
      }
    }
  }
}

优化建议:

  • 数据量较大的场景下,可以提前对names字段做n-gram分词预处理,减少脚本实时计算的开销,提升查询性能

内容的提问来源于stack exchange,提问作者D. O.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:06:03