GOOGLE ADS

mardi 19 avril 2022

Comment compter et faire la moyenne du résultat de l'agrégation dans Elasticsearch ?

La requête ci-dessous est utilisée pour connaître le dernier enregistrement de vente pour chaque combinaison de magasin et de ville. Ensuite, j'utilise Java pour calculer le nombre de prix<=100, le nombre de 100<prix<200 et le nombre de prix>=200. Calculez ensuite la moyenne du prix pour chaque ville.

Je veux savoir puis-je y parvenir dans la chaîne de requête Elasticsearch ?

{
"query": {
"match_all": {}
},
"aggs": {
"city_name": {
"terms": {
"field": "city_name"
},
"aggs": {
"store_name": {
"terms": {
"field": "store_name"
},
"aggs": {
"entry_time": {
"max": {
"field": "entry_time"
}
},
"price": {
"top_hits": {
"size": 1
}
}
}
}
}
}
}
}
'

l'exemple de données ressemble à:

{
"_index": "storestatistics_2022_04_11t11_46_01",
"_type": "storestatistics",
"_id": "dankdka",
"_score": 1.0,
"_source": {
"city_name": "NY",
"store_name": "ziyan",
"price": 120,
"user": "xtx",
"entry_time": 1649792100000
...
}
}


Solution du problème

Au lieu d'utiliser top_hitset de calculer les décomptes dans votre application Java, vous pouvez simplement utiliser l' rangeagrégation et laisser ES le faire :

"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "to": 100.0 },
{ "from": 100.0, "to": 200.0 },
{ "from": 200.0 }
]
}
}

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...