ほわいとぼーど

ぷろぐらまのメモ帳

Elasticsearchにmappingをtemplate設定してみた

Elasticsearchはスキーマレスなのでそのままデータ突っ込んでも動きますが、
デフォルトだとStringとして取り込まれるし、無駄に要素解析されます。
効率や検索性を考えて部分的にスキーマを先に設定しておきます。

自分の場合、今回はApacheなログだったので、
・request_time:ログ日付をdate_formatで認識させたい
・req_size, response_time: 数字として認識させたい
・protocol, method, code: 要素解析しない
みたいなmappingを設定をしました。

なお、res_sizeも数字にさせたかったのですが、
method:HEADみたいな時に「-」が入ってきてしまってParseErrorだったので、
とりあえず今はStringで我慢しています。
ということで書いたのは以下。

{
  "template_1" : {
    "template" : "*",
    "mappings" : {
      "apache" : {
        "properties" : {
          "protocol" : { "type":"string", "index":"not_analyzed" },
          "request_time" : { "type":"date", "format":"dd/MMM/YYYY:HH:mm:ss Z" },
          "method" : { "type":"string", "index":"not_analyzed" },
          "code" : { "type":"string", "index":"not_analyzed" },
          "res_size" : { "type":"string" },
          "req_size" : { "type":"integer" },
          "response_time" : { "type":"integer" }
        }
      }
    }
  }
}

"apache"の部分がtypename、"properties"の下の階層が各設定要素、
"template"の値はマッチさせたいindexのパターンだったかな?
設定内容はだいたい見るとわかりますね!

"mapping"以下の部分をガイドのようにcurlで直接設定もできるわけですが、
indexをlogstash形式でよろしくやりたい時に自動的に適用されるようにしたかったので
templatesというのを試してみました。

上のをtemplate_1.jsonとして以下のパスに配置します。

/<elasticsearch_dir>/config/templates/template_1.json

ファイル名と1つ目の要素が一緒でないとダメかどうかは試してません。
配置してelasticsearchを再起動すれば設定が適用されるはずですが、
注意点として、この時点では設定を確認することが出来ません。
例えばcurlでmapping&index作成した場合、当該indexのstatus情報をhead等で見ると
mappingが設定されていることを確認することが出来ます。
しかしtemplateを使った場合は設定されるのはindexが作成される時なので
indexを別途作ってみないと本当に適用がうまくいくかは確認できません。
jsonに不備がある場合はあえなく失敗するのでちゃんと事前に試しましょう。

(追記)パース次第ではログ日付のmappingは不要でした。 →「fluentd-plugin-elasticsearchでのログ時刻の扱い」