ページ

ラベル Elasticsearch の投稿を表示しています。 すべての投稿を表示
ラベル Elasticsearch の投稿を表示しています。 すべての投稿を表示

2016年3月12日土曜日

Elasticsearchを学ぶ 5 - Kibana -


今回はElastic社のKibanaを使ってみたいと思います。

Kibanaとは?
ログデータなどの可視化ツール。フィルタや集計などを高速に便利に行う。
  • 環境
引き続き前回の環境を前提に進めていきたいと思います。
また今回使うデータは以前こちらで使用したデータを使います。

インストール


インストールの方法としては、公式ページからダウンロードしてインストールします。
$ cd
$ wget https://download.elastic.co/kibana/kibana/kibana-4.4.1-linux-x64.tar.gz -O kibana.tar.gz
$ tar -zxf kibana.tar.gz
$ sudo mv kibana-4.4.1-linux-x64 /usr/local/share/kibana
$ sudo chmod -R 755 /usr/local/share/kibana
$ sudo chown -R vagrant:vagrant /usr/local/share/kibana
  • 設定の変更
kibanaの設定ファイルを修正
$ cd /usr/local/share/kibana
$ vi config/kibana.yml
elasticsearch.urlのコメントを外し、以下に設定。
elasticsearch.url: "http://192.168.33.180:9200"
kibana用のポート5601をVagrantファイルに設定し再起動します
# 以下設定をVagrantファイルに追加
config.vm.network "forwarded_port", guest: 5601, host: 5601
  • 再起動
$ vagrant reload
  • ElasticsearchとKibanaを起動
$ /usr/local/share/elasticsearch/bin/elasticsearch -d -p pid
$ /usr/local/share/kibana/bin/kibana
ブラウザからhttp://192.168.33.180:5601/ にアクセス
↑のような画面が出ればOK

デフォルトのIndexマッチパターンを作成しないと次に進めないので、
とりあえず以下に設定しCreate
以下の画面のようにIndexパターンが作成される


可視化


今回はとりあえず何かグラフを表示させてみます
Visualizeタブを開き、Line Chartを選択
From a new searchを選択
左側の設定(グラフの表示に関する設定)を以下のように変更

▶︎ボタンを押すとグラフが表示される


・・と、まあグラフは表示できましたが、
これだけだとよく分からないので^-^;、
次回は大量にデータを登録して使ってみたいと思います。


2016年3月3日木曜日

Elasticsearchを学ぶ 4 - Analyzer -


今回はMappingする際に設定できるAnalyzerというものを触ってみたいと思います。
その前に・・・
前回作成したmapping.jsonの補足です
"user_id":  {
  "type":   "string",
  "index":  "not_analyzed"
},
user_idのフィールドに対してtypeがstringでindexがnot_analyzedとなっています。
このnot_analyzedですが構文解析せず完全一致で検索します。
例えば・・
user_idにABCD-1234というデータが入ってる場合にnot_analyzedを指定せずにABCDや1234で検索した場合
ABCD-5678でもEFGH-1234でもヒットしてしまいます。
ユニークなフィールドにはつけたほうがいいやつです。
次に・・
"created":  {
  "type":   "date",
  "format": "strict_date_optional_time||epoch_millis"
}
ですが、JSONは日時のデータ型を持ってないので、以下の3つの方法で表現します。
  1. 文字列 ('2016-01-01'や'2016/01/01 10:10:50'など)
  2. 数値 (1970/01/01 00:00:00からの経過ミリ秒(UTC))
  3. 数値 (1970/01/01 00:00:00からの経過秒(UTC))
↑のstrict_date_optional_time||epoch_millis2になります

Analyzer


一つのanalyzerは一つのTokenizerと0個以上のTokenFiltersで構成されます。
サンプルとして以下のMappingをanalyzer_testというIndexに作成します。
※このサンプルではTokenFiltersは使用してません。
{
  "settings": {
      "analysis": {
          "analyzer": {
              "my_analyzer": {
                  "tokenizer": "my_tokenizer"
              }
          },
          "tokenizer": {
              "my_tokenizer": {
                  "type": "nGram",
                  "min_gram": "2",
                  "max_gram": "2",
                  "token_chars": [
                      "letter",
                      "digit"
                  ]
              }
          }
      }
  },
  "mappings": {
    "sample": {
      "properties": {
        "text": {
          "type": "string",
          "analyzer": "my_analyzer"
        },
        "subtext": {
          "type": "string",
          "analyzer": "my_analyzer"
        }
      }
    }
  }
}
my_tokenizerとして設定している箇所で、nGramとありますが、
これはN個文字を区切って検索するものです。ここではmin_grammax_gram
2と設定しているので2文字毎区切って検索を行います。
早速analyzer_test_mapping.jsonとして保存しインポート
$ curl -X POST 192.168.33.180:9200/analyzer_test -d @analyzer_test_mapping.json
ちゃんと設定できているか確認してみます。
$ curl -X GET '192.168.33.180:9200/analyzer_test/_mapping/sample/?pretty'
{
  "analyzer_test" : {
    "mappings" : {
      "sample" : {
        "properties" : {
          "subtext" : {
            "type" : "string",
            "analyzer" : "my_analyzer"
          },
          "text" : {
            "type" : "string",
            "analyzer" : "my_analyzer"
          }
        }
      }
    }
  }
}
ちゃんと設定できているので、データ登録して動作を確認してみます。
$ curl -X PUT 192.168.33.180:9200/analyzer_test/sample/1 -d '{
   "text" : "abcdefg", "subtext" : "123456789"
 }'
