Sie es beantwortet sich selbst, aber die ES-2.x-Weg, dies zu tun ist, um nicht die filtered
Abfrage verwenden, da es veraltet ist, und es wird entfernt in 5.0 ES werden. ES 2.x führt das Konzept des "Filter" -Kontexts ein und nicht jede Abfrage, die entweder nur eine Abfrage oder ein Filter ist; jetzt jede Abfrage ist sowohl ein Filter oder eine Abfrage (hat), nur abhängig von dem Kontext es in verwendet werden
Für Ihre Abfrage, dies deshalb, weil die vereinfachten bool
/filter
Syntax ein wenig einfacher wird.
{
"size":10,
"query":{
"bool":{
"must":[
{
"term":{
"event":"matchmaking_done"
}
}
],
"must_not":[
{
"exists":{
"field":"pvp_league"
}
}
],
"filter":[
{
"range":{
"@timestamp":{
"gt":"2016-06-01T00:00:00.000Z",
"lte":"2016-06-01T00:05:00.000Z"
}
}
}
]
}
},
"aggs":{
"user-ids":{
"terms":{
"field":"user_id",
"size":0
}
}
}
}
Als sehr groß beiseite, "size" : 0
für die terms
Aggregation spezifizieren, fordern Sie alle einzigartige Bedingungen, bis zu INT_MAX
. Das ist keine skalierbare Anfrage (funktioniert gut mit 10 user_ids oder sogar 100, aber nicht 10000 Benutzern).
Als nicht so schlecht beiseite, Ihre Anfrage braucht überhaupt keinen Abfragekontext, weil nichts über die Suche Seite von Relevanz interessiert. Ihr Begriff Abfrage ("event" : "matchmaking_done"
) entspricht entweder oder nicht. Da Sie wollen, dass es entweder passt oder nicht, aber Sie sich nicht wirklich um die Reihenfolge kümmern, sollten Sie dies im Filterkontext verwenden. Dies ändert die Anforderung an:
{
"size": 10,
"query": {
"bool": {
"must_not": [
{
"exists": {
"field": "pvp_league"
}
}
],
"filter":[
{
"range": {
"@timestamp": {
"gt":"2016-06-01T00:00:00.000Z",
"lte":"2016-06-01T00:05:00.000Z"
}
}
},
{
"term": {
"event": "matchmaking_done"
}
}
]
}
},
"aggs": {
"user-ids": {
"terms": {
"field": "user_id",
"size": 0
}
}
}
}