2017-10-16 9 views
0

私は、私のウェブサイトで最も人気のあるページに関連する木場の小さなダッシュボードを作成しようとしています。文書は次の形式で保存されます。ElasticSearch:フィールドキーでの集計

{ 
    "ev": "pageview", 
    "meta": { 
     "visitor": "blah", 
     "pages": { 
     "/my-route": { 
      "title": "My route", 
      "desc": "foo bar" 
     }, 
     "/my-route#2": { 
      "title": "My route 2" 
      "desc": "foo bar" 
     }, 
     } 
    } 
} 

だから、私はこのことを示してテーブルを作成しようとしている:

Page  Views 
/foo  10 
/foo#2 10 
/bar  5 

をしかし、私はベースを集約することができるように見えることはできませんオブジェクトからのキーにそれは可能ですか?

+0

私はあなたが求めていることは実際には可能だとは思わない。いくつのルートがありますか?彼らは事前に知られていますか?その場合は、フィルタ集約を使用できます。理想的ではありません(手動ですべてのルートを書き留めなければならないため)が、動作します。 – dshockley

答えて

1

あなたのデータ構造は、あなたがしようとしていることのためにあなたに困難な時間を与えると思います。

私はあなたがこのように変更し提案する:

{ 
    "ev": "pageview", 
    "visitor" :"blah", 
    "route": "/my-route", 
    "title":"My route", 
    "desc" foo bar" 
} 

EV、訪問者、およびルートのための「キーワード」マッピングタイプでは、あなたが必要となり、他のどんなマッピングに加えて。

次に、あなたは次のように集約することができます:

GET /{YOUR_INDEX}/_search 
{ 
    "query": {"match_all": {}}, 
    "aggs": { 
    "page_views": { 
     "terms": { 
     "field": "route", 
     "size": 100 
     } 
    } 
    } 
} 

上記の集約は、各カーディナル「ルート」値のカウントに基づいて、トップ100カウントのページを返します。

現在の構造でそれを行うには、かなり面白いスクリプトが必要です。

編集*構造に沿ったすべてのドキュメントに集約したいと思っています。そのネストされたオブジェクトに基づいてその単一のドキュメント内の数だけを探しているなら、アプローチがあるかもしれません。

+0

残念ながら、私はデータ構造を変更することはできません。また、各ビューは複数のページを含むことができます。 – vinnylinux

+1

この提案は私にとって正しいようです。各ビューに複数のページが含まれていてもかまいません。複数のドキュメントにマップされます。データ構造を変更できない場合は、新しい文書を定期的に更新して別のインデックスを管理できますか? – dshockley

関連する問題