Amazon Elasticsearch Serviceで検索を試したい

Elasticserch Serviceでなにか検索してみたかったので手っ取り早い環境の作り方
2021.02.26

Elasticsearch Serviceで必要な検索パターンを満たせるかクエリの検証する機会がありました。 手っ取り早く検索できる環境を構築を目指します。また検証することがあるかもしれないのでサンプルデータ投入を含めた手順を残します。

  • グローバルIPでの接続制限したElasticsearch Serviceの構築
  • Elasticsearch Serviceへサンプルデータの投入
  • KibanaのDev Toolsを利用してサンプルデータの検索方法

Elasticserch Serviceとは

Elasticserch Serviceのドメイン作成

Amazon Elasticsearch Serviceのドメインとは、Elasticsearchクラスターを意味しています。 クラスターはElasticsearch Serviceのインスタンスタイプ、インスタンス数(ノード数)、ストレージ容量などの設定を管理する単位です。

ドメイン作成作業自体は検証用に簡単な設定でコンソールからポチポチするだけなら3分もあれば終わります。Elasticserch Serviceが起動し利用できるまでは20分ほど待つことになります。

検証用ドメイン作成

Elasticserch Serviceの開きます。

任意のドメイン名を設定し、検証用にt3シリーズのインスタンスとノード数を入力します。後々検証しているとサンプルデータ投入するとヘルスステータスが黄色になり、やたらと時間がかったのでキャプチャでは最初からノード数は2台指定しています。ちなみにそのときはノード数を後から追加して解決しました。

Amazon Elasticsearch Service の赤もしくは黄色の状態を解決する

クエリの検証用途ならパブリックアクセスで事足りるのでお手軽設定です。

パブリックアクセスなのでアクセス元のグローバルIPで制限しておきましょう。オフィスや、ご自宅のグローバルIPを入力してください。

20分ほど待ちます。

アクティブになるとElasticserch Serviceが利用可能です。

Elasticsearchで検索するまでの準備

なにかを検索したいので検索用のサンプルデータをElasticserch Serviceに投入したいです。

サンプルデータの登録

サンプルデータの読み込み | Kibanaユーザーガイド [5.4] | Elastic

Kibanaのユーザガイドからaccount.zipをダウンロードしてサンプルデータを利用します。 unzipで展開するとaccounts.jsonのサンプルファイルが手に入ります。このJSONファイルをElasticserch Serviceに投入します。

サンプルデータ登録

curlコマンドで展開したaccounts.jsonファイルをPOSTします。

Index Data - Open Distro for Elasticsearch Documentation

$ curl -H 'Content-Type: application/x-ndjson' -XPOST '[your-endpoint]/bank/account/_bulk?pretty' --data-binary @accounts.json

[your-endpoint]はElasticserch Serviceのコンソール画面から確認できるエンドポイントの部分です。

index名一覧表示

index名がbankの項目が登録されていることを確認できました。

$ curl -XGET '[your-endpoint]/_cat/indices?v'
health status index     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   bank      mbBKNCj-QOu5xkdybTT2Ew   5   1       1000            0    892.9kb        446.4kb
green  open   .kibana_1 2mNkSNgAQRmD3IQg-b8_vg   1   1         14            4     93.1kb         46.7kb

Elasticserch Serviceのコンソール画面からもindex名を確認できます。

KibanaのDev Toolsから検索

curlコマンドだと入力が手間で検証するのがしんどくなりました。WEBブラウザから使えるKibanaのDev Toolsを使ってみます。

Elasticserch Serviceのコンソール画面からKibanaのURLをクリックします。

表示されたKibanaコンソールからDev Toolsをクリックします。

使い方はDev Toolsの左側に下記のコマンド貼り付けます。そして、真ん中の小さい実行ボタンを押します。すると右側に結果が表示されます。

index名一覧表示

さきほどcurlコマンドでindex名を確認しましたが今度はDev Toolsでも試してみます。

GET _cat/indices?v&s=index

だいぶ使い勝手が良いです。

出力結果

health status index     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .kibana_1 2mNkSNgAQRmD3IQg-b8_vg   1   1         12            4     84.2kb         42.3kb
green  open   bank      mbBKNCj-QOu5xkdybTT2Ew   5   1       1000            0    892.9kb        446.4kb

ちなみに?v&s=indexをつけないで実行すると

GET /_cat/indices

ヘッダー行が表示されず初見では何の値が表示されているのかさっぱり分からなかったです。

出力結果

green open bank      mbBKNCj-QOu5xkdybTT2Ew 5 1 1000 0 892.9kb 446.4kb
green open .kibana_1 2mNkSNgAQRmD3IQg-b8_vg 1 1   23 5  58.7kb  13.2kb

Dev Toolsを使うとcurlコマンドにオプションがごちゃごちゃしなくて見やすく検証しやすいことがわかりました。

Elasticserch Serviceで検索

本題のクエリを試せるようになりました。

indexのmapping確認

クエリの検証する前にサンプルデータにはどのようなフィールドがあるのか確認します。

GET [index]/_mappingコマンドを使います。[index]の部分は今回のサンプルデータはbankという名前のindex名です。

GET bank/_mapping

出力結果

