본문 바로가기

프로젝트/여행지 오픈 API

[ElasticSearch] 4. 필드와 멀티 필드, 인덱스 템플릿

필드와 멀티 필드

전문 검색의 경우 검색과 동시에 정렬이 필요한 경우도 있다.

이럴 경우 단일 필드 입력에 여러 하위 필드를 정의하여 사용한다.

필드

  • Elasticsearch의 문서는 여러 개의 필드(field)로 구성된다.
  • 각 필드는 특정한 데이터 타입을 가진다. 예를 들면, string, integer, date 등이 있다.
  • 매핑(mapping)에서는 각 필드의 데이터 타입, 분석 방법 등을 정의한다.
{
    "properties": {
        "title": {
            "type": "text"
        }
    }
}

멀티 필드 (Multi-field)

  • 멀티 필드는 하나의 필드를 여러 방식으로 인덱싱하려고 할 때 사용된다.
  • 예를 들어, 텍스트 필드가 있을 때, 한 번은 원본 텍스트로, 다른 한 번은 키워드로 인덱싱하고 싶다면 멀티 필드를 사용한다.
  • 주로 원본 텍스트 검색과 정확한 값 매치 두 가지 방식으로 검색을 원할 때 유용하다.위 예제에서 title 필드는 text 타입으로 매핑되며, 동시에 title.keyword로 키워드 타입으로도 인덱싱된다.
{
    "properties": {
        "title": {
            "type": "text",
            "fields": {
                "keyword": {
                    "type": "keyword"
                }
            }
        }
    }
}

이런 방식으로, 멀티 필드를 활용하면 동일한 데이터에 대해 다양한 검색 전략을 적용할 수 있다.

예제

PUT multifield_index/_doc/1
{
    "message" : "1 docs",
    "contents": "hi there."
}

PUT multifield_index/_doc/2
{
    "message" : "2 docs",
    "contents": "hi there my name."
}

PUT multifield_index/_doc/3
{
    "message" : "3 docs",
    "contents": "hi there my name is shin"
}
PUT multifield_index/_doc/4
{
    "message" : "3 docs for aggs",
    "contents": "hi there my name is shin"
}



//이렇게 3개의 도큐먼트를 넣고, match로 멀티 필드 검색을 실행해보자.
//3개의 결과가 검출된다.
GET multifield_index/_search
{
    "query": {
        "match": {
            "contents": "hi"
        }
    }
}

//이 뒤에 추가로 필드를 달아 참조할 수도 있다.
//여기서 keyword는 사용자가 지정한 명칭이다. abc 같은걸 써도 되지만, 통상적인 사용은 keyword이다.

GET multifield_index/_search
{
  "query": {
    "match": {
      "contents.keyword": "hi there."
    }
  }
}

//집계 함수 예시
GET multifield_index/_search
{
    "size": 0,
    "aggs": {
        "contents" : {
            "terms" : {
                "field" : "contents.keyword"
            }
        }
    }
}

인덱스 템플릿

인덱스 템플릿(Index Template)은 Elasticsearch에서 사용되는 기능으로, 새로운 인덱스를 생성할 때 적용될 설정과 매핑을 미리 정의해둔 템플릿을 의미한다.

주로 동일한 설정의 복수 인덱스를 생성할 때 사용한다.

//조회
GET _index_template

//인덱스 템플릿 생성
PUT _index_template/test_template
{
    "index_patterns": ["test_*"],
    "priority": 1,
    "template": {
        "settings": {
            "number_of_shards": 3,
            "number_of_replicas": 1    
        },
        "mappings": {
            "properties": {
                "name": {"type": "text"},
                "age": {"type": "short"},
                "gender": {"type": "keyword"}
            }
        }
    }
}

//해당 템플릿에 맞는 인덱스 생성
PUT test_index1/_doc/1
{
    "name": "kim",
    "age": 10,
    "gender": "male"
}