53
65

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ElasticsearchAdvent Calendar 2015

Day 5

初心者のためのRest APIから覚えるElasticsearch

Last updated at Posted at 2015-12-05

この記事は Elasticsearch Advent Calendar 2015 の5日目の記事です。

記事更新遅くなってしまい、申し訳ないです。。

はじめに

みなさんはElasticserchのデータを確認したり、解析したりするために何を使っているのでしょうか?
Elasticsearch Headや、kibanaなど色々あるのですが、別々の環境にある複数のElasticsearchを扱うことがある時や開発段階の探り探りの状態ではやはり何よりもREST APIを直接叩けるとかなり捗ります。

僕自体現在Elasticsearch歴2ヶ月で上記の環境だったため、
今のところPOSTMANが最強のElasticsearchクライアントです。

2016/06/17 追記
※ 最強はSenseでした

という訳で僕がよく使うAPI一覧をまとめました。

参考 公式API一覧

バージョン情報

Elasticsearch 1.5.2

1. Elasticserchのヘルスチェック

まずElasticsearchを導入後まずやることは、Elasticsearchを立ち上げることだと思います。(当たり前ですが)
起動状況・バージョンの確認などを行えます。

$ curl -XGET 'localhost:9200/'

2.マッピング

データ構造(MYSQLでいうとDB,テーブル)の作成を行います。
開発段階でIndexをつくって、潰してを繰り返していたので、このAPIは何度も叩きました。

mappingsの中に作りたいType(テーブル)、Fields(カラム)を指定します。
簡単な一例のみ書いていますが、ただIndexを作るのみならsettingsは不要です。

$ curl -XPOST 'localhost:9200/[index]?pretty' -d ' 
{
    "settings": {
        "index": {
            "creation_date": "1445580000000",
            "uuid": "xxxxxxxxxxxxxxxxxxxxxx",
            "number_of_replicas": "1",
            "number_of_shards": "5",
            "version": {
                "created": "1050299"
            }
        }
    },
    "mappings": {
        "[type]": {
            "properties": {
                "id": {
                    "type": "long"
                },
                "last_name": {
                    "type": "string"
                },
                "first_name": {
                    "type": "string"
                },
                "created_at": {
                    "format": "dateOptionalTime",
                    "type": "date"
                }
                "updated_at": {
                    "format": "dateOptionalTime",
                    "type": "date"
                }
            }
        }
    }
}'

各shard内のIndexの状況などを返してくれます。
以下のAPIでマッピングの結果確認を行います。

$ curl -XGET 'localhost:9200/[index]'

Indexの詳細なステータスチェックを行う場合はURL末尾に_status をつけます。

$ curl -XGET 'localhost:9200/[index]/_status'

間違えた場合、変更のあった場合などは一旦構成を作りなおすのに以下のAPIで削除します。

$ curl -XDELETE 'localhost:9200/[index]

3.ドキュメントを操作する

ドキュメント作成

マッピングを行ったら、次に指定したテーブルへのデータをインサートします。
idを指定しない場合は適当な値が設定されます。

$ curl -XPOST 'localhost:9200/[index]/[type]/[id]?pretty' -d '
{
    "last_name":"のび",
    "first_name":"のびた",
    "height":150,
    "weight":40,
    "created_at":1406038,
}'

bulkインサートの場合は最後に_bulkをつけます。

$ curl -XPOST 'localhost:9200/[index]/[type]/_bulk?pretty' -d '
{ "index" : {}       }
{ "last_name"  : "のはら", "first_name": "ひろし", "age":35, "height":180.0 }
{ "index" : {}       }
{ "last_name"  : "のはら", "first_name": "みさえ", "age":29, "height":160.2 }
{ "index" : {}       }
{ "last_name"  : "のはら", "first_name": "しんのすけ", "age":5, "height": 105.9 }
'

ドキュメントのアップデートはTypeとレコードのIDを指定します。

$ curl -XPUT 'localhost:9200/[index]/[type]/[id]?pretty' -d '
{
    "first_name":"ひまわり",
    "updated_at":14000000
}'

ドキュメントの削除

$ curl -XDELETE 'localhost:9200/[index]/[type]/[id]' 

やっとデータを作成出来ました。

4.検索

作成したデータを検索します。
default_operatorに指定でAnd検索・or検索を切り替えられます。
fileldsは複数指定可で、_all で全filedを対象にできます。

$ curl -XGET 'localhost:9200/[index]/[type]/_search?pretty' -d '
{
  "query" : {
    "simple_query_string" : {
      "query": "みなもと ほねかわ",
      "fields": ["last_name"],
      "default_operator": "or"
    }
  }
}'

ドキュメントを整列させて検索する場合はjsonにsortを追加し、ソートしたい配列を追加します。

$ curl -XGET 'localhost:9200/[index]/[type]/_search?pretty' -d '
{
  "query" : {
    "simple_query_string" : {
      "query": "まるこ さきこ",
      "fields": ["first_name"],
      "default_operator": "or"
    }
  },
  "sort" : [{ "created_at" : {"order" : "desc", "missing" : "_last"}}]
}'

5.更に検索する

普通の検索に特殊な条件を追加する場合はfunction_scoreを使用します。
検索条件毎に検索スコアの重み付けをしたり,フィールドから算出した値でスコアをつけたり等々ができ僕がElasticsearchを使い初めて一番テンションの上がった部分でした!(まだ全く使いこなせていませんが、、)
function score query

簡単な条件文などもかけるので、例えば身長、体重からbmi値を計算して肥満判定の場合は検索スコアから1引く場合など以下の様になります。

$ curl -XGET 'localhost:9200/[index]/[type]/_search?pretty' -d '
{
  "query" : {
    "function_score" : {
      "query" : {
        "simple_query_string" : {
          "query": "どらえもん Qたろう ころすけ",
          "fields": ["first_name"],
          "default_operator": "or"
        }
      },
      "boost_mode": "replace",
      "script_score" : {
          "script" : "weight = doc['weight'].value; height = doc['height'].value; bmi = weight / ((height)*(height)+1);if (bmi >= 25) return _score - 10 else return _score"
      }
    }
  }
}'
  • fieldの値は doc['field名'].value で取得できる
  • 改行を入れるとエラーになる
  • script内の式によって値が0未満になった場合エラーになる
  • 上記の例の場合returnは無くても最後の値をうまいこととってくれるので不要。(僕は分かりやすくするためにいれています。)

function_scoreが動かない場合

初期設定のままfunction_scoreクエリを使ってみたところエラーが帰ってきてしまい、jsonが間違えているのかと思って長いこと試行錯誤していたのですが、function_scoreを設定から有効にする必要があるようでした。

elasticsearch.ymlにスクリプトを有効化する設定を追記し、Elasticsearchを再起動します。

elasticsearch.yml
script.groovy.sandbox.enabled: true

RestAPIの共通オプション

ここまでAPIだけまとめてきましたが、ここでも使っている?pretty等レスポンスの値を見やすくするためや、レスポンス形式を指定できる共通オプションがあるので、こちらも使用すると確認しやすくなります。
https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html

終わりに

Elasticsearchまだまだ手探り状態なので、色々拙い部分あるかと思います。間違い等何かあればご教授いただけると嬉しいです。
早く使いこなして素敵なElasticsearchライフを送りたいです。

53
65
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
53
65

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?