値のカウント集約

集約されたドキュメントから抽出された値の数をカウントする single-value メトリクス集約です。これらの値は、ドキュメント内の特定のフィールドから抽出されるか、提供されたスクリプトによって生成されることがあります。通常、この集約器は他の単一値集約と組み合わせて使用されます。たとえば、avg を計算する際には、平均が計算される値の数に関心があるかもしれません。

value_count は値を重複排除しないため、フィールドに重複があっても各値は個別にカウントされます。

Python

  1. resp = client.search(
  2. index="sales",
  3. size="0",
  4. aggs={
  5. "types_count": {
  6. "value_count": {
  7. "field": "type"
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. types_count: {
  7. value_count: {
  8. field: 'type'
  9. }
  10. }
  11. }
  12. }
  13. )
  14. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithIndex("sales"),
  3. es.Search.WithBody(strings.NewReader(`{
  4. "aggs": {
  5. "types_count": {
  6. "value_count": {
  7. "field": "type"
  8. }
  9. }
  10. }
  11. }`)),
  12. es.Search.WithSize(0),
  13. es.Search.WithPretty(),
  14. )
  15. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. types_count: {
  6. value_count: {
  7. field: "type",
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. POST /sales/_search?size=0
  2. {
  3. "aggs" : {
  4. "types_count" : { "value_count" : { "field" : "type" } }
  5. }
  6. }

レスポンス:

コンソール結果

  1. {
  2. ...
  3. "aggregations": {
  4. "types_count": {
  5. "value": 7
  6. }
  7. }
  8. }

集約の名前(上記の types_count)は、返されたレスポンスから集約結果を取得するためのキーとしても機能します。

スクリプト

単一フィールドの値よりも複雑なものをカウントする必要がある場合は、ランタイムフィールドで集約を実行する必要があります。

Python

  1. resp = client.search(
  2. index="sales",
  3. size=0,
  4. runtime_mappings={
  5. "tags": {
  6. "type": "keyword",
  7. "script": "\n emit(doc['type'].value);\n if (doc['promoted'].value) {\n emit('hot');\n }\n "
  8. }
  9. },
  10. aggs={
  11. "tags_count": {
  12. "value_count": {
  13. "field": "tags"
  14. }
  15. }
  16. },
  17. )
  18. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. body: {
  4. size: 0,
  5. runtime_mappings: {
  6. tags: {
  7. type: 'keyword',
  8. script: "\n emit(doc['type'].value);\n if (doc['promoted'].value) {\n emit('hot');\n }\n "
  9. }
  10. },
  11. aggregations: {
  12. tags_count: {
  13. value_count: {
  14. field: 'tags'
  15. }
  16. }
  17. }
  18. }
  19. )
  20. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. runtime_mappings: {
  5. tags: {
  6. type: "keyword",
  7. script:
  8. "\n emit(doc['type'].value);\n if (doc['promoted'].value) {\n emit('hot');\n }\n ",
  9. },
  10. },
  11. aggs: {
  12. tags_count: {
  13. value_count: {
  14. field: "tags",
  15. },
  16. },
  17. },
  18. });
  19. console.log(response);

コンソール

  1. POST /sales/_search
  2. {
  3. "size": 0,
  4. "runtime_mappings": {
  5. "tags": {
  6. "type": "keyword",
  7. "script": """
  8. emit(doc['type'].value);
  9. if (doc['promoted'].value) {
  10. emit('hot');
  11. }
  12. """
  13. }
  14. },
  15. "aggs": {
  16. "tags_count": {
  17. "value_count": {
  18. "field": "tags"
  19. }
  20. }
  21. }
  22. }

ヒストグラムフィールド

value_count 集約が ヒストグラムフィールド に対して計算されると、集約の結果はヒストグラムの counts 配列内のすべての数値の合計になります。

たとえば、異なるネットワークのレイテンシメトリクスを持つ事前集約されたヒストグラムを保存する次のインデックスの場合:

Python

  1. resp = client.index(
  2. index="metrics_index",
  3. id="1",
  4. document={
  5. "network.name": "net-1",
  6. "latency_histo": {
  7. "values": [
  8. 0.1,
  9. 0.2,
  10. 0.3,
  11. 0.4,
  12. 0.5
  13. ],
  14. "counts": [
  15. 3,
  16. 7,
  17. 23,
  18. 12,
  19. 6
  20. ]
  21. }
  22. },
  23. )
  24. print(resp)
  25. resp1 = client.index(
  26. index="metrics_index",
  27. id="2",
  28. document={
  29. "network.name": "net-2",
  30. "latency_histo": {
  31. "values": [
  32. 0.1,
  33. 0.2,
  34. 0.3,
  35. 0.4,
  36. 0.5
  37. ],
  38. "counts": [
  39. 8,
  40. 17,
  41. 8,
  42. 7,
  43. 6
  44. ]
  45. }
  46. },
  47. )
  48. print(resp1)
  49. resp2 = client.search(
  50. index="metrics_index",
  51. size="0",
  52. aggs={
  53. "total_requests": {
  54. "value_count": {
  55. "field": "latency_histo"
  56. }
  57. }
  58. },
  59. )
  60. print(resp2)

