Range Aggregation(范围聚合)

原文链接 : https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-range-aggregation.html

译文链接 : http://www.apache.wiki/display/Elasticsearch(修改该链接为 ApacheCN 对应的译文链接)

贡献者 : @于永超,ApacheCNApache中文网

Range Aggregation

A multi-bucket value source based aggregation that enables the user to define a set of ranges-每个代表一个bucket。在聚合过程中,从每个文件中提取的值将根据每个存储区范围进行检查,并对相关/匹配文档进行“bucket”,值得注意的是,注意,此聚合包含了from值,不包括每个范围的to的值。

例子:

  1. {
  2. "aggs" : {
  3. "price_ranges" : {
  4. "range" : {
  5. "field" : "price",
  6. "ranges" : [
  7. { "to" : 50 },
  8. { "from" : 50, "to" : 100 },
  9. { "from" : 100 }
  10. ]
  11. }
  12. }
  13. }
  14. }

响应结果:

  1. {
  2. ...
  3. "aggregations": {
  4. "price_ranges" : {
  5. "buckets": [
  6. {
  7. "to": 50,
  8. "doc_count": 2
  9. },
  10. {
  11. "from": 50,
  12. "to": 100,
  13. "doc_count": 4
  14. },
  15. {
  16. "from": 100,
  17. "doc_count": 4
  18. }
  19. ]
  20. }
  21. }
  22. }

Keyed Response

将keyed标志设置为true会将一个惟一的字符串键与每个bucket关联起来,并将范围作为散列而不是数组返回:

  1. {
  2. "aggs" : {
  3. "price_ranges" : {
  4. "range" : {
  5. "field" : "price",
  6. "keyed" : true,
  7. "ranges" : [
  8. { "to" : 50 },
  9. { "from" : 50, "to" : 100 },
  10. { "from" : 100 }
  11. ]
  12. }
  13. }
  14. }
  15. }

响应结果:

  1. {
  2. ...
  3. "aggregations": {
  4. "price_ranges" : {
  5. "buckets": {
  6. "*-50.0": {
  7. "to": 50,
  8. "doc_count": 2
  9. },
  10. "50.0-100.0": {
  11. "from": 50,
  12. "to": 100,
  13. "doc_count": 4
  14. },
  15. "100.0-*": {
  16. "from": 100,
  17. "doc_count": 4
  18. }
  19. }
  20. }
  21. }
  22. }

可以为每个范围自定义key:

  1. {
  2. "aggs" : {
  3. "price_ranges" : {
  4. "range" : {
  5. "field" : "price",
  6. "keyed" : true,
  7. "ranges" : [
  8. { "key" : "cheap", "to" : 50 },
  9. { "key" : "average", "from" : 50, "to" : 100 },
  10. { "key" : "expensive", "from" : 100 }
  11. ]
  12. }
  13. }
  14. }
  15. }

Script

  1. {
  2. "aggs" : {
  3. "price_ranges" : {
  4. "range" : {
  5. "script" : {
  6. "lang": "painless",
  7. "inline": "doc['price'].value"
  8. },
  9. "ranges" : [
  10. { "to" : 50 },
  11. { "from" : 50, "to" : 100 },
  12. { "from" : 100 }
  13. ]
  14. }
  15. }
  16. }
  17. }

这将把script参数解释为具有painless脚本语言和no script参数的inline脚本。要使用文件脚本,请使用以下语法

  1. {
  2. "aggs" : {
  3. "price_ranges" : {
  4. "range" : {
  5. "script" : {
  6. "file": "my_script",
  7. "params": {
  8. "field": "price"
  9. }
  10. },
  11. "ranges" : [
  12. { "to" : 50 },
  13. { "from" : 50, "to" : 100 },
  14. { "from" : 100 }
  15. ]
  16. }
  17. }
  18. }
  19. }

对于索引脚本,用id参数替换file参数。

Value Script

假设产品价格是美元,但我们希望得到欧元的价格区间,我们可以使用value script在聚合之前转换价格(假设汇率是0.8)

  1. {
  2. "aggs" : {
  3. "price_ranges" : {
  4. "range" : {
  5. "field" : "price",
  6. "script" : {
  7. "lang": "painless",
  8. "inline": "_value * params.conversion_rate",
  9. "params" : {
  10. "conversion_rate" : 0.8
  11. }
  12. },
  13. "ranges" : [
  14. { "to" : 35 },
  15. { "from" : 35, "to" : 70 },
  16. { "from" : 70 }
  17. ]
  18. }
  19. }
  20. }
  21. }

Sub Aggregations

下面的示例不仅将文档“bucket”到不同的bucket,而且计算每个价格范围内的价格统计

  1. {
  2. "aggs" : {
  3. "price_ranges" : {
  4. "range" : {
  5. "field" : "price",
  6. "ranges" : [
  7. { "to" : 50 },
  8. { "from" : 50, "to" : 100 },
  9. { "from" : 100 }
  10. ]
  11. },
  12. "aggs" : {
  13. "price_stats" : {
  14. "stats" : { "field" : "price" }
  15. }
  16. }
  17. }
  18. }
  19. }

响应结果:

  1. {
  2. "aggregations": {
  3. "price_ranges" : {
  4. "buckets": [
  5. {
  6. "to": 50,
  7. "doc_count": 2,
  8. "price_stats": {
  9. "count": 2,
  10. "min": 20,
  11. "max": 47,
  12. "avg": 33.5,
  13. "sum": 67
  14. }
  15. },
  16. {
  17. "from": 50,
  18. "to": 100,
  19. "doc_count": 4,
  20. "price_stats": {
  21. "count": 4,
  22. "min": 60,
  23. "max": 98,
  24. "avg": 82.5,
  25. "sum": 330
  26. }
  27. },
  28. {
  29. "from": 100,
  30. "doc_count": 4,
  31. "price_stats": {
  32. "count": 4,
  33. "min": 134,
  34. "max": 367,
  35. "avg": 216,
  36. "sum": 864
  37. }
  38. }
  39. ]
  40. }
  41. }
  42. }

如果sub aggregation(子集合)也基于与范围聚合相同的值(如上例中的统计信息聚合),则可以省略其值的定义。以下内容将返回与上述相同的结果

  1. {
  2. "aggs" : {
  3. "price_ranges" : {
  4. "range" : {
  5. "field" : "price",
  6. "ranges" : [
  7. { "to" : 50 },
  8. { "from" : 50, "to" : 100 },
  9. { "from" : 100 }
  10. ]
  11. },
  12. "aggs" : {
  13. "price_stats" : {
  14. "stats" : {} 1
  15. }
  16. }
  17. }
  18. }
  19. }

#1 我们不需要指定price,因为我们默认从父范围聚合“继承”它