当前位置: 首页 > 面试题库 >

子聚合导致数据丢失

童浩言
2023-03-14
问题内容

简而言之,问题 :执行带有子聚合的查询时,内部聚合为什么在某些情况下会丢失数据?

详细问题 :我有一个带有子聚合(存储桶中的存储桶)的搜索查询,如下所示:

{
    "size": 0,
    "aggs": {
        "outer_docs": {
            "terms": {"size": 20, "field": "field_1_to_aggregate_on"},
            "aggs": {
                "inner_docs": {
                    "terms": {"size": 10000, "field": "field_2_to_aggregate_on"},
                    "aggs": "things to display here"
                }
            }
        }
    }
}

如果我执行此查询,对于某些external_docs,我不会收到与之关联的所有inner_docs。在下面的输出中,有三个用于外部文档key_1的内部文档。

{
    "hits": {
        "total": 9853,
        "max_score": 0.0,
        "hits": []
    },
    "aggregations": {
        "outer_docs": {
            "doc_count_error_upper_bound": -1, "sum_other_doc_count": 9801,
            "buckets": [
                {
                    "key": "key_1", "doc_count": 3,
                    "inner_docs": {
                        "doc_count_error_upper_bound": 0,
                        "sum_other_doc_count": 0,
                        "buckets": [
                            {"key": "1", "doc_count": 1, "some": "data here"},
                            ...
                            {"key": "3", "doc_count": 1, "some": "data here"},
                        ]
                    }
                },
                ...
            ]
        }
    }
}

现在,我添加了一个查询,以单选一个反而应该在前20个中使用的external_doc。

"query": {"bool": {"must": [{'term': {'field_1_to_aggregate_on': 'key_1'}}]}}

在这种情况下,我确实获得了所有inner_docs,它们都在外部文档key_1的七个内部文档下面的输出中。

{
    "hits": {
        "total": 8,
        "max_score": 0.0,
        "hits": []
    },
    "aggregations": {
        "outer_docs": {
            "doc_count_error_upper_bound": -1, "sum_other_doc_count": 9801,
            "buckets": [
                {
                    "key": "key_1", "doc_count": 8,
                    "inner_docs": {
                        "doc_count_error_upper_bound": 0,
                        "sum_other_doc_count": 0,
                        "buckets": [
                            {"key": "1", "doc_count": 1, "some": "data here"},
                            ...
                            {"key": "7", "doc_count": 2, "some": "data here"},
                        ]
                    }
                },
                ...
            ]
        }
    }
}

我已经明确指定每个外部文件我要10,000个内部文件。是什么使我无法获取所有数据?

这是我的版本信息:

{
    'build_date': '2018-09-26T13:34:09.098244Z',
    'build_flavor': 'default',
    'build_hash': '04711c2',
    'build_snapshot': False,
    'build_type': 'deb',
    'lucene_version': '7.4.0',
    'minimum_index_compatibility_version': '5.0.0',
    'minimum_wire_compatibility_version': '5.6.0',
    'number': '6.4.2'
}

编辑 :经过更多研究后,我发现问题与子聚合无关,但与聚合本身和分片的使用无关。我已经为Elastic打开了这个错误报告:

  • https://discuss.elastic.co/t/bug-in-aggregation-result-when-using-shards/164161
  • https://github.com/elastic/elasticsearch/issues/37425

问题答案:

事实证明,该问题并非归因于子聚合,而这是ElasticSearch的实际功能。我们使用5个分片,使用分片时,聚合仅返回近似结果。

我们已使该问题可重现,并将其发布在Elastic forum中。在这里,我们了解到聚合并不总是返回所有数据,而是提供了指向文档的链接,其中对此进行了更详细的说明。

我们还了解到,仅使用1个分片即可解决该问题,并且在不可能的情况下,该参数shard_size可以缓解此问题。



 类似资料:
  • 使用不同的聚合函数查看数值非常有用。Tableau支持许多不同的聚合类型,例如: 总和 平均 计数 唯一值 中位数 最小值 最大值 方差 总体方差 标准偏差 总体标准差 属性 维度 在Tableau中,您可以创建聚合维度和度量。每当向视图添加度量时,默认情况下会对这些度量应用聚合。使用的聚合类型取决于视图的上下文。 如果您不熟悉数据库,请参阅Tableau手册以获取这些聚合类型的详细定义。默认情况

  • 我试图在使用RESTendpoint的骆驼路由中构建一个分割/聚合模式。它需要一个包含请求详细信息列表的请求对象。我想并行处理请求详细信息,然后将聚合结果返回给调用方。我希望这是一个同步调用。 这是我的路线中的代码。 我希望调用的结果是聚合调用(我的响应对象)的输出。但我实际上得到的是REST调用返回的请求对象?? 当我放入更多的日志语句时,我可以看到Split调用正在触发多个线程,这很好。我可以

  • 本文向大家介绍vuex页面刷新导致数据丢失的解决方案,包括了vuex页面刷新导致数据丢失的解决方案的使用技巧和注意事项,需要的朋友参考一下 解决vuex页面刷新导致数据丢失问题 vuex数据是存在内存当中,当页面刷新之后vuex数据自然会丢失。我们有两种方法解决该问题: 1.使用vuex-along 2.使用localStorage或者sessionStroage 1.使用vuex-along v

  • 我一直在尝试使用聚合框架按对报告进行计数。尝试1: 这导致聚合框架抛出: 然后更改为使用而不是进行尝试#2: 最后,我在尝试#3中使用了lambda来实现接口: 这一尝试终于奏效了。 问题1:这是Hazelcast的一个bug吗?似乎聚合框架应该支持由或构建的?如果不是,那么应该创建一个新的类型(例如,)来避免这种混淆。 问题2(与问题1相关):使用lambda会导致我创建的索引未被使用。相反,映

  • 我正在尝试设置一个搜索查询,该查询应通过多级嵌套字段复合聚合集合,并从该集合中提供一些子聚合指标。我能够按预期使用其存储桶获取复合聚合,但所有存储桶的子聚合指标都带有。我不确定我是否未能正确指出子聚合应考虑哪些字段,或者它是否应放置在查询的不同部分中。 我的收藏看起来类似于以下内容: 贝娄,你可以找到我已经尝试了。尽管所有文档都有一个设置的点击值,但所有存储桶都带有点击总数。 到目前为止,我的回应

  • 问题内容: 我想要做的是计算子查询返回的行数,本质上如下: 这是我的错误信息: 为什么这不起作用?如果select仅返回一堆具有过滤条件的行,为什么我不能计算行数或返回的行数? 我正在计算拥有的不同员工的数量。按分组。 这是有关我的数据库的一些结构信息,作为查询的一部分。 谢谢! 问题答案: 试试这个 或这个