Ruby

  1. response = client.index(
  2. index: 'metrics_index',
  3. id: 1,
  4. body: {
  5. 'network.name' => 'net-1',
  6. latency_histo: {
  7. values: [
  8. 0.1,
  9. 0.2,
  10. 0.3,
  11. 0.4,
  12. 0.5
  13. ],
  14. counts: [
  15. 3,
  16. 7,
  17. 23,
  18. 12,
  19. 6
  20. ]
  21. }
  22. }
  23. )
  24. puts response
  25. response = client.index(
  26. index: 'metrics_index',
  27. id: 2,
  28. body: {
  29. 'network.name' => 'net-2',
  30. latency_histo: {
  31. values: [
  32. 0.1,
  33. 0.2,
  34. 0.3,
  35. 0.4,
  36. 0.5
  37. ],
  38. counts: [
  39. 8,
  40. 17,
  41. 8,
  42. 7,
  43. 6
  44. ]
  45. }
  46. }
  47. )
  48. puts response
  49. response = client.search(
  50. index: 'metrics_index',
  51. size: 0,
  52. body: {
  53. aggregations: {
  54. total_requests: {
  55. value_count: {
  56. field: 'latency_histo'
  57. }
  58. }
  59. }
  60. }
  61. )
  62. puts response

Go

  1. {
  2. res, err := es.Index(
  3. "metrics_index",
  4. strings.NewReader(`{
  5. "network.name": "net-1",
  6. "latency_histo": {
  7. "values": [
  8. 0.1,
  9. 0.2,
  10. 0.3,
  11. 0.4,
  12. 0.5
  13. ],
  14. "counts": [
  15. 3,
  16. 7,
  17. 23,
  18. 12,
  19. 6
  20. ]
  21. }
  22. }`),
  23. es.Index.WithDocumentID("1"),
  24. es.Index.WithPretty(),
  25. )
  26. fmt.Println(res, err)
  27. }
  28. {
  29. res, err := es.Index(
  30. "metrics_index",
  31. strings.NewReader(`{
  32. "network.name": "net-2",
  33. "latency_histo": {
  34. "values": [
  35. 0.1,
  36. 0.2,
  37. 0.3,
  38. 0.4,
  39. 0.5
  40. ],
  41. "counts": [
  42. 8,
  43. 17,
  44. 8,
  45. 7,
  46. 6
  47. ]
  48. }
  49. }`),
  50. es.Index.WithDocumentID("2"),
  51. es.Index.WithPretty(),
  52. )
  53. fmt.Println(res, err)
  54. }
  55. {
  56. res, err := es.Search(
  57. es.Search.WithIndex("metrics_index"),
  58. es.Search.WithBody(strings.NewReader(`{
  59. "aggs": {
  60. "total_requests": {
  61. "value_count": {
  62. "field": "latency_histo"
  63. }
  64. }
  65. }
  66. }`)),
  67. es.Search.WithSize(0),
  68. es.Search.WithPretty(),
  69. )
  70. fmt.Println(res, err)
  71. }

Js

  1. const response = await client.index({
  2. index: "metrics_index",
  3. id: 1,
  4. document: {
  5. "network.name": "net-1",
  6. latency_histo: {
  7. values: [0.1, 0.2, 0.3, 0.4, 0.5],
  8. counts: [3, 7, 23, 12, 6],
  9. },
  10. },
  11. });
  12. console.log(response);
  13. const response1 = await client.index({
  14. index: "metrics_index",
  15. id: 2,
  16. document: {
  17. "network.name": "net-2",
  18. latency_histo: {
  19. values: [0.1, 0.2, 0.3, 0.4, 0.5],
  20. counts: [8, 17, 8, 7, 6],
  21. },
  22. },
  23. });
  24. console.log(response1);
  25. const response2 = await client.search({
  26. index: "metrics_index",
  27. size: 0,
  28. aggs: {
  29. total_requests: {
  30. value_count: {
  31. field: "latency_histo",
  32. },
  33. },
  34. },
  35. });
  36. console.log(response2);

コンソール

  1. PUT metrics_index/_doc/1
  2. {
  3. "network.name" : "net-1",
  4. "latency_histo" : {
  5. "values" : [0.1, 0.2, 0.3, 0.4, 0.5],
  6. "counts" : [3, 7, 23, 12, 6]
  7. }
  8. }
  9. PUT metrics_index/_doc/2
  10. {
  11. "network.name" : "net-2",
  12. "latency_histo" : {
  13. "values" : [0.1, 0.2, 0.3, 0.4, 0.5],
  14. "counts" : [8, 17, 8, 7, 6]
  15. }
  16. }
  17. POST /metrics_index/_search?size=0
  18. {
  19. "aggs": {
  20. "total_requests": {
  21. "value_count": { "field": "latency_histo" }
  22. }
  23. }
  24. }

各ヒストグラムフィールドに対して、value_count 集約は counts 配列内のすべての数値を合計します。最終的に、すべてのヒストグラムのすべての値を加算し、次の結果を返します:

コンソール結果

  1. {
  2. ...
  3. "aggregations": {
  4. "total_requests": {
  5. "value": 97
  6. }
  7. }
  8. }