Elasticsearch 인덱스는 일반적인 관계형 데이터베이스와 성격이 다릅니다. 인덱스는 도큐먼트를 저장하는 논리적 구분자이며, 도큐먼트는 실제 데이터를 저장하는 단위입니다.
도큐먼트는 엘라스틱서치에서 데이터가 저장되는 기본 단위로 JSON 형태이며, 하나의 도큐먼트는 여러 필드와 값을 갖고 있습니다. 이번 포스팅에서는 엘라스틱 서치가 도큐먼트에 데이터를 어떻게 저장하는지 알아볼려고 합니다.
인덱스(index)
인덱스는 도큐먼트를 저장하는 논리적 단위로, 관계형 데이터 베이스의 테이블과 유사한 개념입니다. 하나의 인덱스에 다수의 도큐먼트가 포함되는 구조이며, 동일한 인덱스에 있는 도큐먼트는 동일한 스키마를 가질 수 있습니다. 그리고 모든 도큐먼트는 반드시 하나의 인덱스에 포함돼야 합니다. 인덱스 이름에는 영어 소문자를 비롯해 \, /, * ?, ", < , >, |, #, 공백, 쉼표 등을 제외한 특수문자를 사용할 수 있으며 255바이트를 넘기면 안 됩니다.
인덱스 생성/조회/삭제는 간단한 명령어인 PUT/GET/DELETE <인덱스명>으로 간단하게 연산을 할 수 있습니다. 아래의 코드들은 예시와 응답 코드를 보여줍니다.
인덱스 생성
put index
//응답값
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "index;"
}
인덱스 조회
get index
//응답값
{
"index;": {
"aliases": {},
"mappings": {},
"settings": {
"index": {
"routing": {
"allocation": {
"include": {
"_tier_preference": "data_content"
}
}
},
...
}
인덱스 삭제
delete index
// 응답값
{
"acknowledged": true
}
도큐먼트 CRUD
도큐먼트 생성
put index/_doc/1
{
"name": "comdolidol-i",
"age": 20,
"gender": "male"
}
//응답값
{
"_index": "index",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
도큐먼트 조회
인덱스명과 도큐먼트 아이디를 이용해 특정 도큐먼트의 데이터를 가져올 수 있습니다. 하지만 실제 운영에서는 도큐먼트 하나씩 읽어오는 경우는 드물기 때문에 추후에 포스팅할 search를 통해서 도큐먼트를 읽어올 수 있습니다.
get index/_doc/1
//응답값
{
"_index": "index",
"_id": "1",
"_version": 2,
"_seq_no": 1,
"_primary_term": 1,
"found": true,
"_source": {
"name": "comdolidol-i",
"age": 30,
"gender": "male"
}
}
도큐먼트 수정
도큐먼트 업데이트를 위한 특별한 API가 있는 것은 아닙니다. 도큐먼트를 인덱싱하는 과정에서 같은 도큐먼트 아이디가 있으면 덮어쓰기 되는 것인데 마치 도큐먼트가 업데이트되는 것처럼 보이게 됩니다. 응답 결과를 보면 도큐먼트가 업데이트되었다고 나옵니다.
put index/_doc/1
{
"name": "comdolidol-i",
"age": 30,
"gender": "male"
}
//응답값
{
"_index": "index",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
이 상태에서 특정 필드의 값만 업데이트하고 싶을 때, _update라는 엔드포인트를 추가하여 업데이트를 할 수 있습니다. 아래 예제는 나이 값을 변동하여 업데이트를 쳐봤습니다.
put index/_doc/1
{
"age": 30,
"name": "quokka",
"country": "korea"
}
post index/_update/1
{
"doc" : {"age": 40}
}
//응답값
{
"_index": "index",
"_id": "1",
"_version": 4,
"result": "noop",
"_shards": {
"total": 0,
"successful": 0,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
//
get index/_doc/1
{
"_index": "index",
"_id": "1",
"_version": 4,
"_seq_no": 3,
"_primary_term": 1,
"found": true,
"_source": {
"age": 40,
"name": "quokka",
"country": "korea"
}
}
도큐먼트 삭제
마지막으로 도큐먼트를 삭제를 해보겠습니다. 특정 도큐먼트를 삭제하기 위해서는 인덱스명과 도큐먼트 아이디를 알고 있어야 합니다. 키바나 콘솔에서 도큐먼트를 삭제하는 명령어를 치면, 생성했던 도큐먼트의 값이 삭제됩니다.
delete index/_doc/1
//응답값
{
"_index": "index",
"_id": "1",
"_version": 3,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
'DevOps > Elastic Stack' 카테고리의 다른 글
[Elasticsearch] 성능 향상을 위한 doc_values 사용법: 메모리 효율 향상시키기 - 컴도리돌이 (3) | 2024.11.09 |
---|---|
[Elasticsearch] 성능 개선을 위한 코드 비교 및 분석 - 컴도리돌이 (4) | 2024.11.08 |
[Elasticsearch] wildcard 쿼리에 대해 제대로 이해하기 - 컴도리돌이 (0) | 2024.11.07 |
[Elasticsearch] 엘라스틱 서치 역인덱스(Elasticsearch inverted index) - 컴도리돌이 (0) | 2024.01.17 |
[ELK] Elastic Stack에 대해서 - 컴도리돌이 (2) | 2024.01.16 |