본문 바로가기
OpenSearch (ElasticSearch)

[8] 집계 - 메트릭 집계

by parkjp 2022. 3. 10.

메트릭 집계를 사용하면 필드의 최소값 최대값 및 평균값 찾기와 같은 간단한 계산을 수행할 수 있습니다.

메트릭 집계에는 단일 값 메트릭 집계와 다중 값 메트릭 집계의 두 가지 유형이 있습니다.

 

 

단일 값 메트릭 집계

단일 값 메트릭 집계는 단일 메트릭을 반환합니다. 예를 들어, sum, min, max, avg, cardinality, value_count가 있습니다.

 

다중 값 메트릭 집계

둘 이상의 메트릭을 반환합니다.

예: stats, extended_stats, matrix_stats, percentile, percentile_ranks, geo_bound. top_hits, scripted_metric

 

 

 

:: sum, min, max, avg

// taxful_total_price 필드의 총 합계를 계산합니다.
GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "sum_taxful_total_price": {
      "sum": {
        "field": "taxful_total_price"
      }
    }
  }
}
 
 
 
 
// 응답 예시
...
  "aggregations" : {
    "sum_taxful_total_price" : {
      "value" : 350884.12890625
    }
  }
}
 
 
// 비슷한 방식으로 최소값, 최대값, 평균값을 찾을 수 있습니다.

 

 

:: cardinality

 

필드의 고유하거나 고유한 값의 수를 계산하는 단일 값 메트릭 집계입니다.

// 이 예에서는 전자 상거래 상점에서 고유한 제품 수를 찾습니다.
GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "unique_products": {
      "cardinality": {
        "field": "products.product_id"
      }
    }
  }
}
 
 
 
 
// 응답 예시
...
  "aggregations" : {
    "unique_products" : {
      "value" : 7033
    }
  }
}

ardinality 개수는 대략적인 것입니다. 상점에 수만 개의 제품이 있는 경우 정확한 계산을 위해서는 모든 값을 해시 세트에 로드하고 해당 크기를 반환해야 합니다.

이 접근 방식은 잘 확장되지 않습니다. 엄청난 양의 메모리가 필요하고 대기 시간이 길어질 수 있습니다.

 

precision_threshold 설정을 통해 메모리와 정확도 간의 균형을 제어할 수 있습니다. 이 설정은 카운트가 정확할 것으로 예상되는 임계값 이하를 정의합니다.

이 값을 초과하면 카운트가 덜 정확해질 수 있습니다. precision_threshold의 기본 값은 3000이고 지원되는 최대 값은 40000입니다.

// Cardinality ( precision_threshold 설정 )
GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "unique_products": {
      "cardinality": {
        "field": "products.product_id",
        "precision_threshold": 10000
      }
    }
  }
}

 

 

:: value_count

 

value_count 메트릭은 count 기반이 되는 값의 수를 계산하는 단일 값 메트릭 집계입니다.

// 예를들어, value_count 메트릭과 함께 avg 메트릭을 사용하여 평균 값을 계산하는데 사용하는 숫자의 수를 찾을 수 있습니다.
GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
   "aggs": {
    "number_of_values": {
      "value_count": {
        "field": "taxful_total_price"
      }
    }
  }
}
 
 
 
 
// 응답 예시
...
  "aggregations" : {
    "number_of_values" : {
      "value" : 4675
    }
  }
}

 

 

:: stats, extended_stats, matrix_stats

 

stats 메트릭은 min, max, sum, avg, value_count 같은 모든 기본적인 메트릭을 반환합니다.

