全局汇总未考虑Elasticsearch中的所有文档

时间:2019-04-05 09:28:09

标签: elasticsearch

全局汇总未考虑我的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。 我认为增加存储桶的大小不是一个好习惯,因为我们无法假设我们已经有多少文件。 所以我的问题是如何通过全局聚合获得预期结果。

1 个答案:

答案 0 :(得分:0)

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

如文档所示:

  

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

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

来确认这一点

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

  

注意

     

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

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