Elasticsearch チュートリアル: クイックスタートガイド
Elasticsearch チュートリアル: クイックスタートガイド:
Elasticsearch は、インデックス作成を含めたあらゆる目的に対応する REST API オペレーションを備えています。REST API に加えて、最も一般的な開発言語用に AWS SDK もあります。このガイドでは、REST API を使用して、言語にとらわれない方法で基礎となるテクノロジーについて学ぶことができます。
インデックス作成が Elasticsearch のコアです。数テラバイトのデータを超高速で検索することができます。しかし、存在していないデータを検索することはできません。そこでこの記事では、インデックスを作成し、データを Elasticsearch に入れ、Amazon Elasticsearch Service を使用して Elasticserach で検索する方法を説明します。
アカウントが準備できたら、Amazon Elasticsearch Service ドメイン (クラスターの設定あり) を作成します。1 つを取得するには (約 15 分かかります)、Amazon Elasticsearch Service ドメインの作成と設定の手順に従ってください。
Amazon Elasticsearch Service ドメインは、ほんのわずかな基本的な手順だけで立ち上がります。
私は先に自分のドメインへのアクセスを開放していますが、デモ目的のためだけなので、サンプルとしての役目を終えたら解除します。デモ目的でない場合、Elasticsearch および Kibana で作業するときにはもちろんアクセスポイントを保護する必要があります。最高レベルのセキュリティのためには、ドメインを Virtual Private Cloud (VPC) に入れるのがお勧めです。
Amazon Elasticsearch Service ドメインの設定後、Amazon Elasticsearch Service にデータを入れることで開始できます。では次を見てみましょう。
ドキュメントをインデックスに入れることからチュートリアルを始めましょう。
どのツールを使用する場合でも、次のように HTTP コールを作り、新規のドキュメントでインデックスを作成します。
上記の例では、Kibana で開発者コンソールを使用していることを前提としています。別のツールを使用している場合は、必要に応じて完全な URL と認証情報を入力して調整します。名前は任意ですが、そのエンドポイントは vegetables というインデックスを作成し、そのインデックスに ID 1 を付けたドキュメントを 1 つ入れます。
ご希望の場合、Amazon Elasticsearch Service では他の JSON リポジトリのような ID を生成することができます。
このコールで、
ID
その ID を使用して、以下のようにドキュメントを更新します。
このコマンドでは、“root” という新しい分類用の値でドキュメントを更新しています。存在していないドキュメントを更新しようとすると、Amazon Elasticsearch Service はドキュメントを作成します。
ここまでのコマンドをまとめてみましょう。
アクションごとに 2 行の JSON が必要です。まず、アクションの内容またはメタデータを指定します。次の行でデータを指定します。各部分とアクションは改行 (\n) で区切られます。挿入のアクション内容は以下のようになります。
次のデータ行は以下のようになります。
meta 部分と data 部分を合わせて bulk オペレーションの 1 つのアクションを示しています。以下のように、1 回のコールで多数のオペレーションを送信できます。
最後のアクションが delete であることに注目してください。delete アクション以降にはデータはありません。また URL でインデックスを指定していないため (指定すること自体は可能です)、bulk オペレーションはドメインのどのインデックスでもアクションを実行できます。
では、Amazon Elasticsearch Service へのデータの入れ方をご理解いただいたところで、検索に移りましょう。
探すのは根菜でしょうか。 葉物野菜すべての数を知りたいですか。 1 時間あたりで記録されたエラー数でしょうか。 これらはすべて、インデックス検索で解決できます。
ベーシック検索について見てみましょう。その後、より高度な検索に移ります。
この例では、レタスのドキュメントの JSON レスポンスを返します。
この例でも、レタスのドキュメントの JSON レスポンスを返します。
このタイプのクエリを使用すると他の作業もできます。ソートをやってみましょう。ただし、まずはインデックスの準備が必要です。自動フィールドマッピングの選択するタイプはデフォルトではソートできないため、インデックスは再作成する必要があります。以下のようにインデックスの削除と作成を行います。
それからインデックスを再作成します。
これで、以下のようにソートした検索ができるようになります。
ここでは、分類により昇順ソートのみを追加しました。
検索の方法をご理解いただいたところで、AWS のサービスにあるデータを Amazon Elasticsearch Service ドメインに入れる方法をいくつか見てみましょう。
このセクションでは、ストリーミングデータを Amazon Elasticsearch Service に入れるさまざまな方法について説明します。データが入ったら、すでに学んだ検索やクエリ API を使用して、役立つ情報をまとめることができます。
bulk API については説明済みですが、データを Amazon Elasticsearch Service ドメインに入れるには別の方法もあります。ストリームデータソースを接続することができるのです。以下にしくみを説明します。
Kinesis Data Firehose、Amazon CloudWatch、AWS IoT では、さらに統合されたソリューションを利用できます。Amazon Elasticsearch Service は、この 3 種のストリームの接続先になります。たとえば、ルールアクションを使用して、IoT ストリームデータを Amazon Elasticsearch Service ドメインに送ることができます。
さまざまな可能性の扉が目の前に開いています。次に何ができるか、じっくり考えてみてください。
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 ドメインは、ほんのわずかな基本的な手順だけで立ち上がります。
- ドメインの定義
- クラスターの設定
- アクセスの設定
- レビュー
私は先に自分のドメインへのアクセスを開放していますが、デモ目的のためだけなので、サンプルとしての役目を終えたら解除します。デモ目的でない場合、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"
}
_doc
の部分はあまり使用されないため、まもなく廃止される予定です。ここはドキュメントの種類を示しています。旧バージョンでは、同じインデックスに複数の種類のドキュメントを設定できました。food インデックスに _veggies
、_desserts
、 _tacos
などの種類を設定し、それぞれ異なる構造にすることが可能でした。残念ながらこれは検索パフォーマンスを低下させるため、Elasticsearch では種類が使われなくなりました。/veggies/_doc
、 /desserts/_doc
、/tacos/_doc
など、各種類にインデックスを設定する方が良好な結果になります。ご希望の場合、Amazon Elasticsearch Service では他の JSON リポジトリのような ID を生成することができます。
自動生成 ID
Amazon Elasticsearch Service では、簡単にドキュメントの ID を生成できます。POST
を PUT
の代わりに使用するだけです。POST /veggies/_doc
{
"name":"beet",
"color":"red",
"classification":"root"
}
veggies
という名のインデックスが作成され、このインデックスにドキュメントが追加されます。また、ドキュメントの ID も生成されます。URL の _doc
以降に何も指定していないことがおわかりかと思います。通常、この部分には ID が入ります。今回はこのドキュメントの ID が別途生成されるため、ここが空欄になっています。そこには代わりに更新情報が入ります。POST でドキュメントを更新する
識別子付きの HTTPPOST
を使用して、既存のドキュメントを更新します。ID
42
のドキュメントを作成するには、以下のように行います。POST /veggies/_doc/42
{
"name":"sugar-beet",
"color":"red",
"classification":"bark"
}
POST /veggies/_doc/42
{
"name":"sugar-beet",
"color":"red",
"classification":"root"
}
ここまでのコマンドをまとめてみましょう。
PUT
は指定の ID のドキュメントを作成します。POST
は指定の ID のドキュメントを更新します。- ID が指定されない場合、
POST
は自動生成 ID 付きドキュメントを作成します。
bulk のアクション
_bulk
API オペレーションを使用すると、1 回のコールで 1 つ以上のインデックスに多数のアクションを実行することができます。複数の作成、更新、削除アクションを 1 回のコールで行うため、オペレーションが高速化します。基本的な書式は次のとおりです。POST /_bulk
<action_meta>\n
<action_data>\n
<action_meta>\n
<action_data>\n
{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "7" } }
{ "name":"kale", "color":"green", "classification":"leafy-green" }
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" } }
では、Amazon Elasticsearch Service へのデータの入れ方をご理解いただいたところで、検索に移りましょう。
Amazon Elasticsearch Service で検索を行う方法
検索は Elasticsearch のメイン機能と言えます。 データが多数あることは素晴らしいですが、それを活かすことができなければ無意味です。 指定した値を検索することで、データを有効に活用することができます。探すのは根菜でしょうか。 葉物野菜すべての数を知りたいですか。 1 時間あたりで記録されたエラー数でしょうか。 これらはすべて、インデックス検索で解決できます。
ベーシック検索について見てみましょう。その後、より高度な検索に移ります。
ベーシック検索
ベーシック検索は、以下のような形になります。GET /veggies/_search?q=name:l*
高度な検索
高度な検索を行うには、リクエストボディでクエリオプションを JSON に指定します。以下に例を示します。GET /veggies/_search
{
"query": {
"term": {
"name": "lettuce"
}
}
}
このタイプのクエリを使用すると他の作業もできます。ソートをやってみましょう。ただし、まずはインデックスの準備が必要です。自動フィールドマッピングの選択するタイプはデフォルトではソートできないため、インデックスは再作成する必要があります。以下のようにインデックスの削除と作成を行います。
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 S3、Amazon Kinesis Data Streams、Amazon 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 のデータから直接可視化データを作成可能なツールを提供します。さまざまな可能性の扉が目の前に開いています。次に何ができるか、じっくり考えてみてください。
コメント
コメントを投稿