ElasticSearch 聚合函数

Posted

技术标签:

【中文标题】ElasticSearch 聚合函数【英文标题】:ElasticSearch aggregation function 【发布时间】:2014-02-22 21:40:20 【问题描述】:

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

例如数据:

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

我想获得基于作者和工作日的聚合,并且作为值我想获得状态字段的连接:

agg1 agg2    value
me   monday  ok,bad
me   tuesday ok

我知道你可以做计数,但是可以定义另一个用于聚合的函数吗?

编辑/回答:看起来 ES 中没有多行聚合支持,因此我们必须在最后一个字段上使用子聚合(参见 Akshay 的示例)。如果您需要更复杂的聚合函数,则按 id 聚合(注意,您将无法使用 _id,因此您必须在其他字段中复制它) - 这样您就可以进行高级操作聚合每个桶中的单个项目。

【问题讨论】:

一个方面应该可以做到这一点 【参考方案1】:

您可以使用 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
                              
                           ]
                        
                     
                  ]
               
            
         ]
      
   

【讨论】:

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

以上是关于ElasticSearch 聚合函数的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch:Geo-grid query - Elastic Stack 8.3

Elasticsearch基于儿童积木玩具图解 Elasticsearch 聚合

Elastic Search 基本操作

go-elasticsearch连接查询聚合elasticsearch

Elasticsearch:使用 Java 来对 Elasticsearch 索引进行聚合

Elasticsearch:使用 Java 来对 Elasticsearch 索引进行聚合