Amazon OpenSearch Serviceに入門してみた。チュートリアル編① ダッシュボードを使う
全3編です
概要
前回に引き続きOpenSearch Serviceのチュートリアルをやってみる。
今回は以下。
以下を参考に環境を作る。
ダッシュボードにアクセスする
ユーザ、パスワードは前回指定した以下
"MasterUserName": "admin",
"MasterUserPassword": "really-secure-passwordAa!1"
ドキュメントをインデックスに追加する
左側のナビゲーションパネルから[Dev Tools]を開きます。
コンソールに以下を設定。
新しいドキュメントとインデックスが作成される。
PUT fruit/_doc/1
{
"name":"strawberry",
"color":"red"
}
PUTリクエストはfruit
という名前のインデックスを作成し、IDが1である単一のドキュメントをインデックスに追加する。次のレスポンスが生成される。
{
"_index" : "fruit",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
試した結果
自動的に生成されるIDの作成
OpenSearchServiceではドキュメントのIDの自動採番が可能。
この時前述のPUTではなくPOSTリクエストを使う。以下のようにIDを指定しないリクエストを発行する。
POST veggies/_doc
{
"name":"beet",
"color":"red",
"classification":"root"
}
veggiesというインデックスを作り、ドキュメントをインデックスに追加する。
_id
が3WgyS4IB5DLqbRIvLxtF
として自動裁判されている。
{
"_index" : "veggies",
"_type" : "_doc",
"_id" : "3WgyS4IB5DLqbRIvLxtF",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
試した結果
POSTコマンドを使ってドキュメントを更新する
ID番号を指定してPOSTリクエストを実行する。
最初にIDが42
のドキュメントを作成。
POST fruits/_doc/42
{
"name":"banana",
"color":"yellow"
}
試した結果。
その後ID42
を更新
POST fruits/_doc/42
{
"name":"banana",
"color":"yellow",
"classification":"berries"
}
以下のレスポンスが返却されます。
{
"_index" : "fruits",
"_type" : "_doc",
"_id" : "42",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
試した結果。
一括アクションの実行
POST /_bulk
APIオペレーションを使用すると、1回のリクエストで1つ以上のインデックスに対して複数の悪書を実行可能。
POST /_bulk
<action_meta>\n
<action_data>\n
<action_meta>\n
<action_data>\n
各アクションには2行のJSONが必要。
まず挿入アクション及びメタデータ。
{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "7" } }
次にデータ行。
{ "name":"kale", "color":"green", "classification":"leafy-green" }
メタデータとデータをまとめると以下のように一括オペレーションが定義できます。
POST /_bulk
{ "create" : { "_index" : "veggies", "_id" : "35" } }
{ "name":"kale", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "36" } }
{ "name":"spinach", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "37" } }
{ "name":"arugula", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "38" } }
{ "name":"endive", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "39" } }
{ "name":"lettuce", "color":"green", "classification":"leafy-green" }
{ "delete" : { "_index" : "vegetables", "_id" : "1" } }
deleteはデータなし。
ドキュメントの検索
これまででクラスターにデータを登録したので、データを検索できます。
以下など実行可能です。
- 全ての根菜類を検索
- 全ての葉菜類の数を取得
- 1時間あたりにログ記録されたエラーの数
基本的な検索
基本的な検索は以下
GET veggies/_search?q=name:l*
lで始まるドキュメント(今回はレタスドキュメント)を含むJSONレスポンスが生成される。
高度な検索
リクエスト本文でクエリオプションをJSONとして指定することで、より高度な検索が可能。
GET veggies/_search
{
"query": {
"term": {
"name": "lettuce"
}
}
}
ソート
ソートを使用するには、インデックスを再作成する必要があります。
自動フィールドマッピングが、デフォルトではソートできないタイプを選択するためです。次のリクエストを送信して、インデックスを削除して再作成します
DELETE /veggies
PUT /veggies
{
"mappings":{
"properties":{
"name":{
"type":"keyword"
},
"color":{
"type":"keyword"
},
"classification":{
"type":"keyword"
}
}
}
}
その後インデックスにデータを追加します。
POST /_bulk
{ "create" : { "_index" : "veggies", "_id" : "7" } }
{ "name":"kale", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "8" } }
{ "name":"spinach", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "9" } }
{ "name":"arugula", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "10" } }
{ "name":"endive", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "11" } }
{ "name":"lettuce", "color":"green", "classification":"leafy-green" }
これでソート検索ができるようになりました
GET veggies/_search
{
"query" : {
"term": { "color": "green" }
},
"sort" : [
"classification"
]
}
なお、インデックス作り直し前は以下のようなエラーが出ます。
テキストフィールドは、集計や並べ替えなど、ドキュメントごとのフィールドデータを必要とする操作には最適化されていないため、これらの操作はデフォルトで無効になっています。代わりにキーワードフィールドを使用してください。または、[classification] で fielddata=true を設定すると、転置インデックスを反転せずにフィールドデータを読み込むことができます。ただし、この設定によりメモリ消費量が大幅に増加する可能性があることに注意してください。
とのことです。
Discussion