검색어 Lucene에 대한 글을 관련성을 기준으로 정렬하여 표시합니다. 날짜순 정렬 모든 글 표시
검색어 Lucene에 대한 글을 관련성을 기준으로 정렬하여 표시합니다. 날짜순 정렬 모든 글 표시

[컴][웹] ElasticSearch Mapping

ElasticSearch 의 mapping 에 대해 알아보자. 이 글은 대부분 아래글의 내용의 번역이 될 것이다.

일단 기본적으로 SQL DB 에 대한 지식이 있다는 전제로 이야기를 해 나가겠다.

schema? mapping?

elasticsearch 의 schema 는 json 형태로 되어 있다. 이 json 에 field 의 data type 이나, 어떤 식으로 Lucene index 안에서 어떻게 index 될 것인지 를 적어놓게 된다. 이런 이유로 elasticsearch 에서는 이 schema 를 mapping 이라고 부른다.

index, type, document

index 는 여러개의 type 을 갖을 수 있고, 1개의 type 은 여러개의 document 를 가질 수 있다. 물론 1개의 값을 가질 수도 있다.

index > type > document

index 를 SQL DB 의 database, type 을 table, document 를 record 로 보면 될 것이다. 아래글에 따르면, 처음 eleasticsearch 가 index 를 rdbms 의 database 와 같다고 했지만 그것이 mapping type 의 field 에 대해서는 틀린 가정을 가져온다고 한다. 그리고 see also. 2 를 확인하면, type 이라는 존재가 사라졌다. 그래서 이제 index 는 table 로 개념을 가져가는 듯 하다.

default mapping

ElasticSearch 는 기본적으로 mapping 이 없이도 알아서 indexing 을 해준다. indexing 을 하는 동안에 새로운 field 를 만날 때 dynamically 하게 index 를 만들어 준다.

버전 7.0.0 이후로는 __default__ mapping 이 사라졌다고 한다.(deprecated)

default mapping 을 없애고 대신 document type 마다 index 를 만들던지, 새로운 type 을 만들어서 그 안에서 2개의 type 을 하나로 묶고, 그것을 구별할 custom type field 를 가져가던지 하라고 한다.(참고)

단점

단점은

  • Detected type 이 정확하지 않을 수 있다.
  • 원하지 않는 data 복사가 생길 수 있다.(특히, _source , _all field)
  • indexing 과 searching 에 default analyzer 와 세팅을 사용한다.

mapping 을 사용하는 방법

index 생성시 사용

가장일반적인 방법이다

curl -XPOST ...:9200/my_index -d '{
    "settings" : {
        # .. index settings
    },
    "mappings" : {
        "my_type" : {
            # mapping for my_type
        }
    }
}'

Put Mapping API 사용

이녀석을 사용할 때는 mapping 되는 index 가 중복되는 경우에 mapping 이 update 되지 않을 수도 있고, ingnore_conflicts = true 로 한 경우라도, 이미 만들어진 index 가 새롭게 update 된 mapping 에 따라 update 되지 않을 수도 있다. 그래서 대부분의 경우는 index 생성시에 mapping 을 사용하는 방법을 이용하라고 한다.

$ curl -XPUT 'http://localhost:9200/my_index/my_type/_mapping' -d '
{
    "my_type" : {
        # mapping for my_type
    }
}

index의 mapping 정보 확인

elasticsearch-sql-cli.bat

<elasticsearch_root>/bin/elasticsearch-sql-cli.bat 를 실행하면, sql 로 elasticsearch 를 retrieve 할 수 있게 해준다. 일단 안되는 명령어는 error 가 나온다.

show tables;
select * from ".elatichq"

mapping 정보와 elasticsearch-sql-cli의 결과 비교

elasticsearch-sql-cli.bat 를 사용하면 아래처럼 mapping 정보를 확인할 수 있다. mapping 은 간략하게 이야기하면 RDBMS 의 schema 와 같은 역할을 한다고 보면 될 듯 하다.

sql> select * from ".elastichq";
    doc_id     |   doc_type    |historic_days_to_store|historic_poll_interval|  index_name   |show_dot_indices| store_metrics |    version    |websocket_interval
---------------+---------------+----------------------+----------------------+---------------+----------------+---------------+---------------+------------------
hqsettings     |data           |7                     |300                   |.elastichq     |true            |true           |1              |5


// curl localhost:9200/.elastichq?pretty=true
{
  ".elastichq" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "doc_id" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "doc_type" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "historic_days_to_store" : {
          "type" : "long"
        },
        "historic_poll_interval" : {
          "type" : "long"
        },
        "index_name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "show_dot_indices" : {
          "type" : "boolean"
        },
        "store_metrics" : {
          "type" : "boolean"
        },
        "version" : {
          "type" : "long"
        },
        "websocket_interval" : {
          "type" : "long"
        }
      }
    },
    "settings" : {
      "index" : {
        "routing" : {
          "allocation" : {
            "include" : {
              "_tier_preference" : "data_content"
            }
          }
        },
        "number_of_shards" : "1",
        "provided_name" : ".elastichq",
        "creation_date" : "1619967012964",
        "number_of_replicas" : "1",
        "uuid" : "gS2CCpcSSHGLmTRvqbetoQ",
        "version" : {
          "created" : "7120199"
        }
      }
    }
  }
}

See Also

  1. A Data Exploration Workflow for Mappings
  2. 쿠...sal: [컴] ElasticSearch 에서 Type 이 사라졌다
  3. 쿠...sal: [컴] elasticsearch 에서 curl 을 이용해서 data 옮기기