ウェブエンジニア珍道中

日々の技術的に関する経験を書いていきます。脱線もしますが助けになれば幸いです。

Elasticsearchの基本的な操作について

Elasticsearchの基本的な操作などをまとめます。半分メモのようなものです。

間違った解釈があればご指摘いただければ幸いです。

操作方法

CRUD(Create・Read・Update・Delete)はREST APIで行います。REST APIはRailsでよく作るアレです(適当)。

検証はcurlコマンドで行うことができます。

  • GET
$ curl -XGET 'http://localhost:9200'
  • POST
$ curl -XPOST 'http://localhost:9200/any_index/any_type' \ 
-H "Content-Type: application/json" -d '"any_key": "any_value"'

僕はkibanaのDev Toolsでやりました。見やすさと触りやすさがこちらの方が良かったためです。(※ここからはGET any/uriの形で記述します。)

URIの構造とか概念とか

アクセスするURIはindex/type/documentという構造です。

  • document
    • 保存するデータ一行
    • mysqlなどのRDBでいうレコードにあたる
  • index
    • documentが保存される場所
  • type
    • 保存されるdocumentがどのような構成かを示す
    • 構成の情報のことをマッピングと呼ぶ

GET /my_index/book/hogefugaとアクセスすると「my_indexというindexに保存してあるbookという情報でマッピングされたdocumentのIDがhogefugaのものを取ってきて」ということになります。

基本的な操作(CRUD)

試しにlibrary/bookにdocumentを入れていじってみます。

作成(POST)

POST library/book
{
  "name": "はらぺこあおむし",
  "author": "エリック・カール",
  "price": 1000
}

# response
{
  "_index": "library",
  "_type": "book",
  "_id": "AWTlLZ5qN5WfoXbACHS2",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": true
}

typeはElasticsearchが空気を読んで定義してくれています。今回は割愛しますが手動で定義もできます。

更新(PUT)

登録が完了しIDがAWTlLZ5qN5WfoXbACHS2で登録されているので、更新してみます。

PUT library/book/AWTlLZ5qN5WfoXbACHS2
{
  "name": "はらぺこあおむし",
  "author": "エリック・カール",
  "price": 1200
}

# Responce
{
  "_index": "library",
  "_type": "book",
  "_id": "AWTlLZ5qN5WfoXbACHS2",
  "_version": 2,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": false
}

部分的な更新

PUTを使った更新方法は指定したドキュメント全てを更新します。部分的に更新したい場合はPOSTを使って以下のように行います。docの中に更新したい情報を入れるので要注意。

POST library/book/AWTlLZ5qN5WfoXbACHS2/_update
{
  "doc": {
    "price": 1500
  }
}

# Responce
{
  "_index": "library",
  "_type": "book",
  "_id": "AWTlLZ5qN5WfoXbACHS2",
  "_version": 3,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}

取得(GET)

2回更新し、最終的にpriceが1500になったかを確認します。

GET library/book/AWTlLZ5qN5WfoXbACHS2

# Responce
{
  "_index": "library",
  "_type": "book",
  "_id": "AWTlLZ5qN5WfoXbACHS2",
  "_version": 3,
  "found": true,
  "_source": {
    "name": "はらぺこあおむし",
    "author": "エリック・カール",
    "price": 1500
  }
}

確認できました。

削除(DELETE)

最後はふっ飛ばしてみます。

DELETE library/book/AWTlLZ5qN5WfoXbACHS2

# Responce
{
  "found": true,
  "_index": "library",
  "_type": "book",
  "_id": "AWTlLZ5qN5WfoXbACHS2",
  "_version": 4,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}

消えていきました。

以上が基本的な操作です。一番肝心な検索はまた後ほどまとめたいと思います。では。