2016-12-27 4 views
0

Betrachte unter Stop-Feld ist das Timestamp-Feld.ElasticSearch 5. *, Abfrage für: Feld nicht vorhanden oder wenn vorhanden Wert sollte dies sein

Ich möchte mit folgenden Zustandsdaten filtern:

  1. Stoppfeld existieren nicht
  2. oder Feldwert zu stoppen ist> = jetzt

Ich weiß, ich sollte must_not verwenden, kann aber nicht finde heraus, wie.

Ich möchte einige Scoring auf Kind-Typ und verwenden Sie diese Punktzahl, um Eltern zu sortieren, dann filtern Eltern über Stop-Feld.

GET indexName/parentType/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "has_child": { 
      "type": "child-type", 
      "score_mode": "max", 
      "query": { 
       "function_score": { 
       "functions": [ 
        { 
        "script_score": { 
         "script": { 
         "file": "score-analytics", 
         "lang": "expression" 
         } 
        } 
        } 
       ] 
       } 
      } 
      } 
     }, 
     { 
      "bool": { 
      "should": [ 
       { 
       "range": { 
        "stop": { 
        "gte": "now" 
        } 
       } 
       } 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Ich bekomme das gewünschte Ergebnis mit unten Filter aber immer noch auf der Suche nach etwas besser. {"bool": {"sollte": [{"range": {"stop": {"gte": "jetzt"}}}, {"bool": {"must_not": [{"exists": { "field": "stop"}}]}}]}} –

+1

Die Abfrage in Ihrem Kommentar ist genau die, die Sie benötigen. Sie müssen auch '" minimum_should_match ": 1' hinzufügen – Val

Antwort

0

Sie verwenden müssen existieren Filter:

"bool": 
     { "should":[ 
     { "range": 
      { "stop": 
       { "gte": "now" } 
      } 
     }, 
     { "query": 
      { "exists" : 
       { "field" : "stop" } 
      } 
      } 
] } 
0

Was passiert, wenn Sie verwenden, must_notbool Zustand zu filtern, um, dass das Feld nicht existiert. Ihre Abfrage könnte in etwa so aussehen:

Das obige ist ein Beispiel, damit Sie reproduzieren konnten. Für die zweite Bedingung scheint die Verwendung von range Abfrage, wie Sie getan haben, tun würde. Ich kann mir keinen besseren Weg für einen Timestamp geben range. Ich hoffe es hilft!

Verwandte Themen