본문 바로가기

프로젝트/여행지 오픈 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"
    }