2016-04-15 4 views
1

Abfrage sollte ich habe ein Feld gender die drei Werte haben kann:Matching null in in Elasticsearch 2.3.0

  • MALE
  • WEIBLICHE
  • null

Die Abbildung von gender ist :

"gender": { 
    "type": "string", 
    "index": "not_analyzed" 
} 

Um null zu entsprechen, folge ich this.

ich diese Abfrage verwendet, um die Dokumente zu erhalten mit gender als null:

{ 
    "query": { 
     "bool": { 
      "must_not": { 
       "exists": { 
        "field": "gender" 
       } 
      } 
     } 
    } 
} 

Ich möchte eine should Abfrage erstellen, so dass die Suchergebnisse der gender Feld alle Dokumente zurückgeben könnte mit:

{ 
    "query": { 
    "bool": { 
     "should": { 
     "bool": { 
      "should": [ 
      { 
       "match": { 
       "gender": { 
        "query": "MALE", 
        "type": "boolean" 
       } 
       } 
      }, 
      { 
       "match": { 
       "gender": { 
        "query": "FEMALE", 
        "type": "boolean" 
       } 
       } 
      } 
      ], 
      "must_not": { 
      "exists": { 
       "field": "gender" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Die obige Abfrage gibt mir 0 Treffer. Wie soll ich die richtige Abfrage dafür erstellen?

+1

Sie erhalten 0 Ergebnisse, weil Sie verwenden "Muss" mit "MALE" und "FEMALE" Werten. Es sollte "sollte" statt "muss" sein. Und ich verstehe nicht, was Sie mit 'must_not' und' exists' machen. –

+0

Wie passe ich die Dokumente an, die 'gender' als' null' haben? Ich folgte [dies] (https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl-exists-query.html#_literal_missing_literal_query) –

+0

Was ist die Zuordnung für das Feld "Geschlecht" ? –

Antwort

2
{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "gender": { 
       "query": "MALE", 
       "type": "boolean" 
      } 
      } 
     }, 
     { 
      "match": { 
      "gender": { 
       "query": "FEMALE", 
       "type": "boolean" 
      } 
      } 
     }, 
     { 
      "bool": { 
      "must_not": { 
       "exists": { 
       "field": "gender" 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

oder wenn ich die Frage nicht gut verstanden haben und in der Tat Sie zwischen gendervöllig fehlt aus einem Dokument oder Feld dort zu sein, aber mit null unterscheiden wollen, Sie benötigen etwas anderes, das eine geringfügige Änderung der Zuordnung erfordert:

in diesem Fall und die Abfrage ist:

"query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "gender": { 
       "query": "MALE" 
      } 
      } 
     }, 
     { 
      "match": { 
      "gender": { 
       "query": "FEMALE" 
      } 
      } 
     }, 
     { 
      "term": { 
      "gender": "_null_" 
      } 
     } 
     ] 
    } 
    } 

In diesem Fall, wenn Sie Index:

{"index":{}} 
{"gender":"MALE"} 
{"index":{}} 
{"gender":"FEMALE"} 
{"index":{}} 
{"gender":null} 
{"index":{}} 
{"gender2":"MALE"} 
{"index":{}} 
{"gender":"whatever"} 

es wird Ihnen zurück:

 { 
     "_score": 0.2826735, 
     "_source": { 
      "gender": "MALE" 
     } 
    }, 
    { 
     "_score": 0.2826735, 
     "_source": { 
      "gender": null 
     } 
    }, 
    { 
     "_score": 0.021688733, 
     "_source": { 
      "gender": "FEMALE" 
     } 
    } 
Verwandte Themen