fluentdからElasticSearch+kibana3に転送した文字列が分かち書きされるのを回避する

fluentdからElasticSearch+kibana3に文字列を転送すると、最初に必ず分かち書きの問題で困ることになると思います。

ここでは分かち書きの回避について書いてみます。

 

分かち書きで困った例

fluentdを使ってApacheのアクセスログをElasticSearch+kibana3に転送し、どのページに何回アクセスがあったかを一覧するダッシュボードを作ってみたとします。

dashboard_image1

「アクセスされたパス一覧とアクセス数テーブル」というテーブルにはApacheのLogFormatの「リクエストされたURLアドレス(%U)」要素を入れて、アクセスされたパスごとのアクセス数が集計できるようにしています。グラフはそれをグラフ化したものです。

ちょうど以下の様なwordpressのサイトがあったとして、

wordpress_url1

上記のURLに1回アクセスされた結果が、

dashboard_image3

のようになることをイメージしています。

 

しかし、実際にやってみると、

dashboard_image2

のように、アクセスされたパスが、スラッシュやハイフンなどで区切られた細切れの文字列になってしまうと思います。

これは、パス文字列が分かち書きされてしまっていることが原因です。

 

分かち書きの回避方法

ElasticSearchは全文検索エンジンなので、文字列がデフォルトで分かち書きされるようになっているようです。今回は全文検索がしたいわけではないので、分かち書きを無効にします。

curl -XPUT localhost:9200/_template/template_1 -d '
{
"template" : "*",
"mappings" : {
"_default_" : {
"properties" : {
"path" : { "type":"string", "index":"not_analyzed" }
}
}
}
}
'

これで分かち書きが無効になります。

なお、反映されるのは翌日にインデックスされた分からなので、翌日まで待つ必要があります。待つのが面倒で、当日のインデックスが消えてしまっても良い場合は、

/var/lib/elasticsearch/elasticsearch/nodes/0/indices

にある、日付っぽい名前がついたディレクトリを消してしまえばすぐに反映されます。

 

参考URL

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-templates.html

http://a3no.hatenablog.com/entry/2013/09/11/232223