// taxful_total_price 필드에 대한 기본 통계를 반환합니다.
GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "stats_taxful_total_price": {
      "stats": {
        "field": "taxful_total_price"
      }
    }
  }
}
 
 
// 응답 예시
...
"aggregations" : {
  "stats_taxful_total_price" : {
    "count" : 4675,
    "min" : 6.98828125,
    "max" : 2250.0,
    "avg" : 75.05542864304813,
    "sum" : 350884.12890625
  }
 }
}
 
 
 
 
// extended_stats는 stats의 확장된 버전입니다. 기본 통계를 포함하는 것 외에도 sum_of_squares, variance, std_deviation 같은 통계도 반환합니다.
GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "extended_stats_taxful_total_price": {
      "extended_stats": {
        "field": "taxful_total_price"
      }
    }
  }
}
 
 
 
 
// 응답 예시
...
"aggregations" : {
  "extended_stats_taxful_total_price" : {
    "count" : 4675,
    "min" : 6.98828125,
    "max" : 2250.0,
    "avg" : 75.05542864304813,
    "sum" : 350884.12890625,
    "sum_of_squares" : 3.9367749294174194E7,
    "variance" : 2787.59157113862,
    "variance_population" : 2787.59157113862,
    "variance_sampling" : 2788.187974983536,
    "std_deviation" : 52.79764740155209,
    "std_deviation_population" : 52.79764740155209,
    "std_deviation_sampling" : 52.80329511482722,
    "std_deviation_bounds" : {
      "upper" : 180.6507234461523,
      "lower" : -30.53986616005605,
      "upper_population" : 180.6507234461523,
      "lower_population" : -30.53986616005605,
      "upper_sampling" : 180.66201887270256,
      "lower_sampling" : -30.551161586606312
    }
  }
 }
}
// std_deviation_bounds 속성은 평균에서 +-2 표준편차의 간격으로 데이터의 시각적 분산을 제공합니다.
 
 
 
 
// 표준편차를 다른 값(예: 3)으로 설정하려면 sigma를 3으로 설정합니다.
GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "extended_stats_taxful_total_price": {
      "extended_stats": {
        "field": "taxful_total_price",
        "sigma": 3
      }
    }
  }
}
 
 
 
 
// matrix_stats는 고급 통계를 반환합니다.
// 다음 예는 taxful_total_price 및 products.base_price필드에 대한 행렬 형식의 고급 통계를 반환합니다.
GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "matrix_stats_taxful_total_price": {
      "matrix_stats": {
        "fields": ["taxful_total_price", "products.base_price"]
      }
    }
  }
}
 
 
 
 
// 응답 예시
...
"aggregations" : {
  "matrix_stats_taxful_total_price" : {
    "doc_count" : 4675,
    "fields" : [
      {
        "name" : "products.base_price",
        "count" : 4675,
        "mean" : 34.994239430147196,
        "variance" : 360.5035285833703,
        "skewness" : 5.530161335032702,
        "kurtosis" : 131.16306324042148,
        "covariance" : {
          "products.base_price" : 360.5035285833703,
          "taxful_total_price" : 846.6489362233166
        },
        "correlation" : {
          "products.base_price" : 1.0,
          "taxful_total_price" : 0.8444765264325268
        }
      },
      {
        "name" : "taxful_total_price",
        "count" : 4675,
        "mean" : 75.05542864304839,
        "variance" : 2788.1879749835402,
        "skewness" : 15.812149139924037,
        "kurtosis" : 619.1235507385902,
        "covariance" : {
          "products.base_price" : 846.6489362233166,
          "taxful_total_price" : 2788.1879749835402
        },
        "correlation" : {
          "products.base_price" : 0.8444765264325268,
          "taxful_total_price" : 1.0
        }
      }
    ]
  }
 }
}

 

 

Statistic Description
correlation 상관관계라고 합니다. 두 필드 간의 관계 강도를 측정한 것입니다. 유효한 값은 -1 ~ 1 사이입니다.
count 측정된 샘플 수 입니다.
covariance 공분산입니다. 두 필드 간의 공동 변동성의 측정값입니다.
kurtosis 첨도입니다. 도수분포의 뾰족한 정도를 나타냅니다.
mean 샘플에서 측정된 필드의 평균 값입니다.
skewness 비대칭도, 왜도라고 합니다. 평균 주변의 필드 값 분포의 비대칭 측정입니다.
variance 분산입니다. 측정된 필드 값이 평균 값에서 얼마나 멀리 퍼져 있는지를 나타내는 수 입니다. 분산이 클수록 평균 값에서 더 많이 퍼집니다.

 

 

:: percentile, percentile_ranks ( 백분위 수, 백분위 수 랭크 )

 

백분위 수는 특정 임계값 이하인 데이터의 백분율입니다. 데이터 분포를 파악할 수 있습니다.

