【问题标题】:Global aggregation is not taking into account all documents in elasticsearch全局聚合没有考虑弹性搜索中的所有文档
【发布时间】:2019-04-05 21:25:51
【问题描述】:

全局聚合没有考虑到我的 elasticsearch 中的所有文档。

我已尝试按照文档中的说明将全局聚合放在顶层。

全局聚合定义了搜索执行上下文中所有文档的单个存储桶。此上下文由您正在搜索的索引和文档类型定义。

全局聚合器只能作为顶级聚合器放置。

{
   "size": 0,
   "aggs":{
      "all_documents":{
         "global":{},
         "aggs":{
            "all_totals":{
               "terms":{
                  "field":"dateReleve"
               },
               "aggs":{
                  "total_clients_cut":{
                     "sum":{
                        "field":"nbClientCoupe"
                     }
                  }
               }
            }
         }
      }
   }
}

sum_other_doc_count 的值预计为零,但我得到 299932

{
    "took": 9,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 302644,
        "max_score": 0,
        "hits": []
    },
    "aggregations": {
        "all_documents": {
            "doc_count": 302644,
            "all_totals": {
                "doc_count_error_upper_bound": 608,
                "sum_other_doc_count": 299932,
                "buckets": [
                    {
                        "key": 1554144600000,
                        "key_as_string": "2019-04-01T18:50:00.000Z",
                        "doc_count": 374,
                        "total_clients_cut": {
                            "value": 178673
                        }
                    },
                    ...

但是当我通过这样做来增加术语桶的大小时:

{
   "size": 0,
   "aggs":{
      "all_documents":{
         "global":{},
         "aggs":{
            "all_totals":{
               "terms":{
                  "field":"dateReleve",
                  "size": 10000        <----------------------
               },
               "aggs":{
                  "total_clients_cut":{
                     "sum":{
                        "field":"nbClientCoupe"
                     }
                  }
               }
            }
         }
      }
   }
}

我得到了预期的结果,即sum_other_doc_count = 0。 我认为增加存储桶的大小不是一个好习惯,因为我们无法假设我们已经拥有多少文件。 所以我的问题是如何通过全局聚合获得预期的结果。

【问题讨论】:

标签: elasticsearch


【解决方案1】:

使用size 参数不一定是一种不好的做法,但了解实际发生的情况和替代方法可能有助于确定最适合您的用例。

如文档所示:

可以设置size参数来定义应该有多少个term bucket 被从整体条款列表中退回。默认情况下,节点 协调搜索过程将要求每个分片提供其 拥有最大尺寸的术语桶,一旦所有分片都响应,它将减少 结果到最终列表,然后将返回到 客户。这意味着如果唯一项的数量大于 大小,返回的列表略有偏差且不准确(可能是 术语计数略有偏差,甚至可能是一个术语 应该在最大尺寸的存储桶中没有返回)。

您的结果集对于dateReleve 字段必须具有高基数;当搜索执行时,您只收到由查询的分片决定的 top 数量的桶,然后将其返回到编译最终列表的协调节点。您可以通过注明您收到"doc_count_error_upper_bound": 608

来确认这一点

如文档中所述,您可能希望改用 Composite 聚合:

注意

如果你想检索所有术语或术语的所有组合 嵌套术语聚合,您应该使用 Composite 聚合 这允许对所有可能的术语进行分页,而不是设置 大小大于术语中字段的基数 聚合。 术语聚合旨在返回最热门的术语 并且不允许分页。

参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 2020-08-25
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多