如何在elasticsearch的嵌套聚合中存储空字段和非空字段?

Posted

技术标签:

【中文标题】如何在elasticsearch的嵌套聚合中存储空字段和非空字段?【英文标题】:how to bucket empty and non empty fields in nested aggregation in elasticsearch? 【发布时间】:2016-02-11 22:27:14 【问题描述】:

我在 elasticsearch 中有以下一组嵌套子聚合(field2 是 field1 的子聚合,field3 是 field2 的子聚合)。 然而事实证明,field3 的术语聚合不会存储没有 field3 的文档。

我的理解是,除了 field3 的术语查询之外,我还必须使用 Missing 子聚合查询来存储这些查询。

但我不确定如何将其添加到下面的查询中以存储两者。


  "size": 0,
  "aggregations": 
    "f1": 
      "terms": 
        "field": "field1",
        "size": 0,
        "order": 
          "_count": "asc"
        ,
        "include": [
          "123"
        ]
      ,
      "aggregations": 
        "field2": 
          "terms": 
            "field": "f2",
            "size": 0,
            "order": 
              "_count": "asc"
            ,
            "include": [
              "tr"
            ]
          ,
          "aggregations": 
            "field3": 
              "terms": 
                "field": "f3",
                "order": 
                  "_count": "asc"
                ,
                "size": 0
              ,
              "aggregations": 
                "aggTopHits": 
                  "top_hits": 
                    "size": 1
                  
                
              
            
          
        
      
    
  

【问题讨论】:

【参考方案1】:

在 2.1.2 及更高版本中,您可以使用missing parameter of the terms aggregation,它允许您为缺少该字段的文档指定默认值。 (仅供参考,missing 参数从 2.0 开始可用,但 there was a bug 阻止它处理子聚合,这就是您在此处使用它的方式。)

     ...
     "aggregations": 
        "field3": 
          "terms": 
            "field": "f3",
            "order": 
              "_count": "asc"
            ,
            "size": 0,
            "missing": "n/a"     <----- provide a default here
          ,
          "aggregations": 
            "aggTopHits": 
              "top_hits": 
                "size": 1
              
            
          
        
      

但是,如果您使用的是 2.x 之前的 ES 集群,则可以使用与 field3 聚合相同深度的 missing aggregation 来存储缺少“f3”的文档,如下所示:

     ...
     "aggregations": 
        "field3": 
          "terms": 
            "field": "f3",
            "order": 
              "_count": "asc"
            ,
            "size": 0
          ,
          "aggregations": 
            "aggTopHits": 
              "top_hits": 
                "size": 1
              
            
          
        ,
        "missing_field3": 
          "missing" : 
            "field": "f3"
          ,
          "aggregations": 
            "aggTopMissingHit": 
              "top_hits": 
                "size": 1
              
            
          
        
      

【讨论】:

我使用的是 2.1.1 版本,但不幸的是,较新的方法在内部级别上不起作用,请参阅此问题 github.com/elastic/elasticsearch/issues/14882 好电话。我在 2.2 集群上进行测试,它按预期工作。我不知道 2.1.1 及之前版本中的错误。我已经更新了我的答案,以澄清 missing 选项在哪个版本中有效,并包含您提供的错误详细信息的链接。

以上是关于如何在elasticsearch的嵌套聚合中存储空字段和非空字段?的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch聚合的嵌套桶如何排序

elasticsearch 聚合对存储桶键进行排序

(Elasticsearch)如何获取所有文档的嵌套字段的最后一个元素然后执行子聚合

(Elasticsearch)如何获取所有文档的嵌套字段的最后一个元素,然后执行子聚合

从聚合结果中过滤空桶

从 NEST C# 嵌套聚合中获取 Elasticsearch 结果