검색 엔진 Search/Elastic Search

[Basic] Elasticsearch 문서 인덱싱 - Index, Delete, Update, Bulk

이번 글에서는 지난 글에서 직접 구축했던  인덱스에 도큐먼트를 인덱싱하고, 삭제하고, 업데이트 하는 방법을 알아보고자 합니다.

지난 글을 읽지 않았어도, 인덱스 생성에 관해 매핑, 분석, 설정 등 기본적인 지식을 알고 있다면, 본 글을 쉽게 이해하실 수 있습니다! 

 

Elasticsearch 시리즈는 7.10 버전을 기본으로 설명합니다. 필요하다면 8.0 이후의 버전 내용을 추가로 설명합니다.

 

도큐먼트를 인덱싱 할 대상 인덱스는 다음과 같이 정의하였습니다.

PUT /sample-user-index
{
  "mappings": {
    "properties": {
      "age": { 
      	"type": "integer",
      },  
      "level": { "type": "keyword" }, 
      "name": { 
      	"type": "text",
        "analyzer": "standard",
        "search_analyzer": "standard_synonym"
       }     
    }
  },
  "settings": {
    "index": {
      "number_of_shards": "1",
      "number_of_replicas": "2"
      "similarity": {
        "default": {
          "type": "BM25"
        }
      },
      "analysis": {
        "filter": {
          "synonym": {
            "updateable": "true",
            "expand": "true",
            "type": "synonym_graph",
            "synonyms_path": "analysis/synonym.txt",
            "lenient": "true"
          }
        },
        "analyzer": {
          "standard": {
            "filter": [
              "lowercase"
            ],
            "type": "custom",
            "tokenizer": "standard"
          },
          "standard_synonym": {
            "filter": [
              "lowercase",
              "synonym"
            ],
            "type": "custom",
            "tokenizer": "standard"
          }
        }
      }
    }
  }
}

 

단일 문서 인덱싱 Single Document Index, Get, Delete

지정된 인덱스에 JSON 형식의 도큐먼트를 추가하여 검색할 수 있도록 합니다.

대상이 인덱스이고 문서가 이미 존재하는 경우, 요청은 문서를 업데이트하고 버전을 증가시킵니다.

 

사용할 수 있는 인덱싱 API 요청은 다음과 같습니다.

  • PUT /<target>/_doc/<_id>
  • POST /<target>/_doc/
  • PUT /<target>/_create/<_id>
  • POST /<target>/_create/<_id>

 

타겟으로는 인덱스명 또는 인덱스 별칭(alias)을 지정할 수 있습니다.

(데이터 스트림에 관한 내용은 본 글에서 다루지 않습니다.)

 

직접 문서의 _id 를 지정할 수도 있고, 지정하지 않을 경우 검색 엔진에서 자동으로 _id를 생성합니다.

 

그럼 이제 위에서 정의한 sample-user-index 에 문서를 인덱싱 해볼까요?

다음 스크립트에서와 같이 인덱스 매핑에 정의한 필드에 맞춰 JSON 형식으로 문서 데이터를 request body에 포함합니다.

PUT /sample-user-index/_doc/1
{
  "age": "20",  
  "level": "VIP", 
  "name": "Donald Duck"
}

 

인덱싱한 문서를 확인하려면 문서 _id 와 함께 GET 요청을 사용합니다.

GET /sample-user-index/_doc/1

 

만약 인덱싱한 문서를 삭제하려면 request body 없이 다음과 같이 DELETE 요청을 보내면 됩니다.

DELETE /sample-user-index/_doc/1

 

단일 문서 업데이트 Single Document Update

기존에 인덱싱 되어있는 문서의 일부 데이터만 업데이트 하는 경우가 있을 수 있습니다.

Update는 이때 사용하는 요청입니다.

 

위 단락에서 인덱싱한 문서 1번에 대해 유저의 레벨 필드만을 부분 업데이트하는 방법은 다음과 같습니다.

POST /sample-user-index/_update/1
{
  "doc": {
    "level": "VVIP"
  }
}

 

*문서의 일부분만 업데이트하는 경우가 아니라, 전체 데이터를 업데이트 하고자 한다면 동일한 _id로 새로운 문서 데이터를 request body에 포함시켜 다시 Index 요청을 보내면 됩니다.

 

2개 이상의 문서 업데이트 Multi Document - Bulk Indexing 

한 번의 API 호출로 여러 인덱싱 또는 삭제 작업을 수행합니다. 

이렇게 하면 오버헤드가 줄어들고 인덱싱 속도가 크게 향상될 수 있습니다.

 

Bulk API 요청으로 여러개의 문서 관련 작업, 혹은 서로 다른 인덱스로의 인덱싱 작업도 가능합니다.

 

우선 하나의 인덱스를 대상으로 여러개의 작업 요청을 보내는 방법을 알아봅시다.

request body 에는 create, delete, index, update 작업 및 관련 소스 데이터의 개행으로 구분된 목록이 포함되어 있습니다.

create 작업은 지정한 _id의 문서가 아직 존재하지 않는 경우 색인을 새로 생성하지만, index 작업은 지정된 문서를 색인화합니다. index 작업 문서가 이미 있는 경우 문서를 대체하고 버전을 증가시킬 수도 있습니다.

sample-user-index 인덱스를 대상으로 여러 문서 작업을 수행하는 예시는 다음과 같습니다.

POST sample-user-index/_bulk
{ "index" : { "_id" : "2" } }
{ "age" : "24", "level" : "Friends", "name" : "Mickey Mouse" }
{ "delete" : { "_id" : "2" } }
{ "create" : { "_id" : "3" } }
{ "age" : "23", "level" : "Friends", "name" : "Daisy Duck" }
{ "update" : {"_id" : "1"} }
{ "doc" : {"level" : "VIP"} }

 

만약 sample-user-index 인덱스와 동일한 매핑을 가지는 sample-new_user-index 가 존재한다고 했을 때, 2개의 인덱스를 대상으로 동시에 인덱스 작업을 수행할 수 있습니다.

그 예시는 다음과 같습니다. index를 request body 파라미터로 추가할 수 있습니다.

POST _bulk
{ "index" : { "index" : "sample-user-index", "_id" : "2" } }
{ "age" : "24", "level" : "Friends", "name" : "Mickey Mouse" }
{ "delete" : {  "index" : "sample-user-index",  "_id" : "2" } }
{ "create" : { "_id" : "3",  "index" : "sample-new_user-index",  } }
{ "age" : "23", "level" : "Friends", "name" : "Daisy Duck" }
{ "update" : {"_id" : "1", "index" : "sample-user-index"} }
{ "doc" : {"level" : "VIP"} }
{ "update" : {"_id" : "3", "index" : "sample-new_user-index"} }
{ "doc" : {"level" : "VIP"} }

 

마무리

오늘은 인덱스에 문서를 인덱싱하고, 삭제하고, 업데이트하는 방법을 알아보았습니다.

단일 문서에 대해서만 문서 작업 요청을 보낼 수도 있지만, bulk API를 통해 동시에 create, index, update, delete의 여러 작업을 요청할 수도 있습니다.

또, 여러 인덱스에 동시에 문서 작업 요청을 보내는 것도 가능합니다.

 

 

레퍼런스

 

Document APIs | Elasticsearch Guide [7.10] | Elastic

All CRUD APIs are single-index APIs. The index parameter accepts a single index name, or an alias which points to a single index.

www.elastic.co