7.2.7 기타 필드 타입 - IP, Range, Binary

이 문서의 허가되지 않은 무단 복제나 배포 및 출판을 금지합니다. 본 문서의 내용 및 도표 등을 인용하고자 하는 경우 출처를 명시하고 김종민(kimjmin@gmail.com)에게 사용 내용을 알려주시기 바랍니다.

지금까지 문자열, 숫자, 날짜, 불리언, 객체, 위치정보 들을 저장하는 필드 타입들을 살펴보았습니다. 이 외에도 Elasticsearch에는 다음과 같은 추상화 된 데이터 타입들이 있습니다.

IP

IP 주소 형식을 저장합니다. 매핑은 "type": "ip" 으로 선언합니다. 값은 "192.168.1.1" 같은 IPv4 형식과 "0:0:0:0:0:ffff:c0a8:105" 같은 IPv6 형식을 문자열 처럼 입력합니다.

범위(Range)

숫자나 날짜, IP 등을 시작과 끝이 있는 2차원의 범위 형태로 저장합니다. 매팽의 "type" 에 선언 가능한 값은 integer_range, float_range, long_range, double_range, date_range, ip_range 들이 있습니다. 데이터의 범위는 다음과 같이 gt, gte, lt, lte 를 사용해서 지정합니다.

integer_range 와 date_range 타입의 필드 선언
PUT my_range
{
"mappings": {
"properties": {
"amount": {
"type": "integer_range"
},
"days": {
"type": "date_range"
}
}
}
}

쿼리를 테스트 하기 위해 먼저 다음 도큐먼트를 입력하겠습니다.

integer_range, date_range 타입의 값을 가진 도큐먼트 입력
PUT my_range/_doc/1
{
"amount": {
"gte": 19,
"lt": 28
},
"days": {
"gt": "2019-06-01T09:00:00",
"lt": "2019-06-20"
}
}

Range 필드의 쿼리는 일반적인 숫자나 날짜 처럼 range 쿼리를 사용합니다. 다만 범위 데이터를 range 쿼리로 검색 할 때는 추가로 relation 옵션의 값을 입력해야 하며 입력하지 않으면 오류가 납니다. relation 옵션에 지정 가능한 값은 within, contains, intersects 3가지가 있습니다.

  • within : 도큐먼트 범위 값이 쿼리한 범위 안에 완전히 포함되는 도큐먼트들을 가져옵니다.

  • contains : within과 반대로 쿼리 범위가 도큐먼트 범위 값 안에 완전히 포함되는 도큐먼트들을 가져옵니다.

  • Intersects : 도큐먼트 범위 값과 쿼리 범위에 공통적인 부분이 있는 도큐먼트들을 가져옵니다.

사용 예제는 다음과 같습니다.

request
response
request
"relation": "intersects" 으로 range 쿼리
GET my_range/_search
{
"query": {
"range": {
"amount": {
"gte": "16",
"lte": "25",
"relation": "intersects"
}
}
}
}
response
"relation": "intersects" 으로 range 쿼리 결과
{
"took" : 950,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "my_range",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"amount" : {
"gte" : 19,
"lt" : 28
},
"days" : {
"gt" : "2019-06-01T09:00:00",
"lt" : "2019-06-20"
}
}
}
]
}
}

다른 값을 가진 도큐먼트를 더 입력하고 relation 값을 contains, within 으로 변경 해 가면서 더 실습 해 보시기 바랍니다.

여행이나 출장 정보를 담은 도큐먼트가 있다면 시작일, 종료일 두 필드를 지정하는 대신 출장기간 이라는 date_range 타입의 단일 필드로 값을 저장해서 더욱 편하고 유용하게 사용할 수 있습니다.

Binary

"type": "binary" 로 지정해서 시스템 파일이나 이미지 정보 같은 바이너리 값을 저장할 수 있습니다. binary 필드는 기본적으로 색인이 되지 않아 검색이나 집계가 불가능하고 _source에만 남아 있습니다.

바이너리 정보들은 일반적으로 용량이 크기 때문에 elasticsearch 도큐먼트에 저장하는 것은 불필요한 저장소와 통신 데이터의 낭비가 될 수 있습니다. 가능하면 바이너리 데이터의 저장은 S3 또는 HDFS 같은 저렴한 저장소를 이용하고 elasticsearch 도큐먼트에는 해당 자원에 접근 가능한 키 또는 URL 등만 저장해서 따로 가져오도록 하는 것이 바람직합니다.

지금까지 설명한 필드 외에도 수많은 종류의 필드 타입들이 있습니다. 새 버전이 나올 때 마다 새로운 필드 타입들이 추가되거나 기존에 있던 타입들의 사용이 만료되고 있기 때문에 항상 공식 도큐먼트를 잘 참고하시기 바랍니다.