Python으로 Elasticsearch update 실행

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

 

How to Use Python to Update API Elasticsearch Documents | ObjectRocket

Keep in the know! Subscribe to our emails and we’ll let you know what’s going on at ObjectRocket. We hate spam and make it easy to unsubscribe.

kb.objectrocket.com

znznzn.tistory.com/45

 

python 자주 사용하는 elasticsearch query 모음 (1)

준비 # es 라이브러리 연결 import elasticsearch # es 서버 연결 es = elasticsearch.Elasticsearch("localhost:9200") search / 조건부 값 찾기 (여러개, 단일은 get) # index와 doctype 이름은 company # 'use..

znznzn.tistory.com

그럴듯해보이는 위의 레퍼런스 사이트들의 예제 대로 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)

github.com/elastic/elasticsearch-py/blob/041a433de263482e306b3855ab67b93c03978966/docs/examples/2fd69fb0538e4f36ac69a8b8f8bf5ae8.asciidoc

 

elastic/elasticsearch-py

Official Python low-level client for Elasticsearch - elastic/elasticsearch-py

github.com

stackoverflow.com/questions/42489340/elastisearch-update-by-query

 

Elastisearch update by query

I am using this code in python for updating my docs in elasticsearch. It's working fine but it's difficult to use it for a millions docs because I have to initialise the id value everytime to update

stackoverflow.com

여러개의 값을 한번에 변경하려면 명령 뒤에 세미콜론을 구분자로 주면 된다.

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

 

Is there any way to update multiple fields by update_by_query

can I update multiple fields using update_by_query at once something like this? POST /e-trend-web/items/_update_by_query { "query" : { "bool" : { "filter" : { "terms" : { "_id" : [1138081, 1138083, 1138089, 123456] } } } }, "script" : { "inline" : "ctx._so

discuss.elastic.co

 

참나, 별것도 아닌 ES의 update 기능에 대한 레퍼런스가 이렇게 없다는 것이 이해되지 않는다. 물론 다음 레퍼런스를 처음부터 찬찬히 읽어보았다면 좀더 시간을 낭비하지 않았으리라. 왜 처음에는 이런 것이 안보이는지 원.

www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html#docs-update

 

Update API | Elasticsearch Reference [7.10] | Elastic

Updates a document using the specified script. POST / /_update/<_id> Enables you to script document updates. The script can update, delete, or skip modifying the document. The update API also supports passing a partial document, which is merged into the ex

www.elastic.co