在聚合查询之前,需要设置文本field的fielddata为true

    1. PUT /person/_mapping
    2. {
    3. "properties": {
    4. "tags": {
    5. "type": "text",
    6. "fielddata": true
    7. }
    8. }
    9. }
    • 需求查询每个tag下的人数
      1. GET /person/_search
      2. {
      3. "aggs": {
      4. "group_by_tags": {
      5. "terms": {
      6. "field": "tags"
      7. }
      8. }
      9. }
      10. }
      group_by_tags 是自定义的分组名称。
      搜索结果: ```json { //省略了查询结果 “aggregations” : { “group_by_tags” : {
      1. "doc_count_error_upper_bound" : 0,
      2. "sum_other_doc_count" : 0,
      3. "buckets" : [
      4. {
      5. "key" : "cat",
      6. "doc_count" : 2
      7. },
      8. {
      9. "key" : "cute",
      10. "doc_count" : 2
      11. },
      12. {
      13. "key" : "beatiful",
      14. "doc_count" : 1
      15. },
      16. {
      17. "key" : "boy",
      18. "doc_count" : 1
      19. }
      20. ]
      } } }
    1. - **需求**:查询名称中包含“man”的用户,然后根据tag分组
    2. ```json
    3. GET /person/_search
    4. {
    5. "query": {
    6. "match": {
    7. "name": "man"
    8. }
    9. },
    10. "aggs": {
    11. "group_by_name": {
    12. "terms": {
    13. "field": "tags",
    14. "size": 10
    15. }
    16. }
    17. }
    18. }

    搜索结果

    1. {
    2. //省略了查询结果
    3. "aggregations" : {
    4. "group_by_name" : {
    5. "doc_count_error_upper_bound" : 0,
    6. "sum_other_doc_count" : 0,
    7. "buckets" : [
    8. {
    9. "key" : "beatiful",
    10. "doc_count" : 1
    11. },
    12. {
    13. "key" : "boy",
    14. "doc_count" : 1
    15. },
    16. {
    17. "key" : "cat",
    18. "doc_count" : 1
    19. },
    20. {
    21. "key" : "cute",
    22. "doc_count" : 1
    23. }
    24. ]
    25. }
    26. }
    27. }
    • 需求:先分组,然后再计算平均年龄

      1. GET /person/_search
      2. {
      3. "aggs": {
      4. "group_by_tags": {
      5. "terms": {
      6. "field": "tags",
      7. "size": 10
      8. },
      9. "aggs": {
      10. "avg_age": {
      11. "avg": {
      12. "field": "age"
      13. }
      14. }
      15. }
      16. }
      17. }
      18. }
      1. {
      2. //省略了查询结果
      3. "aggregations" : {
      4. "group_by_tags" : {
      5. "doc_count_error_upper_bound" : 0,
      6. "sum_other_doc_count" : 0,
      7. "buckets" : [
      8. {
      9. "key" : "cat",
      10. "doc_count" : 2,
      11. "avg_age" : {
      12. "value" : 15.0
      13. }
      14. },
      15. {
      16. "key" : "cute",
      17. "doc_count" : 2,
      18. "avg_age" : {
      19. "value" : 22.5
      20. }
      21. },
      22. {
      23. "key" : "beatiful",
      24. "doc_count" : 1,
      25. "avg_age" : {
      26. "value" : 25.0
      27. }
      28. },
      29. {
      30. "key" : "boy",
      31. "doc_count" : 1,
      32. "avg_age" : {
      33. "value" : 10.0
      34. }
      35. }
      36. ]
      37. }
      38. }
      39. }
    • 需求:计算每个person的平均年龄,然后按照平均年龄降序排序

      1. GET /person/_search
      2. {
      3. "aggs": {
      4. "group_by_tags": {
      5. "terms": {
      6. "field": "tags",
      7. "order": {
      8. "avg_key": "desc"
      9. }
      10. },
      11. "aggs": {
      12. "avg_key": {
      13. "avg": {
      14. "field": "age"
      15. }
      16. }
      17. }
      18. }
      19. }
      20. }

      avg_key是自定义的一个值,需要跟聚合的值保持一致。

      1. {
      2. //省略了查询结果
      3. "aggregations" : {
      4. "group_by_tags" : {
      5. "doc_count_error_upper_bound" : 0,
      6. "sum_other_doc_count" : 0,
      7. "buckets" : [
      8. {
      9. "key" : "beatiful",
      10. "doc_count" : 1,
      11. "avg_key" : {
      12. "value" : 25.0
      13. }
      14. },
      15. {
      16. "key" : "cute",
      17. "doc_count" : 2,
      18. "avg_key" : {
      19. "value" : 22.5
      20. }
      21. },
      22. {
      23. "key" : "cat",
      24. "doc_count" : 2,
      25. "avg_key" : {
      26. "value" : 15.0
      27. }
      28. },
      29. {
      30. "key" : "boy",
      31. "doc_count" : 1,
      32. "avg_key" : {
      33. "value" : 10.0
      34. }
      35. }
      36. ]
      37. }
      38. }
      39. }
    • 需求:根据指定年龄范围分组,然后每组内再根据tag进行分组,最后计算没组的平均年龄

      1. GET /person/_search
      2. {
      3. "aggs": {
      4. "range_age": {
      5. "range": {
      6. "field": "age",
      7. "ranges": [
      8. {
      9. "from": 10,
      10. "to": 20
      11. },
      12. {
      13. "from": 20,
      14. "to": 30
      15. },
      16. {
      17. "from": 30,
      18. "to": 40
      19. }
      20. ]
      21. },
      22. "aggs": {
      23. "group_by_tags": {
      24. "terms": {
      25. "field": "tags",
      26. "size": 10
      27. },
      28. "aggs": {
      29. "avg_age": {
      30. "avg": {
      31. "field": "age"
      32. }
      33. }
      34. }
      35. }
      36. }
      37. }
      38. }
      39. }
      1. {
      2. //省略了查询结果
      3. "aggregations" : {
      4. "range_age" : {
      5. "buckets" : [
      6. {
      7. "key" : "10.0-20.0",
      8. "from" : 10.0,
      9. "to" : 20.0,
      10. "doc_count" : 1,
      11. "group_by_tags" : {
      12. "doc_count_error_upper_bound" : 0,
      13. "sum_other_doc_count" : 0,
      14. "buckets" : [
      15. {
      16. "key" : "boy",
      17. "doc_count" : 1,
      18. "avg_age" : {
      19. "value" : 10.0
      20. }
      21. },
      22. {
      23. "key" : "cat",
      24. "doc_count" : 1,
      25. "avg_age" : {
      26. "value" : 10.0
      27. }
      28. }
      29. ]
      30. }
      31. },
      32. {
      33. "key" : "20.0-30.0",
      34. "from" : 20.0,
      35. "to" : 30.0,
      36. "doc_count" : 2,
      37. "group_by_tags" : {
      38. "doc_count_error_upper_bound" : 0,
      39. "sum_other_doc_count" : 0,
      40. "buckets" : [
      41. {
      42. "key" : "cute",
      43. "doc_count" : 2,
      44. "avg_age" : {
      45. "value" : 22.5
      46. }
      47. },
      48. {
      49. "key" : "beatiful",
      50. "doc_count" : 1,
      51. "avg_age" : {
      52. "value" : 25.0
      53. }
      54. },
      55. {
      56. "key" : "cat",
      57. "doc_count" : 1,
      58. "avg_age" : {
      59. "value" : 20.0
      60. }
      61. }
      62. ]
      63. }
      64. },
      65. {
      66. "key" : "30.0-40.0",
      67. "from" : 30.0,
      68. "to" : 40.0,
      69. "doc_count" : 0,
      70. "group_by_tags" : {
      71. "doc_count_error_upper_bound" : 0,
      72. "sum_other_doc_count" : 0,
      73. "buckets" : [ ]
      74. }
      75. }
      76. ]
      77. }
      78. }
      79. }