2014-02-22 220 views
2

是否可以在弹性搜索中定义聚合函数?ElasticSearch聚合函数

E.g.数据:

author weekday status 
me  monday ok 
me  tuesday ok 
me  moday bad 

我想根据作者和平日得到聚集,并作为一种价值我想状态字段的串联:

agg1 agg2 value 
me monday ok,bad 
me tuesday ok 

我知道你能做的数量,而且可以定义另一个用于聚合的函数吗?编辑/回答:看起来ES中没有多行聚合支持,因此我们不得不在最后一个字段使用subaggregation(参见Akshay的示例)。如果你需要更复杂的聚合函数,然后按ID聚合(注意,你将无法使用_id,所以你必须在其他领域复制它) - 这样你就可以进行高级汇总每个存储桶中的单个项目。

+1

一个方面应该是能够做到这一点 – phoet

回答

2

通过使用1.0中的sub aggregations可以大致获得想要的结果。假设文档结构作者,平日和状态,你可以使用下面的聚合:

{ 
    "size": 0, 
    "aggs": { 
    "author": { 
     "terms": { 
     "field": "author" 
     }, 
     "aggs": { 
     "days": { 
      "terms": { 
      "field": "weekday" 
      }, 
      "aggs": { 
      "status": { 
       "terms": { 
       "field": "status" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

它给你以下结果:

{ 
    ... 
    "aggregations": { 
     "author": { 
     "buckets": [ 
      { 
       "key": "me", 
       "doc_count": 3, 
       "days": { 
        "buckets": [ 
        { 
         "key": "monday", 
         "doc_count": 2, 
         "status": { 
          "buckets": [ 
           { 
           "key": "bad", 
           "doc_count": 1 
           }, 
           { 
           "key": "ok", 
           "doc_count": 1 
           } 
          ] 
         } 
        }, 
        { 
         "key": "tuesday", 
         "doc_count": 1, 
         "status": { 
          "buckets": [ 
           { 
           "key": "ok", 
           "doc_count": 1 
           } 
          ] 
         } 
        } 
        ] 
       } 
      } 
     ] 
     } 
    } 
} 
+0

呀,这几乎是我所做的。该解决方案仍然需要处理客户端的最后一部分桶。 –