目次

目次

PythonからElasticsearchを触ってみる

松木佑徒
松木佑徒
最終更新日2017/01/26 投稿日2017/01/26

あるシステムでアクセスログの保存先にElasticsearchを使用しているということで、 何かに活用できないかデータを少し見せてもらいました。

AWSの機能でElasticsearch + Kibanaを立ち上げてFluentdでサーバからログを転送しているそうです。

ApacheのアクセスログをKibanaから確認します。 CSSやAjaxっぽいログも混じるので使えそうなデータのみに絞ります。

screen1066-01jpg.jpg

ログはJSON形式で保存されKibanaの画面からElasticsearchへクエリを発行することができます。 Kibanaではログのフィルタを Luceneクエリ という書式で指定します。

Pythonから

Pythonから呼ぶには elasticsearch モジュールを利用します。 https://elasticsearch-py.readthedocs.io/en/master/

pip install elasticsearch

先ほどの画面のグラフの下を開くとKibanaがElasticsearchに発行しているクエリを見ることができます。 コピペしてそのまま動作するのでLuceneクエリをElasticsearchのクエリに変換する手間が省けます。

screen1066-2.jpg

ソース

from elasticsearch import Elasticsearch

# この部分はKibanaから持ってくると楽
body = {
    "query": {
        "filtered": {
          "query": {
            "query_string": {
              "query": "path:(artist,album,song) AND NOT(path:(fpg,search,ranking)) AND code:200",
              "analyze_wildcard": True
            }
          }
        }
    },
    "size": 10,
    "sort": [
        {
          "@timestamp": {
            "order": "desc",
            "unmapped_type": "boolean"
          }
        }
    ],
}
es = Elasticsearch(ES_HOST, port=80)
res = es.search(
    index='fpg-stg-t00.httpd.access.log*',
    body=body)
print("Got %d Hits:" % res['hits']['total'])
for hit in res['hits']['hits']:
    print("%(@timestamp)s %(path)s" % hit["_source"])

実行結果

Got 365 Hits:
2016-12-16T17:01:36+09:00 /data/song7636/?part=18
2016-12-16T17:00:53+09:00 /data/album5278/
2016-12-16T17:00:42+09:00 /data/album5878/
2016-12-16T17:00:36+09:00 /data/album5296/
2016-12-16T17:00:24+09:00 /data/art2819/
2016-12-16T16:58:55+09:00 /data/album5288/
2016-12-16T16:58:48+09:00 /data/album5878/
2016-12-16T16:57:21+09:00 /data/song4628/
2016-12-16T16:56:49+09:00 /data/album2878/
2016-12-16T16:56:43+09:00 /data/album5288/

まとめ

少し試してみたところ画面でアクセスしてから30秒くらい遅れて検索で返ってきました。 データ量があまり多くないからか結果は一瞬で返ってくるのでそのあたりは本番でも確認してみたいと思います。

松木佑徒

目次