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
相关产品推荐
相关产品推荐