cardinality 메트릭과 마찬가지로 근사치를 나타냅니다.

// percentile
// taxful_total_price 필드를 기준으로 백분위수를 계산합니다.
GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "percentile_taxful_total_price": {
      "percentiles": {
        "field": "taxful_total_price"
      }
    }
  }
}
 
 
 
// 응답 예시
...
"aggregations" : {
  "percentile_taxful_total_price" : {
    "values" : {
      "1.0" : 21.984375,
      "5.0" : 27.984375,
      "25.0" : 44.96875,
      "50.0" : 64.22061688311689,
      "75.0" : 93.0,
      "95.0" : 156.0,
      "99.0" : 222.0
    }
  }
 }
}

 

 

백분위수 랭크(순위)는 지정된 값으로 그룹화된 임계값 이하의 백분위수입니다.

예를 들어 값이 80%보다 크거나 같으면 백분위수 순위는 80입니다.

// percentile_ranks
GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "percentile_rank_taxful_total_price": {
      "percentile_ranks": {
        "field": "taxful_total_price",
        "values": [
          10,
          15
        ]
      }
    }
  }
}
 
 
// 응답 예시
...
"aggregations" : {
  "percentile_rank_taxful_total_price" : {
    "values" : {
      "10.0" : 0.055096056411283456,
      "15.0" : 0.0830092961834656
    }
  }
 }
}

 

 

:: geo_bound

 

geo_bound 메트릭은 geo_point 필드 주변의 위도 및 경도 측면에서 경계를 계산하는 다중 값 메트릭 집계입니다.

// 아래 예는 geoip.location 필드의 geo_bound에 대한 메트릭을 반환합니다.
GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "geo": {
      "geo_bounds": {
        "field": "geoip.location"
      }
    }
  }
}
 
 
// 응답 예시
"aggregations" : {
  "geo" : {
    "bounds" : {
      "top_left" : {
        "lat" : 52.49999997206032,
        "lon" : -118.20000001229346
      },
      "bottom_right" : {
        "lat" : 4.599999985657632,
        "lon" : 55.299999956041574
      }
    }
  }
 }
}

 

 

:: top_hits ( 인기 조회수 )

 

 

top_hits 메트릭은 점수를 기반으로 문서의 순위를 지정하는 다중 값 메트릭 집계입니다.

다음 옵션을 지정할 수 있습니다.

  • from: 히트 시작 위치
  • size: 반환할 최대 크기 (기본값 3)
  • sort: 일치하는 문서를 정렬하는 방법입니다. 기본적으로 조회수는 집계 쿼리의 관련성 점수를 기준으로 정렬됩니다.
