【新機能】Kibana PluginsのGraphがリリースされました

2016.04.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

藤本です。

先日、Elastic Stackの新バージョンがリリースされ、簡単にファーストインプレッションを「[速報]Elastic Stackの新バージョンがリリースされました(Elasticsearch2.3、Logstash2.3、Kibana4.5、Beats1.2)」にてご紹介しました。

Elastic日本語ブログに@johtaniさんが翻訳した記事も公開されています。

Release Bonanza! Elasticsearch, Graph, Shield, Watcher, Marvel, Logstash 2.3、Beats 1.2、Kibana 4.5 リリース!

本エントリではKibana Pluginsに追加されたGraphを簡単に触ってみたのでご紹介します。

概要

Graphはインデックス内のデータの関連性を発見する方法を提供します。

RDBMSでは登録されたデータの中から関連性を発見することは難しいものでした。
単純な繋がりの有無だけであれば、SQLでクエリすることは難しくありません。
そこに繋がりの強さが加わるといかがでしょうか?まだSQLを書けますか。
それでは更にあるデータだけに特徴的に現れる繋がりはいかがでしょうか?私は想像がつきません。

Graphを利用すれば、Elasticsearchにデータをインデックスするだけで関連性を抽出できます。更には分かりやすく可視化されます。

例えば、下記のようなユースケースに利用できます。

  • 園芸用手袋を購入したユーザーが他にどのような商品に興味があるのか発見することができる
  • 自Webサイトを閲覧するユーザーの共通の行動は何か発見することができる
  • Stack Overflow上でどのエンジニアがHadoop関連技術とPython関連技術の両方を持ち合わせているか発見することができる

面白そうですね。

それでは早速触ってみましょう。

ちなみにGraphはMarvel、Shield、Watcher同様、有償サブスクリプションです。試用ライセンスにてインストール後、30日間は全ての機能を利用できます。

環境

  • Graphサーバ
    • OS : CentOS 7.2
    • Elasticsearch : 2.3.0(GraphはElasticsearchの2.3.0以上が動作要件)
    • Kibana : 4.5.0

インストール

Elasticsearch Pluginsインストール

Elasticsearchのライセンスのインストールしていない場合、pluginコマンドで試用ラインセンスをインストールします。

# /usr/share/elasticsearch/bin/plugin install license
-> Installing license...
Trying https://download.elastic.co/elasticsearch/release/org/elasticsearch/plugin/license/2.3.0/license-2.3.0.zip ...
Downloading .......DONE
Verifying https://download.elastic.co/elasticsearch/release/org/elasticsearch/plugin/license/2.3.0/license-2.3.0.zip checksums if available ...
Downloading .DONE
Installed license into /usr/share/elasticsearch/plugins/license

pluginコマンドでGraphをインストールします。

# /usr/share/elasticsearch/bin/plugin install graph
-> Installing graph...
Trying https://download.elastic.co/elasticsearch/release/org/elasticsearch/plugin/graph/2.3.0/graph-2.3.0.zip ...
Downloading ....DONE
Verifying https://download.elastic.co/elasticsearch/release/org/elasticsearch/plugin/graph/2.3.0/graph-2.3.0.zip checksums if available ...
Downloading .DONE
Installed graph into /usr/share/elasticsearch/plugins/graph

# systemctl restart elasticsearch

# curl localhost:9200/_cat/plugins
Lionheart graph   2.3.0 j
Lionheart license 2.3.0 j

Graph Pluginsがインストールされました。

Kibana Pluginsインストール

kibanaのpluginサブコマンドでGraphをインストールします。

# /opt/kibana/bin/kibana plugin --install elasticsearch/graph/latest
Installing graph
Attempting to transfer from https://download.elastic.co/elasticsearch/graph/graph-latest.tar.gz
Transferring 69293 bytes....................
Transfer complete
Extracting plugin archive
Extraction complete
Optimizing and caching browser bundles...
Plugin installation complete

# systemctl restart kibana

Webブラウザを起動し、Kibanaを起動し、アプリケーション一覧を開くと、Graphが追加されています。

Discover_-_Kibana

画面構成

まずはGraphを起動します。

Kibana 10

メニューの構成は左から以下となります。

  • 対象インデックスの選択
  • 対象フィールドの選択
  • 条件式

  • 表示を戻す

  • 表示を進む
  • 検索の追加
  • 検索のクリア
  • Blacklist selection from return to workspace(とは?)
  • Term間のリンク
  • 設定
  • Advanced Mode
    • ドキュメント情報の表示
    • 要素レベルの表示色変更

サンプルデータ

弊社らしく?ブログの情報をサンプルデータとして利用します。
ブログエントリのカテゴリ情報、執筆者を1ドキュメントとして幾つか投入します。
カテゴリはArray Objectでエントリの全てのカテゴリを並べます。

Indexはこんな感じ。

