2017-10-16 40 views
0

我正在尝试在Kibana中创建一个与我网站中最受欢迎的页面相关的小型仪表板。这些文件都存储在以下格式: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" 
} 

着有“关键字”映射类型为电动车,游客和路由,除了任何其他映射,您将需要。

然后,你可以汇总如下:

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

以上聚集会返回基于每个红衣主教“路线”价值数排名前100位的计数页面。

用你目前的结构做它会需要一些非常有趣的脚本,如果它甚至可能。

编辑*我想要说明的是,我假设您想要在您的结构之后的所有文档中进行汇总。如果您只是在基于其嵌套对象的单个文档中查找计数,则可能有一种方法。

+0

不幸的是,我无法改变数据结构。另外,每个视图可以包含多个页面。 – vinnylinux

+1

这个建议对我来说似乎是对的。每个视图都可以包含多个页面并不重要 - 它们只会映射到多个文档。如果您无法更改数据结构,您是否可以维护一个单独的索引,并定期使用新文档进行更新? – dshockley