2016-02-05 66 views
0

我们正在使用多层聚合。我们有城市桶,每桶有桶级。 对于很少的文档类为空,在这种情况下为城市返回空桶。请参考以下回应:在多层聚合中返回空字段的文档

样本输出:

"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":[ 
 
      
 
       
 
      
 
      ] 
 
     } 
 
     }, 
 
    ] 
 
     
 
    
 
    } 
 
}

这里重点城市2具有类的空桶为下重点城市2的所有文件都有外地市空。但我们有一个文件数。 我们怎样才能返回斗下的文档时条件字段为空

更新: 类字段映射:

"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" 
         } 
        } 
       } 

请参考映射来解决这个问题。

回答

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,而不是以前的版本。

+0

目前我们正在使用ES 1.4。我们如何在ES的较低版本中实现这一点 –

+1

您可以修改您的映射类型并包含['null_value'设置](https://www.elastic.co/guide/en/elasticsearch/reference/1.4/mapping-core -types.html)放在'class_field'映射中,以便在文档不包含它或具有空值的情况下在索引时为该字段赋予一个非空值。不过,您需要在更改此设置后重新索引数据。 – Val

+0

我们不想修改映射,因为这意味着我们将不得不添加一些逻辑来删除null_value属性中设置的值。有什么方法可以使用聚合查询 –