如何在CosmosDB中实现忽略重音(变音符号)的不敏感查询
Cosmos DB实现忽略重音的模糊匹配方案
原生支持方案(推荐)
Cosmos DB原生支持字符串比较时忽略重音,无需额外改造数据,有两种实现方式:
1. 查询时指定比较规则
你可以直接在现有查询基础上增加比较规则参数,规则取值3代表同时忽略大小写和重音。
如果使用前缀匹配,更推荐用STARTSWITH函数,写法如下:
SELECT * FROM container_name WHERE STARTSWITH(name, 'empresa', 3)
如果需要保留LIKE语法,写法如下:
SELECT * FROM container_name WHERE name LIKE 'empresa%' WITH (COMPARE_RULE = 3)
上述两种写法都可以同时命中Émpresa 1和empresa 2两条记录,且可以正常走索引,无性能损耗。
2. 容器级配置默认比较规则
如果全容器的字符串查询都需要忽略重音和大小写,可以在创建容器时指定默认字符串比较策略,后续所有查询无需额外加参数就会生效:
- 配置项开启
IgnoreNonSpacingMarks(忽略重音)和IgnoreCase(忽略大小写)即可。
兼容旧版本的Workaround
如果你的Cosmos DB实例版本较低不支持原生比较规则,可以通过预存归一化字段的方式实现:
- 写入数据时,新增一个如
nameNormalized的额外字段,将原name字段去除重音、统一转为小写后存入该字段 - 查询时直接对归一化字段做匹配即可:
SELECT * FROM container_name WHERE nameNormalized LIKE 'empresa%'
该方案兼容性强、查询性能高,仅需要在写入数据时做一次预处理,额外占用少量存储空间。
内容的提问来源于stack exchange,提问作者Guilherme Molin
相关产品推荐
相关产品推荐

