Elasticsearch SQL を触ってみた

みなさん、こんにちは。こんばんは。おはようございます。メリークリスマス。matsumotosといいます。
この投稿はアイスタイル Advent Calendar 2018の24日目の記事です。

2018年も残すところあと数日。世間はクリスマスムードに包まれていると思いますが、僕はそんな空気に流されず普通に書いていきます。

そんな2018年。
今年の6月13日にリリースされた「ElasticStack 6.3.0」に注目の機能の一つが追加されました。

それは、、、

「Elasticsearch SQL!!」

Elasticsearch SQL

今までの「Elasticsearch」は、RESTAPIの基に「Query DSL」で検索等を実行されていたかと思います。
ですが、今年リリースされた「ElasticStack 6.3.0」では、皆さん既にご存知であるかと思う「X-Pack」に、「Elasticsearch SQL」という名前で、いつも馴染みのある「SQL」で、集計結果を抽出することができるX-Packプラグインが追加されるようになりました。
ただ、現在では実行できるクエリの種類は基本「SELECT」のみで、「CREATE,INSERT,UPDATE,DELETE」は今まで通りRESTAPIによる「Query DSL」で実行します。

This functionality is in beta and is subject to change. The design and code is less mature than official GA features and is being provided as-is with no warranties. Beta features are not subject to the support SLA of official GA features.This functionality is in beta and is subject to change. The design and code is less mature than official GA features and is being provided as-is with no warranties. Beta features are not subject to the support SLA of official GA features.
@Elastic Docs SQL Access

また上記のように「Elasticsearch SQL」は、まだ「ベータ版のリリース」とElasticは謳っているため、大きな機能変更・削除に注意してください。

・Elastic Stack 6.3.0 リリース
https://www.elastic.co/jp/blog/elastic-stack-6-3-0-released
・Elasticsearch SQL
https://www.elastic.co/jp/products/stack/elasticsearch-sql

X-Packのインストール

$ /usr/share/elasticsearch/bin/elasticsearch-plugin install x-pack
ERROR: this distribution of Elasticsearch contains X-Pack by default

なんとバージョン6.3.0以降からX-Packはデフォルトでインストールされるようになりました。なのでインストール作業は不要です。またデフォルトでBasicライセンスが付与されており、一部の機能までは、制限なく使用できるそうです。

※この記事では、2018年12月時点の最新ver6.5.2の「Elasticsearch」「Kibana」を使用しています。

SQLで検索してみよう

Elasticが提供しているサンプルデータをElasticsearchに格納してやってみましょう。
https://www.elastic.co/guide/en/elasticsearch/reference/6.0/_exploring_your_data.html

単純な銀行の口座を模したドキュメントのようです。(以下、格納したドキュメントの一部

      {
        "_index" : "bank",
        "_type" : "account",
        "_id" : "25",
        "_score" : 1.0,
        "_source" : {
          "account_number" : 25,
          "balance" : 40540,
          "firstname" : "Virginia",
          "lastname" : "Ayala",
          "age" : 39,
          "gender" : "F",
          "address" : "171 Putnam Avenue",
          "employer" : "Filodyne",
          "email" : "virginiaayala@filodyne.com",
          "city" : "Nicholson",
          "state" : "PA"
        }
      },

では実際に、「Kibana」の「Dev tools」から「SQL Query」を使用して検索してみましょう。
URIパスに「/_xpack/sql」と指定して、「query」に検索を実行する「SQL Query」を定義していきます。

JSON形式でレスポンスが返ってきました。ワンラインでは見づらいので綺麗に整形すると以下のようになります。

{
    "columns": [
        {
            "name": "account_number",
            "type": "long"
        },
        {
            "name": "address",
            "type": "text"
        },
        {
            "name": "age",
            "type": "long"
        },
        {
            "name": "balance",
            "type": "long"
        },
        {
            "name": "city",
            "type": "text"
        },
        {
            "name": "email",
            "type": "text"
        },
        {
            "name": "employer",
            "type": "text"
        },
        {
            "name": "firstname",
            "type": "text"
        },
        {
            "name": "gender",
            "type": "text"
        },
        {
            "name": "lastname",
            "type": "text"
        },
        {
            "name": "state",
            "type": "text"
        }
    ],
    "rows": [
        [
            25,
            "171 Putnam Avenue",
            39,
            40540,
            "Nicholson",
            "virginiaayala@filodyne.com",
            "Filodyne",
            "Virginia",
            "F",
            "Ayala",
            "PA"
        ]
    ]
}

columnsとrowsで分離されているようです。

ちなみに、レスポンスのデフォルトフォーマットでは「json」になっていますが、パラメータに「format=csv」「format=txt」として指定すると「csv」「txt」でも返せるようになります。

・「format=csv」


csv形式でレスポンスが返却されました。

・「format=txt」


txt形式はモニターの解像度が低いと少し見辛いですねw

・Elasticsearch SQL CLI

他にも、CLI上でも「Elasticsearch SQL」を実行できます。

# Elasticsearch SQL CLIの起動
$ /usr/share/elasticsearch/bin/elasticsearch-sql-cli

translate

ここまでSQLで検索してきてきましたが、「SQL Query」から「Elasticsearch」の従来使用していた「Query DSL」に変換することができます。変換方法はURIパスの「/_xpack/sql」に「translate」を末尾に追加して実行するだけです。

この変換のおかげで、Elasticsearchの「Query DSL」を学習することもでき、レスポンスで返ってきたqueryをそのままRESTAPI上で使用することができます。

実際の「Elasticsearch SQL」の内部挙動では、「SQL Query → Query DSL変換 → 検索」の流れで実行されているそうです。この「translate」は、ただ単に実行途中の「Query DSL」を返却しているだけのようです。

おわりに

いかがでしたでしょうか。
以前までElasticsearchのRESTAPIによる独特なQuery DSLの学習コストで、Elasticsearchの使用に躊躇していた方も多かったかと思います。ですが待望の「SQL Query」によるアクセスによって、そんな苦手意識を少しでも払拭できればと思います。この機会にElasticsearchを使ってみてはどうでしょうか。

ブランドをオフィシャルにしていくサービスをやっています。