2015-10-05 4 views
20

werden kann, ist eine sehr dumme Frage, Was ist der beste Weg liegt vor, wenn ein Feld eines Dokuments in Elasticsearch zu überprüfen? Ich kann nichts in der Dokumentation finden.Der beste Weg, um zu überprüfen, ob ein Feld in einem Elasticsearch Dokument existiert

Zum Beispiel, wenn dieses Dokument nicht das Feld/Schlüssel "Preis" hat, möchte ich nicht im Ergebnis zurückgeben.

{ "aktualisiert": "2015.09.17 11.27.27" "name": "Eye Shadow" "Format": "1,5 g/0,05 oz", }

Was kann ich tun?

Dank

Antwort

30

Sie die exists filter mit einem bool/must filter wie folgt kombiniert verwenden können:

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "exists": { 
       "field": "price" 
       } 
      }, 
      ...  <-- your other constraints, if any 
      ] 
     } 
     } 
    } 
    } 
} 

Sie auch die mit einem bool/must_not filter kombiniert missing filter verwenden:

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must_not": [ 
      { 
       "missing": { 
       "field": "price" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+0

existiert aber ist nicht wie NULL von SQL ist? Wenn das "Feld" nicht überprüft wird, prüft es den Wert des Feldes. Vielleicht habe ich die Dokumente missverstanden. @Val –

+0

Wenn Ihr Dokument kein 'Preis'-Feld hat, kann es auch keinen 'Preis'-Wert haben, so dass das Dokument ohne' Preis'-Feld nicht übereinstimmt. – Val

+0

@EkaitzHernandezTroyas Können Sie diese ausprobieren? Etwas Glück? – Val

8

Sie existiert verwenden können Filter:

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "exists": { 
      "field": "status" 
     } 
     }, 
     "query": { 
     "match_all": {} 
     } 
    } 
    } 
} 

Grüße, Alain

7

Der exists Filter wurde von existsAbfrage von ES 2.1, obwohl die Arbeitsweise ist die gleiche ersetzt. Außerdem wird der fehlende Filter entfernt und die fehlende Abfrage nicht weiter unterstützt.

Um alle Dokumente zu erhalten, die einen bestimmten Bereich haben,

"bool": { 
    "must": { 
     "exists": { 
      "field": "my_field" 
     } 
    } 
} 

und alle Dokumente zu erhalten, die es kein bestimmtes Feld haben, verwenden Sie mit must_not ähnliche

"bool": { 
    "must_not": { 
     "exists": { 
      "field": "my_field" 
     } 
    } 
} 

Elastic docs: https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl-missing-query.html

+0

funktioniert dies in 1.x auch? – danatcofo

Verwandte Themen