# curl "localhost:9200/blogs?pretty"
{
  "blogs" : {
    "aliases" : { },
    "mappings" : {
      "entry" : {
        "properties" : {
          "author" : {
            "type" : "string",
            "index" : "not_analyzed"
          },
          "tag" : {
            "type" : "string",
            "index" : "not_analyzed"
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1459569924692",
        "number_of_shards" : "5",
        "number_of_replicas" : "1",
        "uuid" : "xSILZ6lgR0WUxxR23RDNIA",
        "version" : {
          "created" : "2030099"
        }
      }
    },
    "warmers" : { }
  }
}

カテゴリ間の関連性を表示する

まずはブログエントリのカテゴリ間の関連性を表示してみましょう。

Indexにblogs、Fieldにtag、条件は*を入力し、検索を実行します。

(※) わかりやすさを優先し、一部デフォルト設定から変更しています

Kibana

はい、かっこいいです(違

こちらはブログに設定された全てのカテゴリと、ブログ1エントリに対するカテゴリ間の関連性を表しています。

例えば、Elastic特集とBeatsは要素間に線があることからElastic特集とBeats両方が設定されたブログがある、ことを表します。逆にPackerは同時にカテゴリが設定されているブログがありません。

また単純な繋がりの有無だけではなく、繋がりの強さも表現されます。Elastic特集とLogstashは線が太くなっていることが分かります。これはElastic特集とLogstashが設定されたブログが特に多いことを表します。

その繋がりの強さも線をクリックすることで分かります。

Kibana 5

この場合、以下が分かります。

  • Elastic特集が設定されたブログエントリが10件
  • Logstashが設定されたブログエントリが4件
  • Logstashが設定されたブログは全てElastic特集が設定されている

他にも

Kibana 11

この場合、以下が分かります。

  • Elasticsearchが設定されたブログエントリが2件
  • Beatsが設定されたブログエントリが4件
  • 両方が設定されているブログエントリは1件

執筆者との関連性を加える

次に執筆者の情報を加えて、執筆者がどのカテゴリのブログをエントリしているのか表示してみましょう。

メニューの一番右にあるAdvanced Modeをクリックすると、Fieldsがプルダウンから変更します。
クリックし、展開すると、フィールドの一覧が表示されます。

Kibana 7

Graphのオブジェクトの色やアイコン、表示件数を変更することができます。

執筆者情報を加えるため、authorを選択し、色、アイコン、表示件数を調整します。

Kibana 8

再度、検索ボタンをクリックします。

Kibana 6

執筆者とエントリしたブログに設定したカテゴリの繋がりが表示されます。
これでスキルマップが分かりますね。

GraphとElasticsearch

それではこのグラフはどのようにして描かれているのでしょうか?
標準のKibanaのVisualizationと同じくKibanaからElasticsearchに実行されているAPIリクエスト、およびそのレスポンスのJSONを確認することができます。

メニューの設定 -> Last Request -> Requestタブを選択します。

Kibana 9

http://host:port/blogs/_graph/explore

というAPIが発行されています。そうです。標準のElasticsearch APIにはないGraph用のAPIが発行されています。
こちらはElasticsearchにインストールしたPluginsに含まれています。
もちろん手動でAPIを実行しても動作します。

今回のリクエストの場合、以下のようなJSONとなります。

{
    "query": {
        "query_string": {
            "default_field": "_all",
            "query": "*"
        }
    },
    "controls": {
        "use_significance": false,
        "sample_size": 2000,
        "timeout": 5000
    },
    "connections": {
        "vertices": [
            {
                "field": "tag",
                "size": 50,
                "min_doc_count": 1
            },
            {
                "field": "author",
                "size": 5,
                "min_doc_count": 1
            }
        ]
    },
    "vertices": [
        {
            "field": "tag",
            "size": 50,
            "min_doc_count": 1
        },
        {
            "field": "author",
            "size": 5,
            "min_doc_count": 1
        }
    ]
}

queryは普通のquery_stringの構文ですね。それ以外は見たことがない設定です。
controlsは設定の項目、connections、verticesはフィールドや表示件数のようです。

このリクエストに対するレスポンスはResponseタブを選択すると表示されます。

レスポンスのJSONは以下のようになります。

{
    "took": 0,
    "timed_out": false,
    "failures": [],
    "vertices": [
        {
            "field": "tag",
            "term": "Soracom特集",
            "weight": 0.06553064302328078,
            "depth": 0
        },
        {
            "field": "tag",
            "term": "IoT",
            "weight": 0.03536879677793085,
            "depth": 0
        },
        {
            "field": "tag",
            "term": "Beats",
            "weight": 0.0730822037601127,
            "depth": 0
        },
(略)
    ],
    "connections": [
        {
            "source": 13,
            "target": 11,
            "weight": 0.00012515011158856478,
            "doc_count": 1
        },
        {
            "source": 0,
            "target": 16,
            "weight": 0.0004905270356120485,
            "doc_count": 1
        },
        {
            "source": 15,
            "target": 9,
            "weight": 0.0001192959872159091,
            "doc_count": 1
        },
(略)
    ]
}

verticesに一つのカテゴリを表します。
connectionsはsource、targetというフィールドでカテゴリ間の繋がり、および繋がりの数を表します。

まとめ

いかがでしたでしょうか?
Graphは標準のKibanaのVisualizationと異なり、あるデータをそのまま表示するのではなく、データの特徴、データ間の特徴や関連性を踏まえた上で可視化してくれます。
今までのKibanaのユースケースとは違った使い方ができると思います。
試用ライセンスで30日間は無償で使えますので是非一度試してみてはいかがでしょうか。