2017-12-16 1 views
0

ich die Frage nach dem in äquivalenten Operator gefunden:Elastic Suche: Filter Abfrageergebnisse nach Eingabe seines Feldes in einer anderen Abfrageergebnis

ElasticSearch : IN equivalent operator in ElasticSearch

aber ich würde finden entsprechen die andere kompliziertere Anfrage:

SELECT * FROM table WHERE id IN (SELECT id FROM anotherTable WHERE something > 0); 

Mapping:

Erster Index:

{ 
    "mappings": { 
    "products": { 
     "properties": { 
     "id":  { "type": "integer" }, 
     "name": { "type": "text" }, 
     } 
    } 
    } 
} 

Zweiter Index:

{ 
    "mappings": { 
    "reserved": { 
     "properties": { 
     "id":  { "type": "integer" }, 
     "type": { "type": "text" }, 
     } 
    } 
    } 
} 

Ich will die Produkte erhalten, die IDs in reservierten Index enthalten sind und die spezifische Art einer Reserve.

+0

Bitte geben Sie Ihre Zuordnung und einige Dokument Beispiel – Eli

+0

Ich fügte das Beispiel hinzu. – Joyerhat

Antwort

0

Erster Schritt - erhalten alle relevanten IDs aus reserved Index:

{ 
    "size": 0, 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "type": "TYPE_HERE" 
      } 
     } 
     ] 
    } 
    }, 
    "aggregations": { 
    "ids": { 
     "terms": { 
     "field": "id" 
     } 
    } 
    } 
} 

-> siehe: Terms Aggregations, Bool Query und Term Query.

->_source wird nur relevante Feld id abrufen.

Zweiter Schritt - aus products Index alle relevanten Dokumente erhalten:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "terms": { 
      "id": [ 
       "ID_1", 
       "ID_2", 
       "AND_SO_ON..." 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 

-> nimmt alle IDs aus dem ersten Schritt und setzt sie als Liste unter terms:id[...]

-> siehe Terms Query.

+0

Leider wird der Körper der zweiten Anfrage enorm sein. Wie auch immer, danke für deine Antwort! – Joyerhat

+0

Sie können die Liste aufteilen und mehrere Abfragen oder Abfragen nacheinander verwenden – Eli

Verwandte Themen