ElasticSearch-计算聚合桶之间的比率

Orr*_*Orr 4 elasticsearch

我正在使用以下术语汇总来获取每个广告系列的观看次数和点击次数(按campaign_id):

"aggregations": {
"campaigns": {
        "terms": {
    "field": "campaign_id",
    "size": 10,
    "order": {
      "_term": "asc"
    }
  },
  "aggregations": {
    "actions": {
      "terms": {
        "field": "action",
        "size": 10
      }
    }
  }
}}
Run Code Online (Sandbox Code Playgroud)

这是我得到的答复:

   "aggregations": {
  "campaigns": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
        {
           "key": "someId",
           "doc_count": 12,
           "actions": {
              "doc_count_error_upper_bound": 0,
              "sum_other_doc_count": 0,
              "buckets": [
                 {
                    "key": "click",
                    "doc_count": 3
                 },
                 {
                    "key": "view",
                    "doc_count": 9
                 }
              ]
           }
        }
     ]
  }
Run Code Online (Sandbox Code Playgroud)

}

编辑: 这是文档的示例(仅文档的相关部分。):

{
"_index": "action",
"_type": "click",
"_id": "AVI2XOTl8otXlszOjypT",
"_score": 1,
"_source": {
    "ip": "127.0.0.1",
    "timestamp": "2016-01-12T15:03:23.622743524Z",
    "action": "click",
    "campaign_id": "IypmiroC"
}}
Run Code Online (Sandbox Code Playgroud)

我需要能够检索每个广告系列的转化率(点击次数/观看次数),并且不能在客户端执行此操作,因为我需要能够按转化率进行排序。

任何帮助将非常感激。

Chi*_*h25 5

这将需要使用各种aggregationsES 2.x。首先,我将获得带有术语聚合的所有唯一的campaign_id 。然后我过滤actions和获取计数与所述特定行动的文件。然后您需要使用中pipeline aggregation引入ES 2.0,主要是存储桶脚本聚合来获取比率。这就是它的样子。

{
  "size": 0,
  "aggs": {
    "unique_campaign": {
      "terms": {
        "field": "campaign_id",
        "size": 10
      },
      "aggs": {
        "click_bucket": {
          "filter": {
            "term": {
              "action": "click"
            }
          },
          "aggs": {
            "click_count": {
              "value_count": {
                "field": "action"
              }
            }
          }
        },
        "view_bucket": {
          "filter": {
            "term": {
              "action": "view"
            }
          },
          "aggs": {
            "view_count": {
              "value_count": {
                "field": "action"
              }
            }
          }
        },
        "conversion_ratio": {
          "bucket_script": {
            "buckets_path": {
              "total_clicks": "click_bucket>click_count",
              "total_views": "view_bucket>view_count"
            },
            "script": "total_clicks/total_views"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

此外,您还需要具有not_analyzed映射,action因为Click不会匹配click

希望这可以帮助!!