IP range 집계

IP range 집계

ip_range 집계는 IP 주소 범위를 기반으로 문서를 버킷으로 그룹화해요. ip 타입으로 매핑된 필드에 대해 동작하며, 명시적인 from/to 경계와 mask 파라미터를 사용한 CIDR 표기법을 모두 지원해요.

출처: 문서

본문

파라미터 (Parameters)

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

파라미터 필수/선택 데이터 타입 설명
field 필수 String 집계할 ip 필드.
ranges 필수 Array IP 범위 목록. 각 범위는 from 및/또는 to(명시적 경계) 또는 mask(CIDR 표기법)를 지정할 수 있어요. 선택적으로 key를 포함해 버킷 이름을 지정할 수 있어요.
keyed 선택 Boolean true면 버킷을 배열 대신 범위 이름으로 키가 지정된 객체로 반환해요. 기본값은 false예요.

예제 설정 (Example setup)

이 페이지의 예제를 시도하려면 ip 필드를 포함하는 인덱스를 만들어요:

PUT /network_logs
{
  "mappings": {
    "properties": {
      "ip": { "type": "ip" },
      "status": { "type": "keyword" }
    }
  }
}

몇몇 문서를 색인해요:

POST /network_logs/_bulk?refresh=true
{"index":{}}
{"ip": "10.0.0.1", "status": "ok"}
{"index":{}}
{"ip": "10.0.0.50", "status": "ok"}
{"index":{}}
{"ip": "10.0.0.100", "status": "error"}
{"index":{}}
{"ip": "10.0.0.200", "status": "ok"}
{"index":{}}
{"ip": "10.0.1.5", "status": "ok"}
{"index":{}}
{"ip": "10.0.1.100", "status": "error"}
{"index":{}}
{"ip": "172.16.0.1", "status": "ok"}
{"index":{}}
{"ip": "172.16.0.50", "status": "ok"}
{"index":{}}
{"ip": "192.168.1.1", "status": "ok"}
{"index":{}}
{"ip": "192.168.1.100", "status": "error"}

예제: 명시적 IP 범위 (Explicit IP ranges)

다음 예제는 from과 to 경계를 사용해 네트워크 로그 항목을 세 개의 IP 범위로 분할해요:

GET /network_logs/_search
{
  "size": 0,
  "aggs": {
    "ip_ranges": {
      "ip_range": {
        "field": "ip",
        "ranges": [
          { "to": "10.0.1.0" },
          { "from": "10.0.1.0", "to": "172.16.0.0" },
          { "from": "172.16.0.0" }
        ]
      }
    }
  }
}

버킷은 범위 경계를 기반으로 자동 생성된 키를 가진 배열로 반환돼요. from 값은 포함(inclusive)이고 to 값은 제외(exclusive)예요:

{
  ...
  "aggregations": {
    "ip_ranges": {
      "buckets": [
        {
          "key": "*-10.0.1.0",
          "to": "10.0.1.0",
          "doc_count": 4
        },
        {
          "key": "10.0.1.0-172.16.0.0",
          "from": "10.0.1.0",
          "to": "172.16.0.0",
          "doc_count": 2
        },
        {
          "key": "172.16.0.0-*",
          "from": "172.16.0.0",
          "doc_count": 4
        }
      ]
    }
  }
}

예제: 키드 응답의 CIDR 마스크 (CIDR masks with keyed response)

CIDR 표기법을 사용해 범위를 정의하고 커스텀 키를 지정할 수 있어요. keyed를 true로 설정하면 배열 대신 객체를 반환해요. 다음 예제는 RFC 1918 사설 주소 클래스에 따라 트래픽을 그룹화해요:

GET /network_logs/_search
{
  "size": 0,
  "aggs": {
    "ip_ranges": {
      "ip_range": {
        "field": "ip",
        "ranges": [
          { "key": "private_a", "mask": "10.0.0.0/8" },
          { "key": "private_b", "mask": "172.16.0.0/12" },
          { "key": "private_c", "mask": "192.168.0.0/16" }
        ],
        "keyed": true
      }
    }
  }
}

CIDR 표기법을 사용하면 응답에 마스크에서 파생된 계산된 from과 to 경계가 포함돼요. keyed가 true이므로 버킷은 배열 대신 커스텀 키가 있는 객체로 반환돼요:

{
  ...
  "aggregations": {
    "ip_ranges": {
      "buckets": {
        "private_a": {
          "from": "10.0.0.0",
          "to": "11.0.0.0",
          "doc_count": 6
        },
        "private_b": {
          "from": "172.16.0.0",
          "to": "172.32.0.0",
          "doc_count": 2
        },
        "private_c": {
          "from": "192.168.0.0",
          "to": "192.169.0.0",
          "doc_count": 2
        }
      }
    }
  }
}

응답 본문 필드 (Response body fields)

필드 데이터 타입 설명
buckets Array 또는 Object IP 범위 버킷. 기본적으로 배열로, keyed가 true면 객체로 반환돼요.
buckets.key String 자동 생성된 범위 레이블(예: *-10.0.1.0 또는 10.0.0.0/24), 또는 지정된 커스텀 키.
buckets.from String 범위의 하한 IP 주소(포함).
buckets.to String 범위의 상한 IP 주소(제외).
buckets.doc_count Integer 이 범위에 IP 주소가 있는 문서 수.

더 알아보기 (Learn more)