2017-02-27 14 views
3

私はこのコードをpythonで使って、elasticsearchのドキュメントを更新しています。正常に動作していますが、毎回idの値を初期化してすべてのドキュメントを更新する必要があるため、数百万のドキュメントに使用するのは難しいです。Elastisearch update by query

from elasticsearch import Elasticsearch, exceptions 

elasticsearch = Elasticsearch() 

elasticsearch.update(index='testindex', doc_type='AAA', id='AVpwMmhnpIpyZkmdMQkT', 
       body={ 
        'doc':{'Device': 'updated'} 
       } 
       ) 

私はそれがまだ含まれているが、いないことをElasticsearchのドキュメントを読み込む: update_by_query(ないupdate)を使用してhttps://www.elastic.co/guide/en/elasticsearch/reference/current/_updating_documents.html

Note that as of this writing, updates can only be performed on a single document at a time. In the future, Elasticsearch might provide the ability to update multiple documents given a query condition (like an SQL UPDATE-WHERE statement).

+0

私は、qが動作するはずのパラメータとして取得する 'update_by_query'がかなり確実です。 pythonのためにこれをチェックしてください。http://elasticsearch-py.readthedocs.io/en/master/api.html#elasticsearch.Elasticsearch.update_by_query – christinabo

+0

こんにちはAhmyOhlinとサイトにようこそ。私はあなたの質問を編集して、このサイトの他の質問のフォーマットと一致させて、もう一度編集してください。 – MackM

+0

@christinabo 私はDeviceの値を 'Boiler'から 'Test'に変更したいと思っています。 パラメータq = 'Device: "Boiler"を使用してすべてのドキュメントを値' boiler 'で更新しましたが、次のエラーが発生しました: TypeError:update()は予期しないキーワード引数' q 'を持っています これは私のコードです { 'doc':{'デバイス': 'テスト'} } ' – AhmyOhlin

答えて

3

script、あなたはその文書を更新することができるはずですあなたの質問にマッチします。

q = { 
    "script": { 
     "inline": "ctx._source.Device='Test'", 
     "lang": "painless" 
    }, 
    "query": { 
     "match": { 
      "Device": "Boiler" 
     } 
    } 
} 

es.update_by_query(body=q, doc_type='AAA', index='testindex') 

上記は私のために働いた。 qはクエリに一致するドキュメントを検索し、スクリプトは各ドキュメントの_sourceを使用して値を更新します。

ご希望のクエリに調整を加えていただければ幸いです。

+0

私はあなたのコードを試して、それは正常に動作しています。お手伝いありがとう。 – AhmyOhlin

+0

upsertとしてこれを行う方法はありますか? – Iluvatar14

関連する問題