如何在ES中使用match_phrase查询多层nested字段匹配aaa的文档
ES嵌套字段match_phrase查询方案
前置说明
- 你的索引存在两层嵌套结构:第一层
student为nested类型,第二层student.R1634640669477.school也为nested类型,查询时必须逐层用nested语法声明查询路径 - 你当前
school.name的字段类型为keyword,该类型默认会把整个字段值作为单个词项存储,match_phrase是针对分词后的text字段做短语匹配的语法,使用时要注意字段类型适配
适配当前mapping的match_phrase查询
如果要精准匹配school.name值为aaa school的文档,直接使用如下DSL:
GET 替换为你的索引名/_search { "query": { "nested": { "path": "student", "query": { "nested": { "path": "student.R1634640669477.school", "query": { "match_phrase": { "student.R1634640669477.school.name": "aaa school" } }, "inner_hits": {} // 可选配置,返回匹配到的具体school数组元素 } } } } }
仅搜索关键词「aaa」的适配方案
如果只输入aaa就要命中对应数据,有两种可选方式:
- 修改mapping将
school.name改为text类型,ES会自动将aaa school分词为aaa、school两个词项,此时用原match_phrase查询aaa即可命中 - 不修改mapping的前提下,替换为wildcard查询实现模糊匹配:
GET 替换为你的索引名/_search { "query": { "nested": { "path": "student", "query": { "nested": { "path": "student.R1634640669477.school", "query": { "wildcard": { "student.R1634640669477.school.name": "*aaa*" } }, "inner_hits": {} } } } } }
内容的提问来源于stack exchange,提问作者test
相关产品推荐
相关产品推荐

