> For the complete documentation index, see [llms.txt](https://esbook.kimjmin.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://esbook.kimjmin.net/07-settings-and-mappings/7.2-mappings/7.2.7-ip-range-binary.md).

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

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

### IP

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

### 범위(Range)

&#x20; 숫자나 날짜, IP 등을 시작과 끝이 있는 2차원의 범위 형태로 저장합니다. 매팽의 "type" 에 선언 가능한 값은 **integer\_range**, **float\_range**, **long\_range**, **double\_range**, **date\_range**, **ip\_range** 들이 있습니다. 데이터의 범위는 다음과 같이 **gt**, **gte**, **lt**, **lte** 를 사용해서 지정합니다.

{% code title="integer\_range 와 date\_range 타입의 필드 선언" %}

```javascript
PUT my_range
{
  "mappings": {
    "properties": {
      "amount": {
        "type": "integer_range"
      },
      "days": {
        "type": "date_range"
      }
    }
  }
}
```

{% endcode %}

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

{% code title="integer\_range, date\_range 타입의 값을 가진 도큐먼트 입력" %}

```javascript
PUT my_range/_doc/1
{
  "amount": {
    "gte": 19,
    "lt": 28
  },
  "days": {
    "gt": "2019-06-01T09:00:00",
    "lt": "2019-06-20"
  }
}
```

{% endcode %}

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

* within : 도큐먼트 범위 값이 쿼리한 범위 안에 완전히 포함되는 도큐먼트들을 가져옵니다.
* contains : within과 반대로 쿼리 범위가 도큐먼트 범위 값 안에 완전히 포함되는 도큐먼트들을 가져옵니다.
* Intersects : 도큐먼트 범위 값과 쿼리 범위에 공통적인 부분이 있는 도큐먼트들을 가져옵니다.

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

{% tabs %}
{% tab title="request" %}
{% code title=""relation": "intersects" 으로 range 쿼리" %}

```javascript
GET my_range/_search
{
  "query": {
    "range": {
      "amount": {
        "gte": "16",
        "lte": "25",
        "relation": "intersects"
      }
    }
  }
}
```

{% endcode %}
{% endtab %}

{% tab title="response" %}
{% code title=""relation": "intersects" 으로 range 쿼리 결과" %}

```javascript
{
  "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"
          }
        }
      }
    ]
  }
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

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

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

### Binary

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

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

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