아빠는 개발자

[es] aggs 테스트 (단일필드, object 필드, object.object 필드) 본문

Elastic/elasticsearch

[es] aggs 테스트 (단일필드, object 필드, object.object 필드)

father6019 2024. 8. 24. 18:40
728x90
반응형

Aggregation 의 성능을 높이고 싶을때 시도해 보면 좋은 방법이 될꺼 같은데.. 아무튼 테스트를 해보자

일단 인덱스의 맵핑 구조는 아래와 같다. 

 

포인트는 

            "city": "Michigan",
            "country_code": "US",
            "country": "America/Detroit",

3개의 정보가 단일필드, place 하위의 object, 그리고 그 obejct 하위의 object 로 3가지 색인후 집계 테스트를 진행해 본다.  

{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "dynamic": "true",
    "_source": {
      "enabled": "true"
    },
    "properties": {
      "private_ip": {
        "type": "ip"
      },
      "public_ip": {
        "type": "ip"
      },
      "country_code": {
        "type": "keyword"
      },
      "city": {
        "type": "keyword"
      },
      "addr1": {
        "type": "keyword"
      },
      "location": {
        "type": "geo_point"
      },
      "no": {
        "type": "keyword"
      },
      "country": {
        "type": "keyword"
      },
      "num": {
        "type": "long"
      },
      "timestamp": {
        "type": "date",
        "format": "strict_date_optional_time||epoch_millis"
      },
      "place": {
        "type": "object",
        "properties": {
          "city": {
            "type": "keyword"
          },
          "country_code": {
            "type": "keyword"
          },
          "country": {
            "type": "keyword"
          },
          "place_location": {
            "type": "object",
            "properties": {
              "pl_city": {
                "type": "keyword"
              },
              "pl_country_code": {
                "type": "keyword"
              },
              "pl_country": {
                "type": "keyword"
              }
            }
          }
        }
      }
    }
  }
}

 

이렇게 index를 생성하고 

test index

location 정보 약 820 만 건을 색인한다.

색인된 데이터의 구조는 다음과 같다. 

 

 그리고 검색을 위한 테스트 쿼리 와 결과값

     
"aggregations": {
    "CITY": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 5413640,
      "buckets": [
        {
          "key": "California",
          "doc_count": 555870
        },
        {
          "key": "New York",
          "doc_count": 440142
        },
        {
          "key": "Texas",
          "doc_count": 423060
        },
        {
          "key": "Virginia",
          "doc_count": 282806
        },
        {
          "key": "Illinois",
          "doc_count": 253158
        },
        {
          "key": "Ohio",
          "doc_count": 177665
        },
        {
          "key": "Florida",
          "doc_count": 176873
        },
        {
          "key": "Lombardy",
          "doc_count": 174612
        },
        {
          "key": "Gyeonggi-do",
          "doc_count": 174488
        },
        {
          "key": "New Jersey",
          "doc_count": 169874
        }
      ]
    },
    "COUNTRY": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 2185802,
      "buckets": [
        {
          "key": "America/New_York",
          "doc_count": 1904632
        },
        {
          "key": "America/Chicago",
          "doc_count": 1077460
        },
        {
          "key": "America/Los_Angeles",
          "doc_count": 647753
        },
        {
          "key": "Europe/Rome",
          "doc_count": 580266
        },
        {
          "key": "Europe/Berlin",
          "doc_count": 384289
        },
        {
          "key": "Europe/Paris",
          "doc_count": 341172
        },
        {
          "key": "Europe/Amsterdam",
          "doc_count": 337171
        },
        {
          "key": "Europe/London",
          "doc_count": 308768
        },
        {
          "key": "Asia/Seoul",
          "doc_count": 295446
        },
        {
          "key": "Europe/Vienna",
          "doc_count": 179429
        }
      ]
    },
    "COUNTRY_CODE": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 1539549,
      "buckets": [
        {
          "key": "US",
          "doc_count": 3985288
        },
        {
          "key": "IT",
          "doc_count": 580270
        },
        {
          "key": "DE",
          "doc_count": 384292
        },
        {
          "key": "FR",
          "doc_count": 341339
        },
        {
          "key": "NL",
          "doc_count": 337171
        },
        {
          "key": "GB",
          "doc_count": 309076
        },
        {
          "key": "KR",
          "doc_count": 295445
        },
        {
          "key": "AT",
          "doc_count": 179433
        },
        {
          "key": "PL",
          "doc_count": 150649
        },
        {
          "key": "JP",
          "doc_count": 139676
        }
      ]
    }
