ElasticSearch如何不修改索引实现大小写不敏感精确匹配
解决方案
你不需要修改现有索引结构,也不需要额外在代码层做二次校验,现有mapping已经提供了更直接的实现方案:
最优方案:使用name.raw字段+大小写不敏感参数查询
你现有mapping中name字段自带raw子字段为keyword类型,本身就支持精确匹配,ES 7.10及以上版本可以直接使用case_insensitive参数实现大小写不敏感的完全匹配,不会出现部分匹配的结果,查询示例如下:
{ "query": { "term": { "name.raw": { "value": "this is a test", "case_insensitive": true } } } }
低版本ES替代方案:match_phrase搭配脚本校验
如果你使用的ES版本低于7.10没有case_insensitive参数,也可以通过match_phrase加脚本校验的方式避免部分匹配:
{ "query": { "bool": { "must": [ { "match_phrase": { "name": "this is a test" } }, { "script": { "script": { "source": "doc['name.raw'].value.toLowerCase() == params.target.toLowerCase()", "params": { "target": "this is a test" } } } } ] } } }
这种方案先通过match_phrase缩小匹配范围,再通过脚本校验字段完整值是否和目标内容大小写不敏感一致,同样不会返回部分匹配的结果。
内容的提问来源于stack exchange,提问作者Abe Miessler
相关产品推荐
相关产品推荐

