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

Elasticsearch多层嵌套字段大小写不敏感模糊查询问题

Elasticsearch 嵌套字段模糊匹配解决方案

问题场景

现有Elasticsearch文档结构如下:

{"_index": "my_index","_id": "1277-fr-123456","_version": 3,"_score": 0,"_source": {"companyName": "My company","portfolios": [{"id": 1,"name": "PF_CONF_001","item": {"reference": "Référence client","id": 32}},{"id": 2,"name": "PF_CONF_002","item": {"reference": "Référence ABC","id": 31}}]}}

索引映射配置:

{"mappings": {"dynamic": "strict","properties": {"companyName": {"type": "keyword","fields": {"autocomplete": {"type": "text","analyzer": "lower_ascii_analyzer"},"sortable": {"type": "text","analyzer": "lower_ascii_analyzer","fielddata": true}}},"portfolios": {"type": "nested","properties": {"id": {"type": "integer"},"item": {"type": "nested","properties": {"reference": {"type": "text","analyzer": "lower_ascii_analyzer"},"id": {"type": "integer"}}},"name": {"type": "text","analyzer": "lower_ascii_analyzer"}}}}}

需求:查询portfolios.item.reference包含abc且大小写不敏感的文档,尝试以下两种查询均未成功,需获取正确方案:

查询1:

{"query": {"bool": {"must": [{"nested": {"path": "portfolios.item","query": {"bool": {"must": {"query_string": {"query": "*abc*","default_field": "item.reference","analyze_wildcard": true,"allow_leading_wildcarrd": true,"analyzer": "lower_ascii_analyzer"}}}}}]}}}

查询2:

{"query": {"bool": {"must": [{"nested": {"path": "portfolios.item","query": {"bool": {"must": {"match": {"item.reference": "*abc*"}}}}}]}}}

错误原因分析

  • 查询1存在拼写错误:allow_leading_wildcarrd应为allow_leading_wildcard,导致参数不生效;同时query_string结合通配符时需确保分词逻辑匹配。
  • 查询2用法错误:match查询不支持直接写入通配符,*abc*会被当作普通文本分词,而非通配符规则处理。

正确查询方案

方案1:Wildcard查询(适合子串模糊匹配)

利用wildcard查询实现包含abc的子串匹配,结合字段的lower_ascii_analyzer自动实现大小写不敏感:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "portfolios.item",
            "query": {
              "wildcard": {
                "item.reference": {
                  "value": "*abc*"
                }
              }
            }
          }
        }
      ]
    }
  }
}

说明:由于reference字段存储时已被lower_ascii_analyzer转为小写,因此查询用*abc*即可匹配文档中的ABC。

方案2:Match查询(适合完整词匹配)

若需求是匹配包含abc这个完整词的文档,直接使用match查询即可,分词器会自动处理大小写:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "portfolios.item",
            "query": {
              "match": {
                "item.reference": "abc"
              }
            }
          }
        }
      ]
    }
  }
}

说明:文档中的Référence ABC会被分词为référence、abc,因此match查询abc会精准匹配到目标文档。

方案3:修正后的Query String查询

修正查询1中的拼写错误后,也可正常使用:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "portfolios.item",
            "query": {
              "query_string": {
                "query": "*abc*",
                "default_field": "item.reference",
                "analyze_wildcard": true,
                "allow_leading_wildcard": true,
                "analyzer": "lower_ascii_analyzer"
              }
            }
          }
        }
      ]
    }
  }
}

说明:修正拼写错误后,allow_leading_wildcard参数生效,结合analyze_wildcard让通配符内的文本被分词器处理,实现大小写不敏感的子串匹配。

内容的提问来源于stack exchange,提问作者Hakim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:57:13