弹性搜索数据聚合

时间:2014-10-28 09:45:30

标签: elasticsearch aggregation

在索引中输入以下示例:

{
"_index": "aggs_20141028",
"_type": "aggobj",
"_id": "4aNpd7zlR5eTdA7o2I898A",
"_version": 1,
"_score": 1,
"_source": {
    "UserId": 4,
    "Created": "2014-10-28T09:40:22.0652362+02:00",
    "Path": "Path_0",
    "IntProp1": 1,
    "IntProp2": 87,
    "IntProp3": 903,
    "BoolProp1": false,
    "BoolProp2": true,
    "BoolProp3": false,
    "StringProp1": "StringProp_6",
    "StringProp2": "StringProp_6",
    "StringProp3": "StringProp_3"
    }
}

如何在以下用例中聚合数据?

  1. 按用户聚合BoolProp(计数)组,时间段(例如,日,月),过滤开始日期
  2. 聚合BoolProp(计数)组时间段(例如,日,月),过滤初始日期,userId
  3. 按内容属性聚合BoolProp(计数)组,时间段(例如,日,月),过滤器启动日期
  4. 按路径,时间段,在startdate上过滤
  5. 聚合IntProp(总和)组

    原始ES文档很难理解...... http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-sum-aggregation.html

1 个答案:

答案 0 :(得分:0)

您的数据中没有字段startdate - 我假设您的意思是Created? 你还有三个BoolProp字段都是布尔值 - 你不清楚你想要如何计算它们,例如你在考虑他们是否在场,是真的吗?

size字段取决于数据的大小,需要调整。

以下是我接近第一个要求的方法:

curl -XGET 'http://localhost:9200/aggs_20141028/aggobj/_search?pretty' -d '{
  "aggs": {
     "date_filter_agg": {
         "filter" : {
            "term": { "Created": "2014-10-28T09:40:22.0652362+02:00" }},
      "aggs" : {
       "user_agg" : {
         "terms": {"size": 0, "field" : "UserId"},
         "aggs" : {
             "date_agg": {  
                "date_histogram" : { "field" : "Created", "interval" : "month" },
                "aggs" : {
                    "BoolProp_count": {"sum" : {"script" : "(doc[\"BoolProp1\"].value == \"T\" ? 1 : 0) + (doc[\"BoolProp2\"].value == \"T\" ? 1 : 0) + (doc[\"BoolProp3\"].value == \"T\" ? 1 : 0)"} }  }}
}}}}}}}'

需要注意的关键事项 -

  1. 首先显示日期过滤器,并在所有搜索结果上运行。
  2. 然后按UserId对结果进行分组,然后按
  3. 中的创建数据进行分组
  4. 每月存储桶最后一个字段是您想要的值的计算
  5. 返回的值是最后一个,即真正的BoolProp字段的数量。
  6. 其他要求的答案应该非常相似。