2016-02-11 168 views
1

我在弹性搜索中有以下一组嵌套子集(field2是field1的subaggregation,field3是field2的subaggregation)。 然而,事实证明,字段3的术语聚合不会存储没有字段3的文档。如何在elasticsearch中嵌套聚合中填充空和非空字段?

我的理解是我必须使用Missing subaggregation查询来除了术语query for field3之外的那些查询。

但我不知道如何将它添加到下面的查询中以便同时存储。

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

回答

3

在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集群,您可以使用missing aggregation在同一深度为您field3聚集到一桶缺少“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 
       } 
      } 
      } 
     } 
     } 
+0

我在2.1.1版本,但不幸的是,新办法不在内部层面上工作看到这个问题https://github.com/elastic/elasticsearch/issues/14882 – user2175783

+0

好的电话。我正在2.2集群上进行测试,并按预期工作。我并不知道2.1.1和之前的错误。我已经更新了我的答案,以澄清在哪个版本中,“missing”选项有效,并包含您提供给错误详细信息的链接。 – BrookeB