-
[Elasticsearch] 엘라스틱서치 데이터 수정(update)Elasticsearch 2023. 4. 18. 17:46
Elasticsearch에서는 데이터를 수정하는 대신에 재색인(reindexing)을 통해 데이터를 갱신합니다. 이는 Elasticsearch의 인덱싱 시스템의 특성상, 일단 인덱스에 데이터가 색인되면 수정이 불가능하기 때문입니다.
따라서, 데이터를 수정해야할 경우에는 먼저 해당 문서를 삭제(delete)한 뒤, 새로운 문서를 인덱싱(index)하는 방식으로 데이터를 갱신합니다. 이를 통해 수정된 데이터가 새로운 문서로 색인되고, 검색 시에도 최신의 데이터를 조회할 수 있습니다.
재색인의 경우에는 삭제 되었다가 새로 문서를 인덱싱했기 때문에 id값이 변화하게 됩니다.
수정 순서
- 기존 문서를 가져옵니다.
- 수정할 필드를 업데이트합니다.
- 수정된 문서를 Elasticsearch에 다시 색인합니다.
_update API
방법
POST /{index}/_update/{id} { "doc": { "{field}": "{new_value}" } }
- 여기서 **{index}**는 수정할 문서가 속한 인덱스 이름이고, **{id}**는 수정할 문서의 ID입니다. **{field}**와 **{new_value}**는 각각 수정할 필드와 새로운 값입니다. 만약 **{field}**가 객체나 배열의 필드인 경우, 해당 필드를 업데이트 하기 위해 Dot notation을 사용할 수 있습니다.
예시
- user 인덱스의 **id**가 **1**인 문서의 age 필드를 **30**으로 수정하는 쿼리는 다음과 같습니다.
POST /user/_update/1 { "doc": { "age": 30 } }
_update_by_query API
- 아래 예시는 **my_index**라는 인덱스에 있는 문서 중에서 category 필드가 **shoes**인 모든 문서의 price 값을 2배로 증가시키는 경우의 예시입니다.
- my_index 인덱스에서 category 필드가 **shoes**인 모든 문서를 검색합니다.
POST my_index/_search { "query": { "term": { "category": "shoes" } } }
2. 검색된 모든 문서를 대상으로 script 필드를 사용하여 price 값을 2배로 증가시키도록 update API를 호출합니다.
POST my_index/_update_by_query { "query": { "term": { "category": "shoes" } }, "script": { "source": "ctx._source.price *= 2" } }
- 위의 쿼리는 update_by_query API를 사용하여 문서를 수정하는 방법 중 하나입니다. 이 쿼리는 검색된 모든 문서를 대상으로 스크립트를 실행하여 문서를 수정합니다.
- 스크립트에서는 ctx._source 객체를 사용하여 문서의 원래 소스를 참조하고, 필드 값을 수정할 수 있습니다. 위의 쿼리에서는 price 필드 값을 2배로 증가시켰습니다.
_reindex API
- source 매개 변수는 데이터를 복사하고자 하는 원본 인덱스를 지정합니다. dest 매개 변수는 복사된 데이터를 저장할 대상 인덱스를 지정합니다.
- 아래 예시에서 source_index 는 데이터를 가져올 인덱스 이름을, **dest_index**는 새로운 인덱스 이름을 나타냅니다. 이를 실행하면 source_index 의 모든 데이터가 **dest_index**로 복사됩니다.
POST _reindex { "source": { "index": "source_index" }, "dest": { "index": "dest_index" } }
- 아래 예시에서는 date 필드가 "2022-01-01"부터 "2022-01-31" 사이에 있는 데이터만 복사됩니다.
POST _reindex { "source": { "index": "source_index", "query": { "range": { "date": { "gte": "2022-01-01", "lte": "2022-01-31" } } } }, "dest": { "index": "dest_index" } }
_bulk API
- myindex 인덱스에 1 이라는 ID를 가진 문서의 field2 필드 값이 new_value 로 업데이트됩니다.
POST /_bulk { "update" : { "_index" : "myindex", "_id" : "1" } } { "doc" : { "field2" : "new_value" } }
_update VS update_by_query, _reindex
_update, _update_by_query, _reindex 모두 Elasticsearch에서 데이터를 수정하거나 재색인하는 방법입니다. 그러나 각각의 차이점은 다음과 같습니다.
1. _update
- _update API는 하나의 문서(document)를 업데이트할 때 사용됩니다. 이 API를 사용하면 기존 문서의 내용을 변경하거나 새로운 필드를 추가할 수 있습니다. _update API는 다음과 같은 매개변수를 사용합니다.
- index: 문서가 포함된 인덱스 이름
- id: 문서의 고유 식별자
- body: 업데이트할 내용
2. _update_by_query
- _update_by_query API는 일치하는 모든 문서를 업데이트할 때 사용됩니다. 이 API를 사용하면 색인 내의 모든 문서를 대상으로 쿼리를 실행하고, 일치하는 모든 문서에 대해 업데이트를 수행합니다. _update_by_query API는 다음과 같은 매개변수를 사용합니다.
- index: 색인 이름
- body: 업데이트할 쿼리와 업데이트할 내용
3. _reindex
- _reindex API는 인덱스를 다시 색인할 때 사용됩니다. 이 API를 사용하면 기존 인덱스의 문서를 새로운 인덱스로 다시 색인할 수 있습니다. _reindex API는 다음과 같은 매개변수를 사용합니다.
- source: 기존 인덱스 이름
- dest: 새로 생성될 인덱스 이름
- body: 다시 색인할 문서의 쿼리 조건
💡 _update는 하나의 문서에 대한 수정, _update_by_query는 일치하는 모든 문서에 대한 수정, _reindex는 인덱스 전체에 대한 재색인 작업입니다.
엘라스틱 서치 가이드북
Elastic 가이드 북 - Elastic 가이드북
7. 인덱스 설정과 매핑 - Settings & Mappings
esbook.kimjmin.net
728x90'Elasticsearch' 카테고리의 다른 글
[Elasticsearch] 엘라스틱 서치 SpringBoot 연동 (0) 2023.06.26 [Elasticsearch] 엘라스틱 서치 Query vs Query DSL (0) 2023.04.18 [Elasticsearch] 엘라스틱 서치 데이터 삭제(delete) (0) 2023.04.17 [Elasticsearch] 엘라스틱 서치 데이터 검색(search) (0) 2023.04.10 [Elasticsearch] 엘라스틱 서치 데이터 색인 (0) 2023.04.07