【问题标题】:Return Documents with Null Field in Multi Level Aggregation在多级聚合中返回具有空字段的文档
【发布时间】:2016-05-14 22:22:55
【问题描述】:

我们正在使用多级聚合。我们有 Buckets of City,每个 Bucket 都有 Buckets of Class。 对于少数文档,Class 为 Null,在这种情况下,将为 City 返回一个空桶。请参考以下回复:

样本输出:

"aggregations":
{
  "CITY":{
    "buckets":[
      {
        "key":"CITY 1",
        "doc_count":2
        "CLASS":{
          "buckets":[
            {
              "key":"CLASS A",
              "top_tag_hits":{
                
              }
            }
          ]
        }
      },
      {
        "key":"CITY 2",
        "doc_count":2
        "CLASS":{
          "buckets":[
            
              
            
          ]
        }
      },
    ]
      
    
  }
}

这里的键 CITY 2 有一个空的 CLASS 桶,因为键 CITY 2 下的所有文档的字段 CITY 为空。但是我们有一个文档计数。 当terms字段为null时如何返回桶下的文档

更新: CLASS 的字段映射:

"CLASS":
        {
                    "type": "string",

                    "index_analyzer": "text_with_autocomplete_analyzer",
                    "search_analyzer": "text_standard_analyzer",
                    "fields": {
                        "raw": {
                            "type": "string",
                             "null_value" : "na",
                            "index": "not_analyzed"
                        },
                        "partial_matching": {
                            "type": "string",
                            "index_analyzer": "text_with_partial_matching_analyzer",
                            "search_analyzer": "text_standard_analyzer"
                        }
                    }
                }

请参考映射解决问题。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可以使用missing settingterms 聚合来处理具有缺失值的存储桶。所以在你的情况下,你会这样做:

    {
      "aggs": {
        "CITY": {
          "terms": {
            "field": "city_field"
          },
          "aggs": {
            "CLASS": {
              "terms": {
                "field": "class_field",
                "missing": "NO_CLASS"
              }
            }
          }
        }
      }
    }
    

    使用此设置,所有没有class_field 字段(或空值)的文档都将放在NO_CLASS 存储桶中。

    PS:请注意,这仅适用于 ES 2.0 之后的版本,而不适用于之前的版本。

    【讨论】:

    • 目前我们使用的是 ES 1.4。我们如何在较低版本的 ES 中实现这一点
    • 您可以修改您的映射类型并将null_value setting 包含在您的class_field 映射中,以便在索引时为该字段提供非空值,以防文档不包含它或具有空值。不过,您需要在更改此设置后重新索引您的数据。
    • 我们不想修改映射,因为这意味着我们必须添加一些逻辑来删除 null_value 属性中设置的值。有什么方法可以使用聚合查询
    • 但您可能误解了null_value 的设置。您的文档的来源根本不会被修改,因此您不必修改逻辑来删除该值。 null_value 只会被索引,以便您可以找到该文档并在该字段上聚合。
    • 但是您可能正在聚合raw 子字段,不是吗?如果是这种情况,您需要将 null_value 设置移动到 raw 子字段。
    猜你喜欢
    • 2015-01-04
    • 2013-05-06
    • 1970-01-01
    • 2013-10-26
    • 2021-08-10
    • 1970-01-01
    • 2023-03-05
    • 2014-01-29
    • 1970-01-01
    相关资源
    最近更新 更多