"aggregations": {
    "CITY": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 5413640,
      "buckets": [
        {
          "key": "California",
          "doc_count": 555870
        },
        {
          "key": "New York",
          "doc_count": 440142
        },
        {
          "key": "Texas",
          "doc_count": 423060
        },
        {
          "key": "Virginia",
          "doc_count": 282806
        },
        {
          "key": "Illinois",
          "doc_count": 253158
        },
        {
          "key": "Ohio",
          "doc_count": 177665
        },
        {
          "key": "Florida",
          "doc_count": 176873
        },
        {
          "key": "Lombardy",
          "doc_count": 174612
        },
        {
          "key": "Gyeonggi-do",
          "doc_count": 174488
        },
        {
          "key": "New Jersey",
          "doc_count": 169874
        }
      ]
    },
    "COUNTRY": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 2185802,
      "buckets": [
        {
          "key": "America/New_York",
          "doc_count": 1904632
        },
        {
          "key": "America/Chicago",
          "doc_count": 1077460
        },
        {
          "key": "America/Los_Angeles",
          "doc_count": 647753
        },
        {
          "key": "Europe/Rome",
          "doc_count": 580266
        },
        {
          "key": "Europe/Berlin",
          "doc_count": 384289
        },
        {
          "key": "Europe/Paris",
          "doc_count": 341172
        },
        {
          "key": "Europe/Amsterdam",
          "doc_count": 337171
        },
        {
          "key": "Europe/London",
          "doc_count": 308768
        },
        {
          "key": "Asia/Seoul",
          "doc_count": 295446
        },
        {
          "key": "Europe/Vienna",
          "doc_count": 179429
        }
      ]
    },
    "COUNTRY_CODE": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 1539549,
      "buckets": [
        {
          "key": "US",
          "doc_count": 3985288
        },
        {
          "key": "IT",
          "doc_count": 580270
        },
        {
          "key": "DE",
          "doc_count": 384292
        },
        {
          "key": "FR",
          "doc_count": 341339
        },
        {
          "key": "NL",
          "doc_count": 337171
        },
        {
          "key": "GB",
          "doc_count": 309076
        },
        {
          "key": "KR",
          "doc_count": 295445
        },
        {
          "key": "AT",
          "doc_count": 179433
        },
        {
          "key": "PL",
          "doc_count": 150649
        },
        {
          "key": "JP",
          "doc_count": 139676
        }
      ]
    }
"aggregations": {
    "CITY": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 5413640,
      "buckets": [
        {
          "key": "California",
          "doc_count": 555870
        },
        {
          "key": "New York",
          "doc_count": 440142
        },
        {
          "key": "Texas",
          "doc_count": 423060
        },
        {
          "key": "Virginia",
          "doc_count": 282806
        },
        {
          "key": "Illinois",
          "doc_count": 253158
        },
        {
          "key": "Ohio",
          "doc_count": 177665
        },
        {
          "key": "Florida",
          "doc_count": 176873
        },
        {
          "key": "Lombardy",
          "doc_count": 174612
        },
        {
          "key": "Gyeonggi-do",
          "doc_count": 174488
        },
        {
          "key": "New Jersey",
          "doc_count": 169874
        }
      ]
    },
    "COUNTRY": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 2185802,
      "buckets": [
        {
          "key": "America/New_York",
          "doc_count": 1904632
        },
        {
          "key": "America/Chicago",
          "doc_count": 1077460
        },
        {
          "key": "America/Los_Angeles",
          "doc_count": 647753
        },
        {
          "key": "Europe/Rome",
          "doc_count": 580266
        },
        {
          "key": "Europe/Berlin",
          "doc_count": 384289
        },
        {
          "key": "Europe/Paris",
          "doc_count": 341172
        },
        {
          "key": "Europe/Amsterdam",
          "doc_count": 337171
        },
        {
          "key": "Europe/London",
          "doc_count": 308768
        },
        {
          "key": "Asia/Seoul",
          "doc_count": 295446
        },
        {
          "key": "Europe/Vienna",
          "doc_count": 179429
        }
      ]
    },
    "COUNTRY_CODE": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 1539549,
      "buckets": [
        {
          "key": "US",
          "doc_count": 3985288
        },
        {
          "key": "IT",
          "doc_count": 580270
        },
        {
          "key": "DE",
          "doc_count": 384292
        },
        {
          "key": "FR",
          "doc_count": 341339
        },
        {
          "key": "NL",
          "doc_count": 337171
        },
        {
          "key": "GB",
          "doc_count": 309076
        },
        {
          "key": "KR",
          "doc_count": 295445
        },
        {
          "key": "AT",
          "doc_count": 179433
        },
        {
          "key": "PL",
          "doc_count": 150649
        },
        {
          "key": "JP",
          "doc_count": 139676
        }
      ]
    }

 

비교 및 최적화

성능 측면에서

  • 평면화된 구조는 일반적으로 성능이 더 우수합니다. 데이터 접근이 간단하고, 복잡한 nested 쿼리를 사용하지 않기 때문에 더 빠른 검색과 집계가 가능합니다.
  • nested 구조는 관계형 데이터를 정확하게 표현할 수 있지만, 쿼리와 집계 성능이 저하될 수 있습니다. 특히 대량의 nested 문서가 있는 경우 성능 저하가 두드러질 수 있습니다.

최적화 방법

  1. 필드 사용 최적화: 필요한 필드만 포함하여 인덱스를 최적화합니다.
  2. nested 쿼리 최적화: nested 쿼리를 사용할 때는 필드 접근을 최소화하고, 효율적인 쿼리와 집계를 작성합니다.
  3. 캐싱: 자주 사용하는 쿼리와 집계 결과를 캐시하여 성능을 개선할 수 있습니다.
  4. 하드웨어 및 클러스터 설정: 하드웨어 자원과 클러스터 설정을 조정하여 성능을 개선할 수 있습니다.

결론

  • 평면화된 구조는 성능이 더 우수하고, 데이터 접근이 단순하여 일반적으로 더 좋은 선택입니다.
  • nested 구조는 복잡한 관계를 표현할 때 유용하지만, 성능이 저하될 수 있으며, 대규모 데이터셋에서는 성능 최적화가 필요합니다.

구조를 변경할 때는 데이터의 복잡성, 쿼리 요구 사항, 성능 요구 사항을 고려하여 최적의 선택을 해야 합니다.

728x90
반응형