我正在使用Elasticsearch 1.7.3累积用于分析报告的数据。
我有一个包含文档的索引,其中每个文档都有一个名为“ duration”的数字字段(请求花费了几毫秒)和一个名为“ component”的字符串字段。可能有许多具有相同组件名称的文档。
例如。
{"component": "A", "duration": 10} {"component": "B", "duration": 27} {"component": "A", "duration": 5} {"component": "C", "duration": 2}
我想生成一份报告,说明每个组件:
此组件的所有“持续时间”字段的总和。
A: 15 B: 27 C: 2
此总和在 所有 文档的总期限中所占的百分比。在我的例子中
A: (10+5) / (10+27+5+2) * 100 B: 27 / (10+27+5+2) * 100 C: 2 / (10+27+5+2) * 100
在每个组件中占每个组件的文档百分比。
A: 2 / 4 * 100 B: 1 / 4 * 100 C: 1 / 4 * 100
如何使用Elasticsearch 1.7.3做到这一点?
使用ES 1.7.3,无法基于两个不同聚合的结果来计算数据,但是,在ES 2.0中,可以使用管道聚合来完成此操作。
但是,您要问的内容并不太复杂,无法在客户端使用1.7.3进行。如果使用下面的查询,您将获得获得期望数字所需要的一切:
POST components/_search { "size": 0, "aggs": { "total_duration": { "sum": { "field": "duration" } }, "components": { "terms": { "field": "component" }, "aggs": { "duration_sum": { "sum": { "field": "duration" } } } } } }
结果将如下所示:
{ "took": 1, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 4, "max_score": 0, "hits": [] }, "aggregations": { "total_duration": { "value": 44 }, "components": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "a", "doc_count": 2, "duration_sum": { "value": 15 } }, { "key": "b", "doc_count": 1, "duration_sum": { "value": 27 } }, { "key": "c", "doc_count": 1, "duration_sum": { "value": 2 } } ] } } }
现在,您需要做的只是以下内容。我正在使用JavaScript,但是您可以使用任何其他可以读取JSON的语言来执行此操作。
var response = ...the JSON response above... var total_duration = response.aggregations.total_duration.value; var total_docs = response.hits.total; response.aggregations.components.buckets.forEach(function(comp_stats) { // total duration for the component var total_duration_comp = comp_stats.duration_sum.value; // percentage duration of the component var perc_duration_comp = total_duration_comp / total_duration * 100; // percentage documents for the component var perc_doc_comp = comp_stats.doc_count / total_docs * 100; });