Elasticsearch 分析百分比
Elasticsearch analytics percent
我正在使用 Elasticsearch 1.7.3 为分析报告收集数据。
我有一个保存文档的索引,其中每个文档都有一个名为 'duration' 的数字字段(请求花费了多少毫秒),以及一个名为 'component' 的字符串字段。可以有多个具有相同组件名称的文档。
例如
{"component": "A", "duration": 10}
{"component": "B", "duration": 27}
{"component": "A", "duration": 5}
{"component": "C", "duration": 2}
我想生成一份报告,说明每个组件:
该组件的所有 'duration' 个字段的总和。
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 中可以使用 pipeline aggregations 完成此操作。
但是,您所要求的在客户端使用 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;
});
在ElasticSearch[2.x]中,您可以使用bucket script aggregation,完全满足您的需求!
例如:
{
"bucket_script": {
"buckets_path": {
"my_var1": "the_sum",
"my_var2": "the_value_count"
},
"script": "my_var1 / my_var2"
}
}
详情:
POST /sales/_search
{
"size": 0,
"aggs" : {
"sales_per_month" : {
"date_histogram" : {
"field" : "date",
"interval" : "month"
},
"aggs": {
"total_sales": {
"sum": {
"field": "price"
}
},
"t-shirts": {
"filter": {
"term": {
"type": "t-shirt"
}
},
"aggs": {
"sales": {
"sum": {
"field": "price"
}
}
}
},
"t-shirt-percentage": {
"bucket_script": {
"buckets_path": {
"tShirtSales": "t-shirts>sales",
"totalSales": "total_sales"
},
"script": "params.tShirtSales / params.totalSales * 100"
}
}
}
}
}
}
我正在使用 Elasticsearch 1.7.3 为分析报告收集数据。
我有一个保存文档的索引,其中每个文档都有一个名为 'duration' 的数字字段(请求花费了多少毫秒),以及一个名为 'component' 的字符串字段。可以有多个具有相同组件名称的文档。
例如
{"component": "A", "duration": 10}
{"component": "B", "duration": 27}
{"component": "A", "duration": 5}
{"component": "C", "duration": 2}
我想生成一份报告,说明每个组件:
该组件的所有 'duration' 个字段的总和。
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 中可以使用 pipeline aggregations 完成此操作。
但是,您所要求的在客户端使用 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;
});
在ElasticSearch[2.x]中,您可以使用bucket script aggregation,完全满足您的需求!
例如:
{
"bucket_script": {
"buckets_path": {
"my_var1": "the_sum",
"my_var2": "the_value_count"
},
"script": "my_var1 / my_var2"
}
}
详情:
POST /sales/_search
{
"size": 0,
"aggs" : {
"sales_per_month" : {
"date_histogram" : {
"field" : "date",
"interval" : "month"
},
"aggs": {
"total_sales": {
"sum": {
"field": "price"
}
},
"t-shirts": {
"filter": {
"term": {
"type": "t-shirt"
}
},
"aggs": {
"sales": {
"sum": {
"field": "price"
}
}
}
},
"t-shirt-percentage": {
"bucket_script": {
"buckets_path": {
"tShirtSales": "t-shirts>sales",
"totalSales": "total_sales"
},
"script": "params.tShirtSales / params.totalSales * 100"
}
}
}
}
}
}