2017-10-16 7 views
0

J'essaye de créer un petit tableau de bord dans Kibana lié aux pages les plus populaires dans mon site Web. Les documents sont stockés dans le format suivant:ElasticSearch: Agrégation sur la clé de champ

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

, je suis en train de créer une table qui montre ceci:

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

semble Cependant, je ne peux pas être en mesure de regrouper en fonction sur une clé d'un objet. Est-ce possible?

+0

Je ne pense pas que ce que vous demandez est réellement possible. Combien de routes avez-vous? Sont-ils connus à l'avance? Si c'est le cas, vous pouvez utiliser une agrégation de filtres. Ce n'est pas idéal (parce que vous devrez écrire manuellement toutes les routes), mais cela fonctionnera. – dshockley

Répondre

1

Je pense que votre structure de données va vous donner du fil à retordre pour ce que vous essayez de faire.

Je vous propose de changer à ceci:

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

Avec un type de cartographie « mot-clé » pour ev, visiteur, et la route, en plus de tout autre applications dont vous aurez besoin.

Ensuite, vous pouvez agréger comme ceci:

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

L'agrégation ci-dessus renverrait la page 100 de comptage haut d'après les chiffres de chaque valeur « route » cardinal.

Si vous le faites avec votre structure actuelle, vous aurez besoin de scripts assez intéressants, même si c'est possible. Éditer * Je voulais noter que je suppose que vous voulez agréger tous les documents suivant votre structure. Si vous recherchez uniquement des comptes dans ce document unique en fonction de ses objets imbriqués, il peut y avoir une approche.

+0

Malheureusement, je ne peux pas changer la structure de données. En outre, chaque vue peut contenir plusieurs pages. – vinnylinux

+1

Cette suggestion me semble juste. Peu importe que chaque vue puisse contenir plusieurs pages - elles seront simplement mappées à plusieurs documents. Si vous ne pouvez pas modifier la structure des données, pouvez-vous gérer un index séparé, mis à jour périodiquement avec les nouveaux documents? – dshockley