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

