公式ドキュメントのこれだった。
Update By Query API

なんだけどうまくいかず、結局はクエリと設定の両方の問題やってん。

設定

探した限りでは実行時の設定APIは用意されていなくて、
設定ファイルで変更しないといけないっぽい。

# script.inline: on がscriptアップデートに必要
$ echo "script.inline: on" >> elasticsearch.yml

# 公式dockerのES
$ cat elasticsearch.yml

network.host: 0.0.0.0
script.inline: on

クエリ

POST /<index>/_update_by_query?conflicts=proceed
に対して以下のようなクエリを投げる

{
  "script": {
    "inline": "ctx._source.my_point= 100"
  },
  "query": {
    "term": {
      "my_point": 0
    }
  }
}

これは↓のようなSQLのイメージ

UPDATE my_hoge_index 
   SET my_point=100 
 WHERE my_point=0;

curlから。

$ curl -s http://localhost:9200/my_hoge_index/_update_by_query?conflicts=proceed -XPOST -d '
{
  "script": { "inline": "ctx._source.my_point= 100"},
  "query":  { "term": { "my_point": 0 } }
}
' | jq .

{
  "took": 1920,
  "timed_out": false,
  "total": 500,
  "updated": 500,
  "batches": 1,
  "version_conflicts": 0,
  "noops": 0,
  "retries": 0,
  "throttled_millis": 0,
  "requests_per_second": "unlimited",
  "throttled_until_millis": 0,
  "failures": []
}

Leave a Reply

Your email address will not be published. Required fields are marked *