🌟

Amazon OpenSearch Serviceに入門してみた。チュートリアル編① ダッシュボードを使う

2025/04/12に公開

全3編です

概要

前回に引き続きOpenSearch Serviceのチュートリアルをやってみる。
今回は以下。

以下を参考に環境を作る。

ダッシュボードにアクセスする
http://localhost:5601

ユーザ、パスワードは前回指定した以下

"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というインデックスを作り、ドキュメントをインデックスに追加する。
_id3WgyS4IB5DLqbRIvLxtFとして自動裁判されている。

{
  "_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 /_bulkAPIオペレーションを使用すると、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