Amazon Web Services ブログ

Elasticsearch チュートリアル: クイックスタートガイド



Elasticsearch は、インデックス作成を含めたあらゆる目的に対応する REST API オペレーションを備えています。REST API に加えて、最も一般的な開発言語用に AWS SDK もあります。このガイドでは、REST API を使用して、言語にとらわれない方法で基礎となるテクノロジーについて学ぶことができます。

インデックス作成が Elasticsearch のコアです。数テラバイトのデータを超高速で検索することができます。しかし、存在していないデータを検索することはできません。そこでこの記事では、インデックスを作成し、データを Elasticsearch に入れ、Amazon Elasticsearch Service を使用して Elasticserach で検索する方法を説明します。

Amazon Elasticsearch Service ドメインの作成

まだ AWS アカウントを持っていなければ、AWS アカウントにサインアップしましょう。新規アカウントでサインアップした際、無料利用枠を使用すると Amazon Elasticsearch Service を 12 ヶ月間無料で利用できます。また Amazon Elasticsearch Service を始めるのはとても簡単です

アカウントが準備できたら、Amazon Elasticsearch Service ドメイン (クラスターの設定あり) を作成します。1 つを取得するには (約 15 分かかります)、Amazon Elasticsearch Service ドメインの作成と設定の手順に従ってください。

Amazon Elasticsearch Service ドメインは、ほんのわずかな基本的な手順だけで立ち上がります。

  1. ドメインの定義
  2. クラスターの設定
  3. アクセスの設定
  4. レビュー

この 4 つのステップが完了した後に立ち上がります。それでは、このガイドの続きを見てみましょう。まだドメインを設定していない場合は、ドメインを設定することをお勧めします。それから Kibana を起動します。Kibana は、ドメイン概要のリンクから利用可能です。アクセスするためには、適切な権限を設定する必要があります。アクセス許可に Amazon Cognito を使用するには、Kibana の Amazon Cognito 認証を参照してください。

私は先に自分のドメインへのアクセスを開放していますが、デモ目的のためだけなので、サンプルとしての役目を終えたら解除します。デモ目的でない場合、Elasticsearch および Kibana で作業するときにはもちろんアクセスポイントを保護する必要があります。最高レベルのセキュリティのためには、ドメインを Virtual Private Cloud (VPC) に入れるのがお勧めです。

Amazon Elasticsearch Service ドメインの設定後、Amazon Elasticsearch Service にデータを入れることで開始できます。では次を見てみましょう。

Amazon Elasticsearch Service にデータを入れる方法

Elasticsearch では、データは JSON ドキュメントとしてインデックスに入れられます。明示的にインデックスを作成できますが、実際にはインデックスは必要ありません。Amazon Elasticsearch Service は、追加した最初のドキュメントの周囲にインデックスを作成します。これにより、ドキュメントが存在するかどうかを知らなくてもインデックスに入れることができます。

ドキュメントをインデックスに入れることからチュートリアルを始めましょう。

インデックスにドキュメントを入れる

新しいリソースを作成するための HTTP 動詞は PUT であり、新規のドキュメントおよびインデックスを Amazon Elasticsearch Service で作成するのに使用します。Kibana では、Postman、curl、開発者コンソールなどの HTTP ツールを使用できます。

どのツールを使用する場合でも、次のように HTTP コールを作り、新規のドキュメントでインデックスを作成します。

PUT /vegetables/_doc/1
{
  "name":"carrot",
  "color":"orange"
}

上記の例では、Kibana で開発者コンソールを使用していることを前提としています。別のツールを使用している場合は、必要に応じて完全な URL と認証情報を入力して調整します。名前は任意ですが、そのエンドポイントは vegetables というインデックスを作成し、そのインデックスに ID 1 を付けたドキュメントを 1 つ入れます。

_doc の部分はあまり使用されないため、まもなく廃止される予定です。ここはドキュメントの種類を示しています。旧バージョンでは、同じインデックスに複数の種類のドキュメントを設定できました。food インデックスに _veggies_desserts _tacos などの種類を設定し、それぞれ異なる構造にすることが可能でした。残念ながらこれは検索パフォーマンスを低下させるため、Elasticsearch では種類が使われなくなりました。/veggies/_doc /desserts/_doc/tacos/_doc など、各種類にインデックスを設定する方が良好な結果になります。