{
  "bank" : {
    "mappings" : {
      "properties" : {
        "account_number" : {
          "type" : "long"
        },
        "address" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "age" : {
          "type" : "long"
        },
        "balance" : {
          "type" : "long"
        },
        "city" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "email" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "employer" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "firstname" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "gender" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "lastname" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "state" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

Math_all query

手始めに全件検索してみます。

GET bank/_search
{
  "query": {
    "match_all": {}
  }
}

出力結果はこんな感じです。画像だと文字読めないので以降は出力結果はテキストで紹介していきます。

size指定で検索件数を調整できます。

GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "size": 1
}

hits数は1000件ありますがsizeの指定が1なので検索件数は1件のみ表示されました。

出力結果

{
  "took" : 10,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1000,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "bank",
        "_type" : "account",
        "_id" : "13",
        "_score" : 1.0,
        "_source" : {
          "account_number" : 13,
          "balance" : 32838,
          "firstname" : "Nanette",
          "lastname" : "Bates",
          "age" : 28,
          "gender" : "F",
          "address" : "789 Madison Street",
          "employer" : "Quility",
          "email" : "nanettebates@quility.com",
          "city" : "Nogal",
          "state" : "VA"
        }
      }
    ]
  }
}

Match query

matchを使ってcityWillistonに一致するものを検索しました。

Match query | Elasticsearch Reference [7.x] | Elastic

GET bank/_search
{
  "query": {
    "match": {
      "city": {
        "query": "Williston"
      }
    }
  }
}

出力結果

{
  "took" : 20,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 5.0064387,
    "hits" : [
      {
        "_index" : "bank",
        "_type" : "account",
        "_id" : "359",
        "_score" : 5.0064387,
        "_source" : {
          "account_number" : 359,
          "balance" : 29927,
          "firstname" : "Vanessa",
          "lastname" : "Harvey",
          "age" : 28,
          "gender" : "F",
          "address" : "679 Rutledge Street",
          "employer" : "Zentime",
          "email" : "vanessaharvey@zentime.com",
          "city" : "Williston",
          "state" : "IL"
        }
      }
    ]
  }
}

operatorオプションを使ってcityWillistonRushfordに一致するものを検索しました。

GET bank/_search
{
  "query": {
    "match": {
      "city": {
        "query": "Williston Rushford",
        "operator": "or"
      }
    }
  }
}

出力結果

{
  "took" : 54,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 5.0064387,
    "hits" : [
      {
        "_index" : "bank",
        "_type" : "account",
        "_id" : "260",
        "_score" : 5.0064387,
        "_source" : {
          "account_number" : 260,
          "balance" : 2726,
          "firstname" : "Kari",
          "lastname" : "Skinner",
          "age" : 30,
          "gender" : "F",
          "address" : "735 Losee Terrace",
          "employer" : "Singavera",
          "email" : "kariskinner@singavera.com",
          "city" : "Rushford",
          "state" : "WV"
        }
      },
      {
        "_index" : "bank",
        "_type" : "account",
        "_id" : "359",
        "_score" : 5.0064387,
        "_source" : {
          "account_number" : 359,
          "balance" : 29927,
          "firstname" : "Vanessa",
          "lastname" : "Harvey",
          "age" : 28,
          "gender" : "F",
          "address" : "679 Rutledge Street",
          "employer" : "Zentime",
          "email" : "vanessaharvey@zentime.com",
          "city" : "Williston",
          "state" : "IL"
        }
      }
    ]
  }
}

Range query

rangeを使って年齢が28歳以上、30歳以下を検索しました。

Range query | Elasticsearch Reference [7.x] | Elastic

GET bank/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 28,
        "lte": 30
      }
    }
  }
}

133件ヒットしたので2件目以降は省略しました。

出力結果

{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 133,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "bank",
        "_type" : "account",
        "_id" : "13",
        "_score" : 1.0,
        "_source" : {
          "account_number" : 13,
          "balance" : 32838,
          "firstname" : "Nanette",
          "lastname" : "Bates",
          "age" : 28,
          "gender" : "F",
          "address" : "789 Madison Street",
          "employer" : "Quility",
          "email" : "nanettebates@quility.com",
          "city" : "Nogal",
          "state" : "VA"
        }
      },
      {
        "_index" : "bank",
        "_type" : "account",
        "_id" : "260",
        "_score" : 1.0,
        "_source" : {
          "account_number" : 260,
          "balance" : 2726,
          "firstname" : "Kari",
          "lastname" : "Skinner",
          "age" : 30,
          "gender" : "F",
          "address" : "735 Losee Terrace",
          "employer" : "Singavera",
          "email" : "kariskinner@singavera.com",
          "city" : "Rushford",
          "state" : "WV"
        }
      },
--- 省略 ---

おわりに

Elasticserch Serviceの起動待ちが長いですがクエリを投げて検証する環境はサンプルデータ投入も含め30分弱もあれば準備できそうです。Elasticserchのリファレンスを確認してクエリの使い方を調べ、実際に検索して試行錯誤すればクエリ検証の調査は可能となりました。リファレンス見ながらできるのかできないのか悩む時間でElasticserch Service起動できると思うので、とりあえず触ってみた方が理解が早かったです。

Elasticserch Serviceは停止して利用料金を削減することができません。検証時に停止できないことが難点になることもあるかもしれません。

料金 - Amazon Elasticsearch Service | AWS

本家Elasticserchの最新バージョンと比べるとElasticserch Serviceで利用できるElasticserchのバージョンは最新に追従していません。リファレンスを確認するときは念のため最新ではなく近しいバージョンを確認した方が無難でしょう。現時点ではElasticserch Referenceからリファレンスのバージョンを変更できます。

今後はどういったバージョンになるかはわかりませんが念のため。

Elastic 社による Elasticsearch および Kibana のライセンス変更にともなう AWS の対応方針のご案内 | Amazon Web Services ブログ

参考