Elasticsearch嵌套字段nested值过滤返回全量数据问题求解
问题根因
查询返回全量文档是因为nestedQuery的路径配置错误:
- 你的索引mapping中,
educations才是声明为nested类型的根字段,config是educations嵌套对象下的普通内部属性,本身不是独立的nested类型字段 - 你传入的nested路径为
educations.config,指向了一个不存在的nested字段,Elasticsearch不会对这类路径不匹配的场景抛出显式报错,默认会匹配所有文档,最终出现过滤失效返回全量的问题。
正确实现代码
将nested查询的根路径修改为实际的nested类型字段educations即可,内部查询字段保持完整路径不变:
boolQueryBuilder = boolQueryBuilder.must( nestedQuery( "educations", termQuery("educations.config.isVisible", true), ScoreMode.Total ) );
补充说明
- nested查询的第一个路径参数,必须和索引mapping中声明为
nested类型的字段路径完全一致,所有嵌套在该字段下的属性查询,都要挂载在对应根路径的nested查询下,不能把内部子属性误作为nested路径传入 - 上述查询生效后,只要文档的
educations数组中存在任意一个元素满足config.isVisible = true,文档就会被命中,完全匹配你的筛选需求。你提供的示例文档中test01、demo03两个教育经历的isVisible字段均为true,会被正常返回;所有教育经历config.isVisible全为false的文档会被过滤掉。
注意:如果你的需求是不仅要过滤文档,还要把文档内
educations数组中isVisible为false的元素也过滤掉,需要额外搭配inner_hits参数实现,仅靠上述查询只会过滤文档级别的数据,返回的文档里还是会保留所有educations元素。
内容的提问来源于stack exchange,提问作者Ahamed Rashid
相关产品推荐
相关产品推荐

