Elasticsearch는 검색 엔진으로 인기가 많은 오픈 소스 소프트웨어입니다. 이번 글에서는 Elasticsearch의 스키마 파일을 이용한 인덱스 생성과 데이터 삽입, 그리고 필드 매핑 정보 정의에 대해 알아보겠습니다.
우선, Elasticsearch에서는 데이터를 저장하기 위해 인덱스를 생성해야 합니다. 이때 인덱스 생성을 위해 스키마 파일을 작성해야 합니다. 스키마 파일은 인덱스의 설정과 매핑 정보를 정의하는 파일로, JSON 형식으로 작성됩니다.
예를 들어, 다음과 같은 스키마 파일을 작성해보겠습니다.
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"title": {
"type": "text"
},
"content": {
"type": "text"
},
"timestamp": {
"type": "date"
}
}
}
}
위 스키마 파일에서는 settings와 mappings을 정의하고 있습니다. settings는 인덱스의 설정 정보를 정의하고, mappings는 인덱스 내 문서의 필드 정보를 정의합니다. 위 예시에서는 title, content, timestamp 필드를 정의하였습니다.
이제 인덱스를 생성하기 위해 다음과 같은 명령어를 실행합니다.
curl -XPUT -H 'Content-Type: application/json' 'http://localhost:9200/test_index' -d @test_index.json
위 명령어에서는 test_index라는 인덱스를 생성하고, 해당 인덱스에 대한 설정과 매핑 정보를 스키마 파일(test_index.json)에서 가져오도록 합니다.
인덱스를 생성한 후, 데이터를 삽입할 수 있습니다. 다음과 같은 명령어를 실행하여 데이터를 삽입할 수 있습니다.
curl -XPOST -H 'Content-Type: application/json' 'http://localhost:9200/test_index/info' -d '{"title": "Second Document", "content": "This is the second document", "timestamp": "2022-03-14T00:00:00"}'
위 명령어에서는 test_index라는 인덱스에 title, content, timestamp 필드 값을 갖는 문서를 삽입하였습니다.
이제 데이터를 삽입하였으니 해당 인덱스의 데이터를 확인해보겠습니다. 다음과 같은 명령어를 실행하여 데이터를 확인할 수 있습니다.
curl 'http://localhost:9200/test_index/_search?pretty'
위 명령어에서는 test_index라는 인덱스의 데이터를 검색하여 결과를 출력합니다.
이번에는 Elasticsearch에서 동적 매핑과 필드 매핑 정보에 대해 알아보겠습니다.
Elasticsearch는 데이터가 색인될 때 자동으로 매핑(mapping)을 생성합니다. 매핑은 데이터 타입을 정의하는 스키마(schema)의 역할을 합니다. Elasticsearch는 동적 매핑(Dynamic Mapping)을 기본적으로 지원하며, 데이터가 색인될 때 자동으로 필드 매핑 정보를 생성합니다.
예를 들어, 새로운 필드가 추가된 데이터를 색인할 경우, Elasticsearch는 이 필드를 자동으로 인식하여 새로운 필드 매핑 정보를 생성합니다. 이 때, 문자열은 text로 인식하고, 숫자는 integer 또는 long 데이터 타입을 사용합니다.
하지만, 동적 매핑의 경우 의도한 대로 매핑되지 않을 수 있습니다. 이를 방지하기 위해서는 명시적으로 필드 매핑 정보를 정의해주어야 합니다. 또한, 동적 갱신을 제한하기 위해 dynamic 속성을 사용할 수 있습니다. dynamic 속성을 false로 설정하면 불필요한 필드의 추가나 잘못된 데이터 타입을 방지할 수 있습니다.
이미 동적 매핑 된 데이터 타입을 변경할 수 있지만, 이미 indexing 된 데이터까지 변경할 수는 없습니다. 이미 indexing 된 데이터를 변경하려면 reindexing이 필요합니다. (reindexing에는 많은 시간이 소요됩니다.)
새로 들어올 필드를 미리 알고 있을 때는 필드를 미리 정의해줄 수 있습니다. 아래는 필드 매핑 정보를 명시적으로 정의하는 예시입니다.
{
"properties": {
"api": {
"type": "text"
}
}
}
필드 매핑 정보를 정의한 후, PUT API를 사용하여 매핑을 업데이트할 수 있습니다. 아래는 예시입니다.
curl -X PUT "http://localhost:9200/test_index/_mapping" -H 'Content-Type: application/json' -d@'/add_new_field.json'
필드 매핑 정보를 확인하기 위해서는 GET API를 사용합니다.
curl -X GET "http://localhost:9200/test_index/_mapping?pretty"
이상으로 Elasticsearch에서 동적 매핑과 필드 매핑 정보에 대해 알아보았습니다. 동적 매핑은 편리하지만 의도한 대로 매핑되지 않을 수 있으므로 명시적으로 필드 매핑 정보를 정의해주는 것이 좋습니다.
'BigData > ElasticSearch' 카테고리의 다른 글
Elasticsearch 노드의 종류와 역할 (feat 동작 흐름) (0) | 2023.03.22 |
---|---|
Elasticsearch에서 사용되는 주요 용어 10가지 (0) | 2023.03.21 |
Keyword Field를 활용하는 다양한 쿼리 예제 (0) | 2023.03.20 |
초보자를 위한 Elasticsearch 시작하기: CRUD (0) | 2023.03.19 |
Elasticsearch 주요 field data types (V7.10 기준) (0) | 2023.03.17 |