// 아래 예는 전자상거래 데이터의 상위 5개 제품을 반환합니다.
GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "top_hits_products": {
      "top_hits": {
        "size": 5
      }
    }
  }
}
 
 
// 응답 예시
...
"aggregations" : {
  "top_hits_products" : {
    "hits" : {
      "total" : {
        "value" : 4675,
        "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
        {
          "_index" : "opensearch_dashboards_sample_data_ecommerce",
          "_type" : "_doc",
          "_id" : "glMlwXcBQVLeQPrkHPtI",
          "_score" : 1.0,
          "_source" : {
            "category" : [
              "Women's Accessories",
              "Women's Clothing"
            ],
            "currency" : "EUR",
            "customer_first_name" : "rania",
            "customer_full_name" : "rania Evans",
            "customer_gender" : "FEMALE",
            "customer_id" : 24,
            "customer_last_name" : "Evans",
            "customer_phone" : "",
            "day_of_week" : "Sunday",
            "day_of_week_i" : 6,
            "email" : "rania@evans-family.zzz",
            "manufacturer" : [
              "Tigress Enterprises"
            ],
            "order_date" : "2021-02-28T14:16:48+00:00",
            "order_id" : 583581,
            "products" : [
              {
                "base_price" : 10.99,
                "discount_percentage" : 0,
                "quantity" : 1,
                "manufacturer" : "Tigress Enterprises",
                "tax_amount" : 0,
                "product_id" : 19024,
                "category" : "Women's Accessories",
                "sku" : "ZO0082400824",
                "taxless_price" : 10.99,
                "unit_discount_amount" : 0,
                "min_price" : 5.17,
                "_id" : "sold_product_583581_19024",
                "discount_amount" : 0,
                "created_on" : "2016-12-25T14:16:48+00:00",
                "product_name" : "Snood - white/grey/peach",
                "price" : 10.99,
                "taxful_price" : 10.99,
                "base_unit_price" : 10.99
              },
              {
                "base_price" : 32.99,
                "discount_percentage" : 0,
                "quantity" : 1,
                "manufacturer" : "Tigress Enterprises",
                "tax_amount" : 0,
                "product_id" : 19260,
                "category" : "Women's Clothing",
                "sku" : "ZO0071900719",
                "taxless_price" : 32.99,
                "unit_discount_amount" : 0,
                "min_price" : 17.15,
                "_id" : "sold_product_583581_19260",
                "discount_amount" : 0,
                "created_on" : "2016-12-25T14:16:48+00:00",
                "product_name" : "Cardigan - grey",
                "price" : 32.99,
                "taxful_price" : 32.99,
                "base_unit_price" : 32.99
              }
            ],
            "sku" : [
              "ZO0082400824",
              "ZO0071900719"
            ],
            "taxful_total_price" : 43.98,
            "taxless_total_price" : 43.98,
            "total_quantity" : 2,
            "total_unique_products" : 2,
            "type" : "order",
            "user" : "rani",
            "geoip" : {
              "country_iso_code" : "EG",
              "location" : {
                "lon" : 31.3,
                "lat" : 30.1
              },
              "region_name" : "Cairo Governorate",
              "continent_name" : "Africa",
              "city_name" : "Cairo"
            },
            "event" : {
              "dataset" : "sample_ecommerce"
            }
          }
          ...
        }
      ]
    }
  }
 }
}

 

 

:: scripted_metric

 

scripted_metric은 지정된 스크립트에서 계산된 메트릭을 반환하는 다중 값 메트릭 집계입니다.

스크립트에는 initial stage, map stage, the combine stage, the reduce stage의 4단계가 있습니다. 

  • init_script: (optional) 어떤 문서를 수집하기 전 초기 상태를 설정하고 실행합니다.
  • map_script: type 필드 값을 확인하고 수집된 문서에 대해 집계를 실행합니다.
  • combine_script: 모드 샤드에서 반환된 상태를 집계합니다. 집계된 값은 coordinating 노드로 반환됩니다.
  • reduce_script: 변수 상태에 대한 액세스를 제공합니다. combine_script로부터 각 샤드의 결과를 배열로 결합합니다.
// 아래 예는 웹 로그 데이터의 다양한 http 응답 유형을 집계합니다.
GET opensearch_dashboards_sample_data_logs/_search
{
  "size": 0,
  "aggregations": {
    "responses.counts": {
      "scripted_metric": {
        "init_script": "state.responses = ['error':0L,'success':0L,'other':0L]",
        "map_script": """
              def code = doc['response.keyword'].value;
                 if (code.startsWith('5') || code.startsWith('4')) {
                  state.responses.error += 1 ;
                  } else if(code.startsWith('2')) {
                   state.responses.success += 1;
                  } else {
                  state.responses.other += 1;
                }
             """,
        "combine_script": "state.responses",
        "reduce_script": """
            def counts = ['error': 0L, 'success': 0L, 'other': 0L];
                for (responses in states) {
                 counts.error += responses['error'];
                  counts.success += responses['success'];
                counts.other += responses['other'];
        }
        return counts;
        """
      }
    }
  }
}
 
// 응답 예시
...
"aggregations" : {
  "responses.counts" : {
    "value" : {
      "other" : 0,
      "success" : 12832,
      "error" : 1242
    }
  }
 }
}
반응형

'OpenSearch (ElasticSearch)' 카테고리의 다른 글

[10] 데이터 재인덱싱  (0) 2022.03.18
[9] 집계 - 버킷 집계  (0) 2022.03.13
[7] 인덱스 템플릿  (0) 2022.03.02
[6] 데이터 스트림  (0) 2022.02.25
[5] 인덱스 별칭 (aliases)  (0) 2022.02.22