Adjacency matrix 집계

Adjacency matrix 집계

adjacency_matrix 집계는 이름 붙은 필터 집합을 받아, 서로 교차하는 필터의 모든 쌍을 나타내는 버킷을 반환해요. 각 버킷의 문서 개수는 두 필터를 동시에 충족한 문서 수를 나타내므로, 서로 다른 문서 그룹 간의 관계를 분석하는 데 유용해요.

출처: 문서

본문

A, B, C라는 세 개의 필터가 주어지면, 응답은 다음과 같은 버킷 구조를 만들어요:

     A   B   C
A    A  A&B A&C
B        B  B&C
C            C

행렬은 대칭이에요. 즉 A&C 버킷에 포함된 문서는 C&A와 동일하므로, 상부 삼각(upper triangle)만 반환돼요. 필터 이름은 알파벳 순으로 정렬되고, 먼저 오는 이름이 항상 & 구분자의 왼쪽에 위치해요.

파라미터 (Parameters)

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

파라미터 필수/선택 데이터 타입 설명
filters 필수 Object 키-값 쌍으로 표현된 이름 붙은 필터 집합. 각 키는 필터 이름이고 각 값은 쿼리 객체예요.
separator 선택 String 교차 버킷 키에서 필터 이름을 연결하는 데 쓰는 문자예요. 기본값은 &예요.

예제 (Example)

다음 예제는 전자상거래 데이터셋을 분석해 세 제조업체의 제품이 같은 주문에 얼마나 자주 함께 등장하는지 확인해요:

GET /opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "interactions": {
      "adjacency_matrix": {
        "filters": {
          "grpA": {
            "match": {
              "manufacturer.keyword": "Low Tide Media"
            }
          },
          "grpB": {
            "match": {
              "manufacturer.keyword": "Elitelligence"
            }
          },
          "grpC": {
            "match": {
              "manufacturer.keyword": "Oceanavigations"
            }
          }
        }
      }
    }
  }
}

예제 응답 (Example response)

{
  "took": 32,
  "timed_out": false,
  "terminated_early": true,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4675,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  },
  "aggregations": {
    "interactions": {
      "buckets": [
        {
          "key": "grpA",
          "doc_count": 1553
        },
        {
          "key": "grpA&grpB",
          "doc_count": 590
        },
        {
          "key": "grpA&grpC",
          "doc_count": 329
        },
        {
          "key": "grpB",
          "doc_count": 1370
        },
        {
          "key": "grpB&grpC",
          "doc_count": 299
        },
        {
          "key": "grpC",
          "doc_count": 1218
        }
      ]
    }
  }
}

doc_count가 590인 교차 버킷 grpA&grpB는 590개의 주문이 Low Tide Media와 Elitelligence 두 제조업체의 제품을 모두 포함한다는 뜻이에요.

하위 집계와 함께 사용하기 (Usage with child aggregations)

adjacency_matrix 안에 date_histogram 같은 하위 집계를 중첩하면 관계 데이터에 시간 차원이 추가돼요. 이를 통해 그룹 간 상호작용이 시간에 따라 어떻게 진화하는지 관찰할 수 있는 동적 네트워크 분석을 수행할 수 있어요.

일치하는 문서가 없는 교차 버킷은 응답에서 생략돼요.

응답 본문 필드 (Response body fields)

필드 데이터 타입 설명
buckets Array 개별 필터와 그 쌍별 교차를 나타내는 버킷 목록이에요.
buckets.key String 개별 필터 버킷의 필터 이름. 또는 교차 버킷에서 separator로 연결된 두 필터 이름이에요.
buckets.doc_count Integer 필터 또는 필터 쌍과 일치하는 문서 수예요.

제한 사항 (Limitations)

버킷 수는 필터 수에 따라 제곱으로 증가해요. N개의 필터가 있으면 최대 N(N+1)/2개의 버킷이 생성돼요 (N개의 개별 버킷 + N*(N-1)/2개의 교차 버킷). 과도한 메모리 사용을 막기 위해 필터의 최대 개수 기본값은 100이에요. 이 제한은 인덱스별로 index.max_adjacency_matrix_filters 설정으로 조정할 수 있어요.

OpenSearch Dashboards에서 adjacency matrix 결과를 네트워크 그래프로 렌더링하는 완전한 예제는 Vega 시각화 만들기 항목을 참고하세요.

더 알아보기 (Learn more)