Elasticsearch:带有子聚合的has_child查询 - 存储桶计数错误

win*_*dup 3 elasticsearch

我试图根据孩子的比赛找到父母,并检索比赛的子项聚合.由于某种原因,儿童聚合的桶数显示的计数高于实际结果(如果它显示父母的计数 - 或者特定子项中的子项,我会很高兴).

该查询类似于以下(注意:我使用过滤后的查询,因为我稍后将添加除查询之外的过滤器):

{
"query" : {
    "filtered" : {
        "query" : {
            "has_child" : {
            "type" : "blog_tag",
            "query" : {
                "filtered" : {
                    "query" : {
                        "term" : {
                            "tag" : "something"
                        }
                    }
                }
            }
        }
    }
},
"aggs" : {
    "my_children" : {
        "children" : {
            "type" : "my_child_type"
        },
        "aggs" : {
            "field_name" : {
                "terms" : {
                    "field" : { "blog.blog_tag.field_name" }
                }
            }
        }
    }
}     
Run Code Online (Sandbox Code Playgroud)

}

这样做的正确方法是什么?

win*_*dup 5

问题如评论中所述.解决方案是使用查询过滤聚合,

"query" : {
    "filtered" : {
        "query" : {
            "has_child" : {
            "type" : "blog_tag",
            "query" : {
                "filtered" : {
                    "query" : {
                        "term" : {
                            "tag" : "something"
                        }
                    }
                }
            }
        }
    }
},
"aggs" : {
    "my_children" : {
        "children" : {
            "type" : "my_child_type"
        },
        "aggs" : {
            "results" : {
                "filter" : {
                    "query" : {
                        "filtered" : {
                            "query" : {
                                "term" : {
                                    "tag" : "something"
                                }
                            }
                        }
                    }
                },
                "aggs" : {
                    "field_name" : {
                        "terms" : {
                            "field" : { "blog.blog_tag.field_name" }
                       }
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)