2017-12-01 1 views
0

Ich habe folgende Abbildung:Filter Ergebnis mit Array von möglichen Werten

{ 
    cities: { 
    mappings: { 
     city: { 
     properties: { 
      id: { 
      type: "long" 
      }, 
      name: { 
      type: "text", 
      fields: { 
       keyword: { 
       type: "keyword", 
       ignore_above: 256 
       } 
      } 
      }, 
      population: { 
      type: "long" 
      }, 
     } 
     } 
    } 
    } 
} 

und Durchführung einfache Abfrage:

{ 
    query: { 
    bool: { 
     must_not: { match: { name: 'New York' } }, 
    }, 
    }, 
    size: 2, 
} 

So in den Ergebnissen, die ich erhalten:

{ 
    "took": 5, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 10385, 
    "max_score": 1, 
    "hits": [ 
     { 
     "_index": "cities", 
     "_type": "city", 
     "_id": "14", 
     "_score": 1, 
     "_source": { 
      "name": "Berlin", 
      "id": 14, 
      "population": 7293 
     } 
     }, 
     { 
     "_index": "cities", 
     "_type": "city", 
     "_id": "19", 
     "_score": 1, 
     "_source": { 
      "name": "Paris", 
      "id": 19, 
      "population": 25018 
     } 
     } 
    ] 
    } 
} 

Wie kann Ich beschränke diese Abfrage auf Dokumente, in denen sich name in einem bestimmten Array von Werten befindet, dh ['Berlin', 'Bonn', 'Munchen'] ?

Ich suche nach etwas simmilar zu SQL-Anweisung:

SELECT * FROM cities WHERE name != 'New York' and name IN ('Berlin', 'Bonn', 'Munchen'); 

Antwort

1

Sie terms query verwenden können, so sollten Sie Ihre Abfrage wie folgt aussehen:

{ 
    query: { 
    bool: { 
     must: { terms: { 'name.keyword': ['Berlin', 'Bonn', 'Munchen'] } } 
     must_not: { match: { name: 'New York' } }, 
    }, 
    }, 
    size: 2, 
} 
+0

Kombinieren mit @ Lupanoides "name.keyword" macht die Arbeit. Vielen Dank! – hsz

0
POST /cities/_search 
{ 
    "query": { 
    "bool" : { 
     "must" : [ 
     { "match" : { "name" : "Berlin" } }, 
     { "match" : { "name" : "Munchen" } }, 
     { "match" : { "name" : "Bonn" } } 
     ], 
     "minimum_should_match" : 3 
    } 
    } 
} 

oder

POST /cities/_search 
{ 
    "query": { 
    "bool" : { 
     "must" : [ 
     { "term" : { "name.keyword" : "Berlin" } }, 
     { "term" : { "name.keyword" : "Munchen" } }, 
     { "term" : { "name.keyword" : "Bonn" } } 
     ], 
     "minimum_should_match" : 3 
    } 
    } 
} 
+0

Das Aufteilen von Termen in getrennte Objekte ist keine Lösung. – hsz

+0

Aber '' name.keyword''trick half mir, wusste das nicht! – hsz

+0

der Begriff Abfrage will Keyword-Datentyp, das ist der Grund, weil die andere Antwort nicht funktioniert. Die Übereinstimmungsabfrage benötigt einen Textdatentyp. Der Trennungsbegriff in der Abfrage ist nur eine andere Syntax, die Abfrage ist die gleiche – Lupanoide