2017-05-30 2 views
0

ich ein Benutzerdokument mit einem Feld Erfahrungen genannt habe, die ein Array von Objekten, wie zB:Elasticsearch verbinden Bereich und Ausdruck zu gleiches Array-Element

{ 
    "experiences": [ 
    { 
     "end_date": "2017-03-02", 
     "is_valid": false 
    }, 
    { 
     "end_date": "2015-03-02", 
     "is_valid": true 
    } 
    ] 
} 

Mit diesem Dokument Ich habe Benutzer suchen, wo Ende Datum ist im letzten Jahr und is_valid ist wahr. Zu diesem Zeitpunkt habe ich eine Abfrage -> bool und ich füge hinzu zwei dort muss man Bereich für die end_date und ein Begriff für die is_valid.

{ 
    "query": { 
    "bool": { 
     "must": { 
     "term": { 
      "experiences.is_valid": true 
     }, 
     "range": { 
      "experiences.end_date": { 
      "gte": "now-1y", 
      "lte": "now" 
      } 
     }, 
     } 
    } 
    } 
} 

Das Ergebnis ist, dass dieser Benutzer ausgewählt, weil er eine end_date im letzten Jahr (die erste exp.) Und eine andere exp. mit is_valid wahr. Natürlich ist das nicht, was ich brauche, denn ich brauche das end_date und is_valid muss auf das gleiche Objekt verwiesen werden, aber wie können wir das auf Elasticsearch tun?

Mapping:

"experiences": { 
    "properties": { 
    "comment": { 
     "type": "text", 
     "fields": { 
     "keyword": { 
      "type": "keyword", 
      "ignore_above": 256 
     } 
     } 
    }, 
    "end_date": { 
     "type": "date" 
    }, 
    "id": { 
     "type": "long" 
    }, 
    "is_valid": { 
     "type": "boolean" 
    }, 
    "start_date": { 
     "type": "date" 
    } 
    } 
} 
+0

Share-Mapping Ihres Index .. 'GET Index/Typ/_mapping'. Ich denke, die Erfahrung ist vom Typ "Objekt". – Richa

+0

Hinzugefügt, aber es gibt keine "Art" für Erfahrungen ... – Grork

+1

Standard ist "Objekt" .. :) – Richa

Antwort

3

Sie müssen experiences Typ Nested data type ändern.

gelten dann nested Abfrage:

{ 
"query": { 
    "nested": { 
    "path": "experiences", 
    "query": { 
     "bool": { 
      "must": [ 
       { 
       "term": { 
        "experiences.is_valid": true 
       } 
       }, 
       { 
       "range": { 
        "experiences.end_date": { 
         "gte": "now-1y", 
         "lte": "now" 
        } 
       } 
       } 
      ] 
     } 
    } 
    } 
    } 
} 

Dies ist auf die Art und Weise Arrays von Objekten in Elasticsearch abgeflacht. Studie mehr here

+0

Vielen Dank, ich werde es in den nächsten Tagen versuchen! – Grork

Verwandte Themen