ご希望の場合、Amazon Elasticsearch Service では他の JSON リポジトリのような ID を生成することができます。

自動生成 ID

Amazon Elasticsearch Service では、簡単にドキュメントの ID を生成できます。POSTPUT の代わりに使用するだけです。

POST /veggies/_doc
{
  "name":"beet",
  "color":"red",
  "classification":"root"
}

このコールで、veggies という名のインデックスが作成され、このインデックスにドキュメントが追加されます。また、ドキュメントの ID も生成されます。URL の _doc 以降に何も指定していないことがおわかりかと思います。通常、この部分には ID が入ります。今回はこのドキュメントの ID が別途生成されるため、ここが空欄になっています。そこには代わりに更新情報が入ります。

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

識別子付きの HTTP POST を使用して、既存のドキュメントを更新します。

ID 42 のドキュメントを作成するには以下のように行います。

POST /veggies/_doc/42
{
  "name":"sugar-beet",
  "color":"red",
  "classification":"bark"
}

その ID を使用して、以下のようにドキュメントを更新します。

POST /veggies/_doc/42
{
  "name":"sugar-beet",
  "color":"red",
  "classification":"root"
}

このコマンドでは、“root” という新しい分類用の値でドキュメントを更新しています。存在していないドキュメントを更新しようとすると、Amazon Elasticsearch Service はドキュメントを作成します。

ここまでのコマンドをまとめてみましょう。

  • PUT は指定の ID のドキュメントを作成します。
  • POST は指定の ID のドキュメントを更新します。
  • ID が指定されない場合、POST は自動生成 ID 付きドキュメントを作成します。

基本をご理解いただいたところで、bulk API を使用して大量のデータを一度に取得する方法を見てみましょう。

bulk のアクション

_bulk API オペレーションを使用すると、1 回のコールで 1 つ以上のインデックスに多数のアクションを実行することができます。複数の作成、更新、削除アクションを 1 回のコールで行うため、オペレーションが高速化します。基本的な書式は次のとおりです。

POST /_bulk
<action_meta>\n
<action_data>\n
<action_meta>\n
<action_data>\n

アクションごとに 2 行の JSON が必要です。まず、アクションの内容またはメタデータを指定します。次の行でデータを指定します。各部分とアクションは改行 (\n) で区切られます。挿入のアクション内容は以下のようになります。

{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "7" } }

次のデータ行は以下のようになります。

{ "name":"kale", "color":"green", "classification":"leafy-green" }

meta 部分と data 部分を合わせて bulk オペレーションの 1 つのアクションを示しています。以下のように、1 回のコールで多数のオペレーションを送信できます。

POST /_bulk
{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "7" } }
{ "name":"kale", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "8" } }
{ "name":"spinach", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "9" } }
{ "name":"arugula", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "10" } }
{ "name":"endive", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "11" } }
{ "name":"lettuce", "color":"green", "classification":"leafy-green" }
{ "delete" : { "_index" : "vegetables", "_type" : "_doc", "_id" : "1" } }

最後のアクションが delete であることに注目してください。delete アクション以降にはデータはありません。また URL でインデックスを指定していないため (指定すること自体は可能です)、bulk オペレーションはドメインのどのインデックスでもアクションを実行できます。

では、Amazon Elasticsearch Service へのデータの入れ方をご理解いただいたところで、検索に移りましょう。

Amazon Elasticsearch Service で検索を行う方法

検索は Elasticsearch のメイン機能と言えます。 データが多数あることは素晴らしいですが、それを活かすことができなければ無意味です。 指定した値を検索することで、データを有効に活用することができます。

探すのは根菜でしょうか。 葉物野菜すべての数を知りたいですか。 1 時間あたりで記録されたエラー数でしょうか。 これらはすべて、インデックス検索で解決できます。

ベーシック検索について見てみましょう。その後、より高度な検索に移ります。

ベーシック検索

ベーシック検索は、以下のような形になります。

