agrégation de termes elasticsearch avec filtrage
J'ai des entités comme celle-ci dans l' foo
index:
{ids: ["aa", "bb"]}
{ids: ["aa", "cc"]}
{ids: ["ee"]}
{ids: ["ff" , "cc"]}
Fondamentalement, je veux savoir s'il existe des documents pour les identifiants aa
et les fichiers ee
. J'ai essayé de le faire avec l'agrégation des termes
{
"size": 0,
"query": {
"bool": {
"should": [
{
"terms": {
"ids": [
"aa", "ee"
],
"boost": 1
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"aggregations": {
"byid": {
"terms": {
"field": "ids",
"min_doc_count": 1
}
}
}
}
mais le problème ici qu'en réponse, j'ai également obtenu une agrégation avec d'autres ids
entités sélectionnées, et il y en a beaucoup dans le cas réel, donc l'agrégation pour ids
cela qui m'intéresse ne peut pas venir en réponse et je pense qu'il n'y a pas éléments pour eux (mais en fait il y en a, mais pas en réponse à cause de la limite de taille des termes)
Je pourrais le faire pour chaque id
séparément sans aggs juste obtenir un count
, mais il y en a beaucoup et ce sera très cher.
Sur la base du chat, il a été constaté qu'aucun des documents contenant les identifiants ne sont requis, par conséquent, l'agrégation n'est pas requise, maintenant si un identifiant particulier est présent ou non dans le résultat de la recherche est le principal problème.
il existe plusieurs approches:
- Utilisez multi_search avec un seul identifiant dans chaque sous-requête
- Utilisez une seule demande de recherche avec tous les identifiants, mais effectuez un post-traitement à l'aide d'un script ou d'un filtrage source et d'un identifiant de recherche dans la réponse.