unsigned_long 필드 타입

unsigned_long 필드 타입

unsigned_long 필드 타입은 0부터 2^64 − 1까지의 값을 표현하는 부호 없는 64비트 정수형 필드 타입이에요. 아래 예시에서는 counter를 unsigned_long 필드로 매핑하고 있어요.

출처: 문서

본문

2.8 버전에서 도입되었어요.

unsigned_long 필드 타입은 최솟값 0, 최댓값 2^64 − 1을 가지는 부호 없는 64비트 정수형 숫자 필드 타입이에요. 다음 예시에서는 counter를 unsigned_long 필드로 매핑합니다.

PUT testindex 
{
  "mappings" : {
    "properties" :  {
      "counter" : {
        "type" : "unsigned_long"
      }
    }
  }
}

인덱싱 (Indexing)

unsigned_long 값을 가진 문서를 인덱싱하려면 다음 요청을 사용하세요.

PUT testindex/_doc/1 
{
  "counter" : 10223372036854775807
}

또는 다음과 같이 Bulk API를 사용할 수도 있어요.

POST _bulk
{ "index": { "_index": "testindex", "_id": "1" } }
{ "counter": 10223372036854775807 }

unsigned_long 타입 필드에서 store 파라미터가 true로 설정된 경우(즉 저장 필드인 경우) 그 값은 문자열로 저장되고 반환돼요. unsigned_long 값은 소수 부분을 지원하지 않으므로, 소수 부분이 제공되면 잘려 나가요.

쿼리하기 (Querying)

unsigned_long 필드는 다른 숫자 타입이 지원하는 대부분의 쿼리를 지원해요. 예를 들어 unsigned_long 필드에 term 쿼리를 사용할 수 있어요.

POST _search
{
  "query": {
    "term": {
      "counter": {
        "value": 10223372036854775807
      }
    }
  }
}

range 쿼리도 사용할 수 있어요.

POST _search
{
  "query": {
    "range": {
      "counter": {
        "gte": 10223372036854775807
      }
    }
  }
}

정렬 (Sorting)

unsigned_long 필드에 정렬 값을 사용해 검색 결과의 순서를 정할 수 있어요. 예를 들면 다음과 같아요.

POST _search
{
  "sort" : [
    { 
      "counter" : { 
        "order" : "asc" 
      } 
    }
  ],
  "query": {
    "range": {
      "counter": {
        "gte": 10223372036854775807
      }
    }
  }
}

unsigned_long 필드는 인덱스 정렬 필드(sort.field 인덱스 설정)로는 사용할 수 없어요.

집계 (Aggregations)

다른 숫자 필드와 마찬가지로 unsigned_long 필드는 집계를 지원해요. terms와 multi_terms 집계에서는 unsigned_long 값이 그대로 사용되지만, 다른 집계 타입에서는 값이 double 타입으로 변환돼요(정밀도 손실이 발생할 수 있어요). 다음은 terms 집계의 예시예요.

POST _search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "counters": {
      "terms": { 
         "field": "counter" 
      }
    }
  }
}

스크립트 (Scripting)

스크립트에서 unsigned_long 필드는 BigInteger 클래스의 인스턴스로 반환돼요.

POST _search
{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": "BigInteger amount = doc['counter'].value; return amount.compareTo(BigInteger.ZERO) > 0;"
        }
      }
    }
  }
}

제한 사항 (Limitations)

unsigned_long 필드 타입에는 다음 제한 사항이 있어요.

  • 서로 다른 숫자 타입 간에 집계를 수행할 때 그중 하나가 unsigned_long이면 값이 double 타입으로 변환되고 double 연산이 사용되어 정밀도 손실이 발생할 가능성이 높아요.
  • unsigned_long 필드는 인덱스 정렬 필드(sort.field 인덱스 설정)로 사용할 수 없어요. 이 제한은 여러 인덱스에 대해 검색할 때 그중 하나 이상의 인덱스에서 해당 필드가 unsigned_long 타입이고 다른 인덱스에서는 다른 숫자 타입(들)인 필드를 기준으로 결과를 정렬하는 경우에도 적용돼요.

더 알아보기 (Learn more)