まずは、分割された2文字に対して検索。
$ curl -XPOST '192.168.33.180:9200/analyzer_test/_search?pretty' -d
'{ "query": { "match": { "text": "cd" } } }'
{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.11506981,
    "hits" : [ {
      "_index" : "analyzer_test",
      "_type" : "sample",
      "_id" : "1",
      "_score" : 0.11506981,
      "_source" : {
        "text" : "abcdefg",
        "subtext" : "123456789"
      }
    } ]
  }
}
これはヒットしますが、1文字で検索してみると、
$ curl -XPOST '192.168.33.180:9200/analyzer_test/_search?pretty' -d
'{ "query": { "match": { "text": "c" } } }'
{
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }
}
最低2文字で単語を分割してる為こちらはヒットしません。
結構細かくAnalyzerを調整できるので、チューニング次第でヒット率が上がったり下がったりしそうですね。

2016年2月27日土曜日

Elasticsearchを学ぶ 3 - Mapping -



今回はデータをElasticSearchにインポートする際に、どのデータがどの項目に入るか?
そのデータは数値か?日付か?などなど、データインポートする際に必要な
Mapping作業を行ってみたいと思います。

  • 環境
引き続き前回の環境を前提に進めていきたいと思います。

Mapping用のJSONファイル作成


MySQLなどで言うところのテーブルCreate用のSQLを作成するような感じだと思います。
  • 用語
Mapping Types
Index内のTypeを定義するもの。
メタ要素として_index_type_id_sourceがある。
またMappingTypes内にはフィールドとしてPropertiesを持つ。

Field datatypes
フィールドのデータタイプを定義する。
主要なものとしてstringdatelongdoublebooleanipなどがある。
JSONのフォーマットで階層を用いてobjectnestedというデータタイプもあるらしい。

サンプルとして公式ページを参考にシンプルなMappingを作成してみます。
{
  "mappings": {
    "user": { *1
      "properties": { *2
        "name":     { "type": "string"  }, *3
        "age":      { "type": "integer" }  
      }
    },
    "book": {
      "properties": {
        "title":    { "type": "string"  },
        "description":     { "type": "string"  },
        "user_id":  {
          "type":   "string",
          "index":  "not_analyzed"
        },
        "created":  {
          "type":   "date",
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}
一応ユーザーと、そのユーザーが所有する書籍というイメージで作成してみました^^;
*1MappingType*2がフィールド、*3がフィールドとデータタイプになります

試しにこれをuser_booksというIndexに適用させてみたいと思います。
↑のJSONファイルをmapping.jsonとして保存し、保存した場所で以下コマンド実行。
$ curl -X POST 192.168.33.180:9200/user_books -d @mapping.json
{"acknowledged":true}が返って来れば成功

早速 http://192.168.33.180:9200/_plugin/head/ にアクセスして確認してみます。
ちゃんとuser_booksというIndexが作成されていれば成功です。

テストデータ投入


試しに1件userのTypeのid=1にデータを投入してみます。
$ curl -X PUT 192.168.33.180:9200/user_books/user/1 -d '{
  "name" : "hoge",
  "age" : 20
}'
以下のようなレスポンスがあれば成功です。
{
  "_index":"user_books",
  "_type":"user",
  "_id":"1",
  "_version":1,
  "_shards":
  {
    "total":2,
    "successful":1,
    "failed":0
  },
  "created":true
}
ちゃんと登録されているか確認します。
ちゃんと登録されてますね。
今回はここまで。

2016年2月21日日曜日

Elasticsearchを学ぶ 2 - Plugin ElasticSearch Head -


今回はElasticsearchの便利なプラグインElasticSearch Headを使ってみたいと思います。

  • 環境
ここでは前回の環境を前提に進めていきたいと思います。
前回のVagrantファイルの設定は
config.vm.network "forwarded_port", guest: 9200, host: 9200
config.vm.network "private_network", ip: "192.168.33.180"
になっています。

※ここで使用しているElasticsearchのバージョンは2.xです。
1.xとコマンドが若干違います。

ElasticSearch Head


Elasticsearchをブラウザで操作、閲覧できるようにするプラグインです。
公式ページはこちら
  • インストール
$ cd elasticsearch
$ bin/plugin install mobz/elasticsearch-head
  • 外部からアクセスできるようにする
※今回はiptablesを無効化します(本当はちゃんと設定しないとですが^^;)
$ sudo service iptables stop
ブラウザからhttp://192.168.33.180:9200/_plugin/head/ にアクセス

↑のような画面が出ればOK
  • 使い方
タブ概用
Overview横にIndex、縦にNodeを表示
↑の画面では1つのNodeが4つのShardsでIndexのbank構成
※Unssaignedはとりあえず無視(- -;)
IndicesIndexの一覧
BrowserIndexのデータをブラウズできる
Structured QueryQueryを構築でき、どんなJSONになるか確認出来る
Any QueryRequest Methodを投げることができる
  • Browser

Documentをクリックすると詳細が表示されます

  • Structured Query
↑ではaccount_numberが20のものを表示させています
クエリーのJSONが確認出来るので便利です。

  • Any Query

軽く使ってみて


一回一回curlでやらなくてもGUIで出来るのはやっぱり便利だなと思います^^;
ただ頼り過ぎるとコマンドを忘れそう・・