2016-10-18 1 views
0

私はWebサーバーのアクセスを分析するためにlogstashを使用しています。現時点では、かなりうまく動作します。 親レコードを持つlogstashに結合する

{ 
    "type": "apache_access", 
    "clientip": "192.243.xxx.xxx", 
    "verb": "GET", 
    "request": "/publications/boreal:12345?direction=rtl&language=en", 
    ... 
    "url_path": "/publications/boreal:12345", 
    "url_params": { 
    "direction": "rtl", 
    "language": "end" 
    }, 
    "object_id": "boreal:12345" 
    ... 
} 

このレコード

は「logstash - 2016年10月2日、」指数(1日1つのインデックス)に格納されている:私は、私にはこの種のデータを生成し、設定ファイルを使用していました。 「publications」という名前の他のインデックスも作成しました。このインデックスには、パブリケーションメタデータが含まれます。 はJSONレコードは次のようになります。

{ 
    "type": "publication", 
    "id": "boreal:12345", 
    "sm_title": "The title of the publication", 
    "sm_type": "thesis", 
    "sm_creator": [ 
    "Smith, John", 
    "Dupont, Albert", 
    "Reegan, Ronald" 
    ], 
    "sm_departement": [ 
    "UCL/CORE - Center for Operations Research and Econometrics", 
    ], 
    "sm_date": "2001", 
    "ss_state": "A" 
    ... 
} 

そして私は「私 "スミス、ジョンの出版物のためのすべてのアクセスを与える」のようなクエリを作成したいと思います。 すべての私のデータが同じインデックスにはないとして、私は(私は右だ?)親子関係を使用することはできません 私は、フォーラムでこれを読んで、それは古い記事です:

By limiting itself to parent/child type relationships elasticsearch makes life 
easier for itself: a child is always indexed in the same shard as its parent, 
so has_child doesn’t have to do awkward cross shard operations. 

logstashを使用して、すべてのデータを単一の索引名付きログ・スタッシュに入れることはできません。 1か月で15M以上のレコードを1つのインデックスに収めています...そして、Webアクセスデータを最低5年間(1M * 12 * 15 = 180M)保管する必要があります。 。 18M以上のレコードを含む単一のインデックスを扱うことはお勧めできません(私が間違っている場合は教えてください)。

私の問題の解決策はありますか?私はどんな美しい解決策も見つけられません。 私の唯一の私のpythonスクリプトでこの時間があります:最初のクエリは、すべてのIDの 'スミス、ジョン'の出版物について収集する。このパブリケーションのすべてのWebServerアクセス​​を取得するために、各パブリケーションのループ。 「Smith、John」に321の出版物がある場合、ESに312のHTTP要求を送信し、応答時間は7秒を超えてはなりません(ESのレコード数は知っていますが、 。)

ありがとうございました。申し訳ありませんが私の英語

ルノー

答えて

0

のためのアイデアは、アクセスログ文書がLogstashによって処理されている間、指定した出版物を得るためにelasticsearch logstash filterを使用することです。

このフィルタは、同じobject_idpublicationsインデックスのsm_creatorフィールドを取得し、必要なパブリケーションドキュメントのどのフィールドでもアクセスログを充実させます。その後、単にlogstash- *索引を照会することができます。

この結果
elasticsearch { 
    hosts => ["localhost:9200"] 
    index => publications 
    query => "id:%{object_id}" 
    fields => {"sm_creator" => "author"} 
} 

、お使いのアクセスログ文書は、その後、このようになりますとのためにあなたは、単にすべてのlogstashでsm_creatorフィールドを照会することができます「私 "スミス、ジョンの出版物のためのすべてのアクセス権を与えます」インデックス

{ 
    "type": "apache_access", 
    "clientip": "192.243.xxx.xxx", 
    "verb": "GET", 
    "request": "/publications/boreal:12345?direction=rtl&language=en", 
    ... 
    "url_path": "/publications/boreal:12345", 
    "url_params": { 
    "direction": "rtl", 
    "language": "end" 
    }, 
    "object_id": "boreal:12345", 
    "author": [ 
    "Smith, John", 
    "Dupont, Albert", 
    "Reegan, Ronald" 
    ], 
    ... 
} 
+0

ありがとうございますVal!唯一の「問題」は、パブリケーションのメタデータが変更された場合、対応するアクセスログが変更されないことです。おそらく最も悪い解決策です。 –

+0

このような場合は、[update by query API](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query)を使用して既存のアクセスログをすべて更新することができます.html) – Val

+0

しかし、出版物が出版されたら、ある出版物の著者は時間の経過とともに変化することはありませんでしょうか? – Val

関連する問題