統計集計

集約された文書から抽出された数値に基づいて統計を計算する multi-value メトリクス集計です。

返される統計は、minmaxsumcount、および avg で構成されています。

データが学生の試験成績(0から100の間)を表す文書で構成されていると仮定します。

Python

  1. resp = client.search(
  2. index="exams",
  3. size="0",
  4. aggs={
  5. "grades_stats": {
  6. "stats": {
  7. "field": "grade"
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

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

Js

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

コンソール

  1. POST /exams/_search?size=0
  2. {
  3. "aggs": {
  4. "grades_stats": { "stats": { "field": "grade" } }
  5. }
  6. }

上記の集計は、すべての文書に対する成績統計を計算します。集計タイプは stats で、field 設定は統計が計算される文書の数値フィールドを定義します。上記は次の結果を返します:

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "grades_stats": {
  5. "count": 2,
  6. "min": 50.0,
  7. "max": 100.0,
  8. "avg": 75.0,
  9. "sum": 150.0
  10. }
  11. }
  12. }

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

スクリプト

単一のフィールドよりも複雑な何かのために stats を取得する必要がある場合は、ランタイムフィールドで集計を実行してください。

Python

  1. resp = client.search(
  2. index="exams",
  3. size=0,
  4. runtime_mappings={
  5. "grade.weighted": {
  6. "type": "double",
  7. "script": "\n emit(doc['grade'].value * doc['weight'].value)\n "
  8. }
  9. },
  10. aggs={
  11. "grades_stats": {
  12. "stats": {
  13. "field": "grade.weighted"
  14. }
  15. }
  16. },
  17. )
  18. print(resp)

Ruby

  1. response = client.search(
  2. index: 'exams',
  3. body: {
  4. size: 0,
  5. runtime_mappings: {
  6. 'grade.weighted' => {
  7. type: 'double',
  8. script: "\n emit(doc['grade'].value * doc['weight'].value)\n "
  9. }
  10. },
  11. aggregations: {
  12. grades_stats: {
  13. stats: {
  14. field: 'grade.weighted'
  15. }
  16. }
  17. }
  18. }
  19. )
  20. puts response

Js

  1. const response = await client.search({
  2. index: "exams",
  3. size: 0,
  4. runtime_mappings: {
  5. "grade.weighted": {
  6. type: "double",
  7. script:
  8. "\n emit(doc['grade'].value * doc['weight'].value)\n ",
  9. },
  10. },
  11. aggs: {
  12. grades_stats: {
  13. stats: {
  14. field: "grade.weighted",
  15. },
  16. },
  17. },
  18. });
  19. console.log(response);

コンソール

  1. POST /exams/_search
  2. {
  3. "size": 0,
  4. "runtime_mappings": {
  5. "grade.weighted": {
  6. "type": "double",
  7. "script": """
  8. emit(doc['grade'].value * doc['weight'].value)
  9. """
  10. }
  11. },
  12. "aggs": {
  13. "grades_stats": {
  14. "stats": {
  15. "field": "grade.weighted"
  16. }
  17. }
  18. }
  19. }

欠損値

missing パラメータは、値が欠けている文書がどのように扱われるべきかを定義します。デフォルトでは無視されますが、値があるかのように扱うことも可能です。

Python

  1. resp = client.search(
  2. index="exams",
  3. size="0",
  4. aggs={
  5. "grades_stats": {
  6. "stats": {
  7. "field": "grade",
  8. "missing": 0
  9. }
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.search(
  2. index: 'exams',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. grades_stats: {
  7. stats: {
  8. field: 'grade',
  9. missing: 0
  10. }
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.search({
  2. index: "exams",
  3. size: 0,
  4. aggs: {
  5. grades_stats: {
  6. stats: {
  7. field: "grade",
  8. missing: 0,
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

コンソール

  1. POST /exams/_search?size=0
  2. {
  3. "aggs": {
  4. "grades_stats": {
  5. "stats": {
  6. "field": "grade",
  7. "missing": 0
  8. }
  9. }
  10. }
  11. }
grade フィールドに値がない文書は、値が 0 の文書と同じバケットに入ります。