본문 바로가기
dev/elasticsearch

Elasticsearch 숫자형 데이터 검색 성능 개선

by igooo 2025. 8. 5.
728x90

개요

Elasticsearch에서 ISBN, 제품의 ID 또는 카테고리 ID와 같은 숫자형 데이터를 검색할 때, 숫자형 데이터의 타입을 keyword 타입으로 변경하면 검색 성능이 향상되는 경우가 있다. 이번 게시글에는 숫자형 데이터를 keyword로 타입을 변경하여 검색 성능이 향상되는지 알아보자.

 

Elasticsearch Field data types

Elasticsearch에는 다양한 데이터 타입을(https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/field-data-types) 제공하고 있다. 사용자는 색인할 데이터에 맞는 타입을 선택하여 mapping 정보를 입력해야 올바른 검색 방법과 검색 결과를 얻을 수 있다.

숫자형 데이터의 경우 Numeric field types을 사용하는 것이 올바른 맵핑 방법이지만(숫자형 타입에 가장 가까운 타입을 선정) 검색 속도가 중요한 경우 숫자형 데이터에 대하여 keyword type으로 맵핑하여 검색 속도를 향상하는 방법을 사용할 수 있다.

 

Numeric field types

Elasticsearch에는 long, integer, douvle, float,... 등 다양한 숫자형 데이터 타입을 제공한다. 숫자형 타입을 사용하면 range 쿼리를 사용하여 데이터를 조회할 수 있고, 숫자형 데이터 기반으로 정렬도 가능하다.

참고 : https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/number

 

Keyword type family

키워드 타입의 경우 ID, E-mail, 상태코드, 우편번호 또는 대그와 같은 구조화된 데이터에 사용한다. keyword 타입의 정렬에는 사전 방식의 정렬을 사용한다.

참고 : https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/keyword 

 

숫자형 데이터를 keyword 타입으로 선언하는 경우 

ISBN이나 제품의 ID, 카테고리 ID의 데이터의 경우 숫자형 데이터를 사용하지만 실제 검색하는 경우에는 range 검색보다는 정확히 일치하는 값을 검색하는 경우가 많다. term 쿼리를 사용하여 데이터를 검색하는 경우 keywrod 타입은 정확한 값 일치 검색(term-level queries)에 최적화되어 있고, 숫자형 데이터의 경우 range 쿼리를 사용하여 데이터를 검색하게 된다.

데이터를 조회하는 방식이 아래와 같다면 숫자형 식별자를 위해서는 숫자형(numeric) 타입이 아닌 keyword 타입으로 맵핑하여 검색 속도를 최적화할 수 있다.

  • range 쿼리를 사용하여 데이터를 검색하는 경우가 없는 경우 
  • 검색 속도가 중요한 경우. term 쿼리의 경우 keyword 필드에 대한 검색이 numeric 필드 검색보다 대부분의 경우 빠르다.

 

numeric 타입과 keyword 타입의 조회 성능 비교

동일한 수의 데이터를 사용하여 카테고리 ID 필드에 대하여 첫 번째 인덱스는 integer(numeric) 타입으로 맵핑 정보를 입력하고, 다른 인덱스는 keyword 타입으로 맵핑 정보를 입력하여 데이터를 색인하고, kibana의 Search Profiler를 사용하여 각각 데이터가 어떻게 검색되는지, 어떤 타입으로 검색하는 것이 성능에 더 유리한지 알아본다.

테스트에 사용한 검색 쿼리와 Mapping 정보는 아래와 같다. (데이터는 상품 데이터로 150만 건)

 

Search Query

{
  "query": {
    "term": {
      "category_id": {
        "value": 32
      }
    }
  }
}

 

Mapping

numeric keyword
"mappings": {
    ......
    "category_id" : {
        "type": "integer"
    }
    ......
}
"mappings": {
    ......
    "category_id" : {
        "type": "keyword"
    }
    ......
}

 

타입에 따른 성능 비교

Type Query Description Total time Self time
numeric PointRangeQuery category_id: [32 TO 32] 2.861ms 1.6ms (55.34%)
keyword TermQuery category_id: 32 0.503ms 0.0ms (6.61%)

 

integer 타입의 category_id 필드를 term 쿼리로 검색하면 자동으로 PointRangeQuery가 사용되고, 범위 검색으로 변경되어 검색된다.

keywor 타입의 category_id 필드를 검색하면 일반 문자열 데이터와 동일하게, term 쿼리로 검색되고 numeric 타입보다 훨씬 빠른 속도로 검색되는 것을 볼 수 있다.

 

마무리

Elasticsearch는 숫자 범위 및 지리적 거리 검색을 포함하여 다차원 숫자 및 지리 공간 데이터의 효율적인 인덱싱 및 검색을 위해서 BKD(Block K-Mimensional) 트리를 사용한다. BKD 트리는 숫자형 데이터를 구조화된 형식으로 저장하여 빠른 검색 범위 쿼리와 여러 숫자 차원에 대한 필터를 동시에 수행하여 빠른 검색 속도를 제공하지만, 위에서 살펴본 내용처럼 range로 데이터 검색할 필요가 없는 경우 keyword 타입을 사용하여 검색 성능을 향상할 수 있다.

 

 

 

 

728x90