🙆‍♀️

Kibana Dev Toolsからドキュメントにデータフィールドを追加する

2021/10/11に公開

各ドキュメントがもつデータフィールド(titleとかbodyとか。elasticにおける正式名称はpropertyと言うらしい)を追加したい場合。

mappingにフィールドを追加する

例えばalphaというインデックスにupvoteとdownvoteのinteger型のフィールドを追加したい場合。こちらはPUTメソッドで追加される。

GET /alpha/_mapping

PUT /alpha/_mapping
{
  "properties": {
    "upvote": {
      "type": "integer"
    },
    "downvote": {
      "type": "integer"
    }
  }
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html

各ドキュメントにフィールドとデータを追加する

ドキュメントにフィールドとデータを追加する場合はPOSTメソッドを使う。mappingのようにPUTメソッドを使うとドキュメントが上書きされてしまうので注意!またmappingでフィールドを追加していないフィールドもこれで追加できてしまう‥。mappingの有無による違いを知りたい‥。

GET /alpha/_doc/e6L1aHwBjwrw3arokzTv 

// upvote: 3 を追加
POST /alpha/_update/e6L1aHwBjwrw3arokzTv
{
  "script" : "ctx._source.upvote = 3"
}

//// ちなみにフィールドデータがstring型の場合はシングルクォーテーションで値を囲む必要がある
POST /alpha/_update/e6L1aHwBjwrw3arokzTv
{
  "script" : "ctx._source.title = 'かも知れない運転でいけ'"
}

// フィールドupvoteを削除
POST /alpha/_update/e6L1aHwBjwrw3arokzTv
{
  "script" : "ctx._source.remove('upvote')"
}

// integer型(Numbers型)であるフィールドupvoteを+1する
POST /alpha/_update/e6L1aHwBjwrw3arokzTv
{
  "script" : {
    "source": "ctx._source.upvote += params.count",
    "lang": "painless",
    "params" : {
      "count" : 1
    }
  }
}

このctx._sourceの部分はおまじないっぽく、現状こう書くしかないよう。

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html#docs-update-api-prereqs

Discussion