GET /veggies/_search?q=name:l*

この例では、レタスのドキュメントの JSON レスポンスを返します。

高度な検索

高度な検索を行うには、リクエストボディでクエリオプションを JSON に指定します。以下に例を示します。

GET /veggies/_search
{
  "query": {
    "term": {
      "name": "lettuce"
    }
  }
}

この例でも、レタスのドキュメントの JSON レスポンスを返します。

このタイプのクエリを使用すると他の作業もできます。ソートをやってみましょう。ただし、まずはインデックスの準備が必要です。自動フィールドマッピングの選択するタイプはデフォルトではソートできないため、インデックスは再作成する必要があります。以下のようにインデックスの削除と作成を行います。

DELETE /veggies

PUT /veggies
{ 
  "mappings": { 
    "_doc": { 
      "properties": { 
        "name": { 
          "type": "keyword" 
        },
        "color": { 
          "type": "keyword"
        },
        "classification": {
          "type": "keyword"
        }
      }
    }
  }
}

それからインデックスを再作成します。

POST /_bulk
{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "7"  } }
{ "name":"kale", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "8" } }
{ "name":"spinach", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "9" } }
{ "name":"arugula", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "10" } }
{ "name":"endive", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "11" } }
{ "name":"lettuce", "color":"green", "classification":"leafy-green" }
{ "delete" : { "_index" : "vegetables", "_type" : "_doc", "_id" : "1" } }

これで、以下のようにソートした検索ができるようになります。

GET /veggies/_search
{
  "query" : {
    "term": { "color": "green" }
  },
  "sort" : [
      "classification"
  ]
}

ここでは、分類により昇順ソートのみを追加しました。

検索の方法をご理解いただいたところで、AWS のサービスにあるデータを Amazon Elasticsearch Service ドメインに入れる方法をいくつか見てみましょう。

データを Amazon Elasticsearch Service に一括で入れ、ストリーム処理する方法

データの検索方法がわかったら、手元の膨大なデータを処理することを考えると思います。手元のデータを検索または集計して利用するさまざまな方法を思いつくことでしょう。システムのログや発生したすべてのイベントなども利用できます。これまでのイベントログがありますか。 イベントストリームはどうでしょうか。 IoT デバイスから送られたデータはどうですか。

このセクションでは、ストリーミングデータを Amazon Elasticsearch Service に入れるさまざまな方法について説明します。データが入ったら、すでに学んだ検索やクエリ API を使用して、役立つ情報をまとめることができます。

bulk API については説明済みですが、データを Amazon Elasticsearch Service ドメインに入れるには別の方法もあります。ストリームデータソースを接続することができるのです。以下にしくみを説明します。

ストリームデータ接続

AWS の利用中は、既存のデータパイプラインを使用してデータを Amazon Elasticsearch Service に送ることができます。Amazon S3Amazon Kinesis Data StreamsAmazon DynamoDB に接続するには基本のパターンがあります。ソースに接続し、Amazon Elasticsearch Service にデータを入れるには、AWS Lambda 関数を使用します。

Kinesis Data Firehose、Amazon CloudWatch、AWS IoT では、さらに統合されたソリューションを利用できます。Amazon Elasticsearch Service は、この 3 種のストリームの接続先になります。たとえば、ルールアクションを使用して、IoT ストリームデータを Amazon Elasticsearch Service ドメインに送ることができます。

結論

Elasticsearch クラスターを自分で実行するか、Amazon Elasticsearch Service ドメインを利用していれば、REST API を使用したデータのアップロードや検索実行の方法を簡単に知ることができます。最終的な目標はデータストリームを Elasticsearch に入れ、興味深い分析を実行することです。また、Kibana は Elasticsearch のデータから直接可視化データを作成可能なツールを提供します。

さまざまな可能性の扉が目の前に開いています。次に何ができるか、じっくり考えてみてください。


今回のブログ投稿者について

Kartavya Jain は、アマゾン ウェブ サービスのシニアプロダクトマーケティングマネージャーです。彼はハンズオンマーケティングを専門としており、豊かなコンテンツによる結果重視のマーケティングを通じて、顧客と対象分野に価値を届けることを目指しています