【问题标题】:Elasticsearch: has_child query with children aggregation - bucket counts are wrongElasticsearch:具有子聚合的 has_child 查询 - 存储桶计数错误
【发布时间】:2015-08-15 04:24:55
【问题描述】:

我正在尝试根据子项中的匹配项来查找父项,并检索匹配项的子项聚合。出于某种原因,儿童聚合的存储桶计数显示的计数高于实际结果(如果它显示特定儿童存​​储桶中父母或孩子的计数,我会很高兴)。

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

{
"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" }
                }
            }
        }
    }
}     

}

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

【问题讨论】:

  • 您能否提供该查询的结果并说明错误的原因?
  • @AndreiStefan 我认为问题在于我希望子聚合的范围(在'blog_tag'上)仅限于那些与查询匹配的子聚合(内部命中)。换句话说,参考这个例子,我想要'blog.blog_tag'的'field_name'的桶,它的'tag'与查询('something')匹配。就目前而言,范围包括任何具有“标签”(has_child 查询词)的“博客”和“博客标签”,而不仅仅是与查询匹配的“博客标签”。
  • @AndreiStefan 我看到有一个聚合过滤器,如果我的查询是一个过滤器,则可以使用它 - 但看不到任何通过查询缩小聚合范围的东西。

标签: elasticsearch


【解决方案1】:

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

"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" }
                       }
                    }
                }
            }
        }
    }
}

【讨论】:

  • 这是完美的解决方案。请注意,结果聚合没有 has_child,此外,如果您在父文档上有过滤器,则只能将它们放在查询中,而不能放在结果聚合中。
猜你喜欢
  • 2021-04-02
  • 2018-10-01
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
相关资源
最近更新 更多