2016-06-22 13 views
0

Ich habe meine Anfrage:Darf nicht abfragen Elasticsearch

{ 
    "size": 10, 
    "query": { 
     "filtered": { 
      "query": { 
       "bool": { 
        "must": [ 
         {"term": {"event": "matchmaking_done"}} 
       ] 
      } 
     }, 
      "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 
      } 
     } 
    } 
} 

Und ich brauche in dieser Anfrage Parameter hinzufügen - enthält kein Feld pvp_league! Ich habe versucht, must_not hinzuzufügen, kann aber nicht verstehen, wie man das richtig macht. Hilfe bitte!

Antwort

1

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 
     } 
    } 
    } 
} 
0

Ich habe eine Lösung gefunden! Es sieht wie folgt aus:

{ 
    "size": 10, 
    "query": { 
     "filtered": { 
      "query": { 
       "bool": { 
        "must": [ 
         {"term": {"event": "matchmaking_done"}} 
       ], 
       "must_not": [ 
        {"filtered": { 
         "filter": { 
          "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 
      } 
     } 
    } 
} 
Verwandte Themen