ElasticSearch groupe de plusieurs champs d'
La seule chose proche que j'ai trouvé est: Plusieurs groupe dans Elasticsearch
Fondamentalement, je vais essayer d'obtenir les ES l'équivalent de la suite de requête mysql:
select gender, age_range, count(distinct profile_id) as count FROM TABLE group by age_range, gender
L'âge et le sexe, par eux-mêmes, étaient faciles à obtenir:
{
"query": {
"match_all": {}
},
"facets": {
"ages": {
"terms": {
"field": "age_range",
"size": 20
}
},
"gender_by_age": {
"terms": {
"fields": [
"age_range",
"gender"
]
}
}
},
"size": 0
}
qui donne:
{
"ages": {
"_type": "terms",
"missing": 0,
"total": 193961,
"other": 0,
"terms": [
{
"term": 0,
"count": 162643
},
{
"term": 3,
"count": 10683
},
{
"term": 4,
"count": 8931
},
{
"term": 5,
"count": 4690
},
{
"term": 6,
"count": 3647
},
{
"term": 2,
"count": 3247
},
{
"term": 1,
"count": 120
}
]
},
"total_gender": {
"_type": "terms",
"missing": 0,
"total": 193961,
"other": 0,
"terms": [
{
"term": 1,
"count": 94799
},
{
"term": 2,
"count": 62645
},
{
"term": 0,
"count": 36517
}
]
}
}
Mais maintenant j'ai besoin de quelque chose qui ressemble à ceci:
[breakdown_gender] => Array
(
[1] => Array
(
[0] => 264
[1] => 1
[2] => 6
[3] => 67
[4] => 72
[5] => 40
[6] => 23
)
[2] => Array
(
[0] => 153
[2] => 2
[3] => 21
[4] => 35
[5] => 22
[6] => 11
)
)
Veuillez noter que 0,1,2,3,4,5,6
sont des "mappings" pour les tranches d'âge afin qu'ils signifient réellement quelque chose 🙂 et pas seulement des chiffres. par exemple le Genre[1] (qui est "mâle") se décompose en une tranche d'âge [0] (qui est "de moins de 18 ans") avec un nombre de 246.
- Je suis comme quand je l'appel à l'aide de curl 3{ "error" : { "root_cause" : [ { "type" : "parsing_exception", "raison" : "la clé Inconnue pour un START_OBJECT dans [facettes].", la "ligne" : 6, "col" : 13 } ], "type" : "parsing_exception", "raison" : "la clé Inconnue pour un START_OBJECT dans [facettes].", la "ligne" : 6, "col" : 13 }, "statut" : 400 }
Vous devez vous connecter pour publier un commentaire.
Que vous ne disposez que de 2 champs, un moyen simple est de faire deux requêtes avec une seule des facettes. Pour Les Hommes:
Et pour les femmes:
Ou vous pouvez le faire en une seule requête avec une facette de filtre (voir ce lien pour de plus amples informations)
Mise à jour:
Comme les facettes sont sur le point d'être supprimé. C'est la solution à des agrégations:
À partir de la version 1.0 de
ElasticSearch
, la nouvelle agrégations API permet de les regrouper en fonction de plusieurs champs, à l'aide de sous-agrégations. Supposons que vous souhaitez regrouper les champsfield1
,field2
etfield3
:Bien sûr, cela peut durer autant de champs que vous le souhaitez.
Mise à jour:
Pour être complet, voici comment la sortie de la requête ci-dessus ressemble. Également ci-dessous est le code python pour générer de l'agrégation de la requête et de l'aplatissement de la le résultat dans une liste de dictionnaires.
Le code python suivant effectue le groupe-par la liste des champs. Je vous spécifiez
include_missing=True
, il comprend également des combinaisons de valeurs de certains champs sont manquants (vous n'en avez pas besoin si vous avez la version 2.0 de Elasticsearch grâce à cette)