Diversified sampler 집계

Diversified sampler 집계

diversified_sampler 집계는 하위 집계 처리를 최상위 점수 문서의 샘플로 제한하면서도 샘플에 다양한 콘텐츠가 포함되도록 보장하는 필터링 집계예요. sampler 집계를 확장해 공통 필드 값을 공유하는 문서를 중복 제거(deduplicate)하므로 어떤 단일 카테고리도 샘플을 지배하지 않게 해요.

이 집계는 서로 다른 그룹 간에 공정한 대표성을 보장해야 할 때 유용해요. 예를 들어, 한 명의 활발한 작성자가 분석 결과를 왜곡하는 것을 막거나 위치 기반 분석에서 지리적 다양성을 보장하는 데 도움이 돼요. 또한 significant_terms처럼 비용이 많이 드는 하위 집계를 더 작고 대표성 있는 샘플에서 유용한 결과를 만들어 비용을 줄여줘요.

출처: 문서

본문

파라미터 (Parameters)

diversified_sampler 집계는 다음 파라미터를 받아요.

파라미터 필수/선택 데이터 타입 설명
field 선택 String 중복 제거에 사용되는 필드. 문서당 단일 값을 생성해야 해요. script와 상호 배타적이에요.
script 선택 Object 중복 제거 값을 생성하는 스크립트. field와 상호 배타적이에요.
shard_size 선택 Integer 각 샤드에서 수집되는 최상위 점수 문서의 최대 수. 기본값은 100이에요.
max_docs_per_value 선택 Integer 같은 중복 제거 값을 공유하는 문서가 샘플에 들어갈 수 있는 상한. 기본값은 1이에요.
execution_hint 선택 String 중복 제거 값이 메모리에서 관리되는 방식을 제어해요. Execution hint를 참고하세요.

Execution hint

다음 표는 유효한 execution_hint 값 목록이에요.

값 설명
map 필드 값을 직접 메모리에 보관해요.
global_ordinals 필드에 대해 Lucene의 ordinals 매핑을 사용해, 카디널리티가 높은 필드에서 더 나은 메모리 효율을 제공해요.
bytes_hash 값 자체 대신 각 값의 해시를 저장해요. 일부 시나리오에서 속도를 높일 수 있지만 해시 충돌로 인한 잘못된 중복 제거 위험이 있어요.

선택한 전략이 필드 타입에 적용되지 않으면 OpenSearch는 execution_hint를 무시할 수 있어요.

예제: 필드 기준 중복 제거 (Deduplicating by field)

다음 예제는 전자상거래 데이터셋에서 주문을 샘플링해 customer_gender 값당 50개 문서로 제한한 다음, 샘플에 대해 terms 하위 집계를 실행해 카테고리 분포를 확인해요:

GET /opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "my_sample": {
      "diversified_sampler": {
        "shard_size": 200,
        "field": "customer_gender",
        "max_docs_per_value": 50
      },
      "aggs": {
        "categories": {
          "terms": {
            "field": "category.keyword"
          }
        }
      }
    }
  }
}

예제: 스크립트 기준 중복 제거 (Deduplicating by script)

계산되거나 결합된 필드에서 다양성을 확보해야 할 때 스크립트를 사용해 중복 제거 값을 생성할 수 있어요. 다음 예제는 스크립트를 사용해 customer_gender 기준으로 다양성을 확보하고 값당 3개 문서로 제한해요:

GET /opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "my_sample": {
      "diversified_sampler": {
        "shard_size": 200,
        "max_docs_per_value": 3,
        "script": {
          "lang": "painless",
          "source": "doc['customer_gender'].value"
        }
      },
      "aggs": {
        "categories": {
          "terms": {
            "field": "category.keyword"
          }
        }
      }
    }
  }
}

예제 응답 (Example response)

{
  "took": 65,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4675,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  },
  "aggregations": {
    "my_sample": {
      "doc_count": 6,
      "categories": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": "Men's Clothing",
            "doc_count": 3
          },
          {
            "key": "Women's Clothing",
            "doc_count": 3
          },
          {
            "key": "Women's Shoes",
            "doc_count": 2
          },
          {
            "key": "Men's Accessories",
            "doc_count": 1
          }
        ]
      }
    }
  }
}

max_docs_per_value를 3으로 설정하고 성별 값이 두 가지이므로, 샘플에는 최대 6개의 문서(값당 3개)가 포함돼요. 이는 하위 집계 결과에서 균형 잡힌 대표성을 보장해요.

응답 본문 필드 (Response body fields)

필드 데이터 타입 설명
doc_count Integer 다양화된 샘플의 총 문서 수.

제한 사항 (Limitations)

  • field 또는 script는 문서당 단일 값을 생성해야 해요. 다중 값 필드는 지원되지 않으며 사용하면 오류가 발생해요.
  • 중복 제거는 각 샤드에서 독립적으로 적용되므로, 다른 샤드에 있는 같은 값을 가진 문서는 서로 중복 제거되지 않아요.
  • breadth_first 수집 모드를 사용하는 terms 집계 아래에는 이 집계를 중첩할 수 없어요. breadth-first 수집은 diversified sampler가 필요로 하는 관련성 점수를 버리기 때문이에요.
  • 지리적 또는 날짜 기반 다양성 값(예: "7d" 또는 "10km")을 위한 특수 문법은 없어요. 지리적 지역이나 시간 간격으로 다양화하려면 원시 값을 버킷팅하는 스크립트를 작성해요. 예를 들어 위도 밴드에 (int)(doc['geoip.location'].lat / 10)을, 요일 그룹화에 doc['order_date'].value.dayOfWeek를 사용해요.

더 알아보기 (Learn more)