検索ブログ

主に検索のことについて書いています。

Elasticsearchでドキュメントを更新する

Elasticsearchでドキュメントを更新する方法を記す。

公式ドキュメント Updating Documents を参考にした。 www.elastic.co

検証環境: Elasticsearch 6.0.0-rc1

ドキュメントをインデックスしたり置き換えたりするほかに、もちろんドキュメントを更新することもできる。
Elasticsearchは更新を行うたびに古いドキュメントを削除し、その文書に更新が適用された新しいドキュメントを1回でインデックスする。

bash-3.2$  curl -XGET 'localhost:9200/customer/doc/1?pretty&pretty'
{
  "_index" : "customer",
  "_type" : "doc",
  "_id" : "1",
  "_version" : 4,
  "found" : true,
  "_source" : {
    "name" : "Jane Doe"
  }
}

この上記のJane Doeのドキュメントに"age": 20という情報を追加してみる。
以下のようにコマンドを入力するとたしかに"age": 20が追加できていることがわかる。

bash-3.2$ curl -XPOST 'localhost:9200/customer/doc/1/_update?pretty&pretty' -H 'Content-Type: application/json' -d'
> {
>   "doc": { "name": "Jane Doe", "age": 20 }
> }
> '
{
  "_index" : "customer",
  "_type" : "doc",
  "_id" : "1",
  "_version" : 5,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 4,
  "_primary_term" : 1
}
bash-3.2$  curl -XGET 'localhost:9200/customer/doc/1?pretty&pretty'
{
  "_index" : "customer",
  "_type" : "doc",
  "_id" : "1",
  "_version" : 5,
  "found" : true,
  "_source" : {
    "name" : "Jane Doe",
    "age" : 20
  }
}

簡単なスクリプトでドキュメントを更新することもできる。
以下のスクリプトは年齢を5つずつ加算するものだ。

bash-3.2$ curl -XPOST 'localhost:9200/customer/doc/1/_update?pretty&pretty' -H 'Content-Type: application/json' -d'
> {
>   "script" : "ctx._source.age += 5"
> }
> '
{
  "_index" : "customer",
  "_type" : "doc",
  "_id" : "1",
  "_version" : 6,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 5,
  "_primary_term" : 1
}
bash-3.2$  curl -XGET 'localhost:9200/customer/doc/1?pretty&pretty'
{
  "_index" : "customer",
  "_type" : "doc",
  "_id" : "1",
  "_version" : 6,
  "found" : true,
  "_source" : {
    "name" : "Jane Doe",
    "age" : 25
  }
}

確かにage:20からage:25になっている。ctx._sourceは更新対象のドキュメントを意味している。
ドキュメントの更新は1度に1つのドキュメントに対してのみ実行できる。
しかし将来、Elasticsearchはクエリ条件(SQL UPDATE-WHEREステートメントのような)が与えられたとき複数のドキュメントを更新する機能を提供するかもしれない。