2016-07-21 4 views
0

ich Dokumente, die mehrere Rolle/Rechts-Definitionen als einen Array von verschachtelten Objekten enthalten:Elasticsearch - findet Dokument durch genau ein verschachteltes Objekt passenden

{ 
    ... 
    'roleRights': [ 
    {'roleId':1, 'right':1}, 
    {'roleId':2, 'right':1}, 
    {'roleId':3, 'right':2}, 
    ] 
} 

Ich versuche Dokument mit spezifischen roleRights heraus zu filtern, aber meine Query scheint Kombinationen zu verwechseln. Hier ist meine filterQuery als "Pseudo-Code"

boolFilter > must > termQuery >roleRights.roleId: 1 
boolFilter > must > termQuery >roleRights.type: 2 

Die oben nur

  • Dokumente zurückgeben soll, die 1 haben Rolle mit Recht zugewiesen 2.

Aber es sieht aus wie ich

bekommen
  • Alle Dokumente, denen die Rolle 1 zugewiesen wurde, ignorieren die richtige
  • und alle Dokumente, die Rechte 2 zugewiesen haben, ohne die Rolle zu berücksichtigen.

Irgendwelche Hinweise?

+0

Können Sie Ihr Mapping als auch teilen? Es ist wahrscheinlich, dass 'roleRights' nicht vom' nested' Typ ist und es sollte. – Val

+0

Sie haben Recht. roleRights wird nicht als verschachtelt zugeordnet. Ist das wirklich notwendig? Und müsste ich NestedQueries verwenden? – Philipp

+0

Ja, das ist notwendig. Siehe meine Antwort unten. – Val

Antwort

1

Sie müssen roleRights als nested (siehe good explanation here) auf der Karte, wie unten:

PUT your_index 
{ 
    "mappings": { 
    "your_type": { 
     "properties": { 
     "roleRights": { 
      "type": "nested", 
      "properties": { 
      "roleId": { "type": "integer" }, 
      "right": { "type": "integer" } 
      } 
     } 
     } 
    } 
    } 
} 

Stellen Sie sicher, dass Index zuerst löschen, neu erstellen und neu füllen Sie es.

Dann werden Sie in der Lage sein, Ihre Abfrage wie folgt zu machen:

POST your_index/_search 
{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "nested": { 
        "path": "roleRights", 
        "query": { 
        "term": { "roleRights.roleId": 1} 
        } 
       } 
      }, 
      { 
       "nested": { 
        "path": "roleRights", 
        "query": { 
        "term": { "roleRights.type": 2} 
        } 
       } 
      } 
     ] 
     } 
    } 
} 
+0

Bravo! Vielen Dank! Gerade gefunden [link] (https://www.elastic.co/guide/en/elasticsearch/guide/current/complex-core-fields.html#object-arrays) -> erklärt mein Problem mit "Array von Objekten" – Philipp

+0

Froh, dass es geholfen hat! – Val

Verwandte Themen