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

Elasticsearch 7.17.8中wildcard字段西里尔文大小写不敏感查询失效

问题解决:Elasticsearch 7.17.8西里尔文wildcard字段大小写不敏感查询失效

问题原因

Elasticsearch 7.17.8中,wildcard字段的case_insensitive查询默认仅支持ASCII字符集的大小写转换,无法识别西里尔文这类非ASCII字符的大小写映射关系(比如西里尔文Е与е的Unicode编码不在ASCII范围内,规则不处理它们的转换),导致开启case_insensitive: true后仍无法匹配大小写不同的西里尔文内容。

解决方案

方案1:使用带归一化器的keyword字段(推荐)

通过配置normalizer在索引阶段统一将字段内容转为小写(或大写),查询时无需依赖case_insensitive参数,直接执行wildcard查询即可匹配。

创建索引:

PUT /index
{
  "settings": {
    "analysis": {
      "normalizer": {
        "cyrillic_lowercase": {
          "type": "custom",
          "filter": ["lowercase"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword",
        "normalizer": "cyrillic_lowercase"
      }
    }
  }
}

写入数据:

POST /index/_doc/1
{
  "name": "ТЕСТ"
}

查询(大小写不敏感,直接匹配):

POST /index/_search
{
  "query": {
    "wildcard": {
      "name": "*Тест*"
    }
  }
}

此时索引中的ТЕСТ已被归一化为тест,查询字符串*Тест*会自动匹配归一化后的值。

方案2:升级至Elasticsearch 8.x版本

Elasticsearch 8.x对wildcard查询的case_insensitive参数做了优化,引入ICU字符集支持,可直接处理西里尔文等非ASCII字符的大小写转换,无需额外配置即可实现预期的大小写不敏感查询。

方案3:手动统一大小写

在业务层处理数据:

  • 写入Elasticsearch前,将西里尔文内容统一转为小写(或大写)
  • 查询时,将查询字符串也转为相同的大小写格式,再执行wildcard查询

示例:写入数据时存储тест,查询时使用*тест*作为wildcard值,即可匹配原数据ТЕСТ。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:45:29