2020. 12. 19. 00:12ㆍ서버 프로그래밍
정말로 이해할 수 없게도 초반에 찾은 간단해보이는 레퍼런스들은 동작하지 않았다. update는 에러가 나지 않았지만 업데이트가 되지 않았고, update_by_query는 레퍼런스 대로 하면 다음과 같은 에러가 났다.
"elasticsearch.exceptions.RequestError: RequestError(400, 'search_phase_execution_exception', "Failed to parse query"
삽질 타임 시작!
kb.objectrocket.com/mongo-db/how-to-use-python-to-update-api-elasticsearch-documents-259
그럴듯해보이는 위의 레퍼런스 사이트들의 예제 대로 update나 update_by_query는 동작하지 않는다.
결국 여기서 단서를 찾았다. source에서 값을 직접 대입하는 명령을 수행하는 것이 아닌가!?
q = {
"script": {
"inline": "ctx._source.Device='Test'",
"lang": "painless"
},
"query": {
"match": {
"Device": "Boiler"
}
}
}
es.update_by_query(body=q, doc_type='AAA', index='testindex')
resp = client.update_by_query(
index="twitter",
body={
"script": {"source": "ctx._source.likes++", "lang": "painless"},
"query": {"term": {"user": "kimchy"}},
},
)
print(resp)
stackoverflow.com/questions/42489340/elastisearch-update-by-query
여러개의 값을 한번에 변경하려면 명령 뒤에 세미콜론을 구분자로 주면 된다.
POST /e-trend-web/items/_update_by_query
{
"query" : {
"bool" : {
"filter" : {
"terms" : {
"_id" : [1138081, 1138083, 1138089, 123456]
}
}
}
},
"script" : {
"inline" : "ctx._source.item_name= 'new_name'; ctx._source.item_price= 10000;",
"lang" : "painless"
}
}
discuss.elastic.co/t/is-there-any-way-to-update-multiple-fields-by-update-by-query/70644
참나, 별것도 아닌 ES의 update 기능에 대한 레퍼런스가 이렇게 없다는 것이 이해되지 않는다. 물론 다음 레퍼런스를 처음부터 찬찬히 읽어보았다면 좀더 시간을 낭비하지 않았으리라. 왜 처음에는 이런 것이 안보이는지 원.
www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html#docs-update