2015-08-23 14 views
9

Ich habe eine Eltern-Kinder-Mapping in Elasticsearch:Aggregationen für innere Treffer

parent: Benutzer

Kinder: Privilegien

Für Privilegien gibt es ein paar Eigenschaften, und Einer ist "privilegName".

Die Abfrage gibt Benutzer, die bestimmte Berechtigungen haben, aber ich möchte die aggregierten privilegeName s für jeden Benutzer für die Privilegien zurückzugeben, die die has_child Abfrage entsprechen. Ich kann alle Privilegien mit inner_hits zurückgeben und sie auf der Client-Seite verarbeiten, aber das kann umständlich sein. Gibt es eine Möglichkeit, die inner_hits zu aggregieren?

Dank

Antwort

1

Ich glaube, für das, was Sie suchen die Children Aggregation ist.

Zum Beispiel lassen Sie uns sagen, dass ich den folgenden Index mit dem Benutzer erstellen als Mutter und Privileg als Kind:

PUT /my_index 
{ 
    "mappings": { 
    "user": { 
     "properties": { 
     "name": { 
      "type": "string" 
     }, 
     "age": { 
      "type": "integer" 
     } 
     } 
    }, 
    "privilege": { 
     "properties": { 
     "privilegeName": { 
      "type": "string" 
     } 
     }, 
     "_parent": { 
     "type": "user" 
     } 
    } 
    } 
} 

Dann füge ich die folgenden Benutzer:

PUT /my_index/user/1 
{ 
    "name": "sally", 
    "age": 32 
} 

PUT /my_index/user/2 
{ 
    "name":"bob", 
    "age": 41 
} 

Dann gebe ich jedem Benutzer einige Privilegien. Sagen wir, ich geben Sally das Privileg 'add', 'Update' und 'löschen':

POST /my_index/privilege/?parent=1 
{ 
    "privilegeName":"add" 
} 

POST /my_index/privilege/?parent=1 
{ 
    "privilegeName":"update" 
} 

POST /my_index/privilege/?parent=1 
{ 
    "privilegeName":"delete" 
} 

Aber ich gebe nur Bob das Privileg 'add' und 'update':

POST /my_index/privilege/?parent=2 
{ 
    "privilegeName":"add" 
} 

POST /my_index/privilege/?parent=2 
{ 
    "privilegeName":"update" 
} 

Ich kann jetzt nach allen Benutzern suchen, die über die Abfrage has_child die Berechtigung zum Hinzufügen haben. Aber in der aggs, kann ich zeigen, auch eine vollständige Liste aller Privilegien, die jeder der passenden Benutzer hat:

GET /my_index/user/_search 
{ 
    "query": { 
    "has_child": { 
     "type": "privilege", 
     "query": { 
     "match": { 
      "privilegeName": "add" 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "by_user": { 
     "terms": { 
     "field": "name" 
     }, 
     "aggs": { 
     "to_privs": { 
      "children": { 
      "type": "privilege" 
      }, 
      "aggs": { 
      "user_privs": { 
       "terms": { 
       "field": "privilegeName" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Die Kinder Aggregation ist eine gute Idee. Es gibt jedoch ein Problem. Ich möchte die User-Ergebnisse paginieren. Die Paginierung für Benutzer wird für die Aggregationen nicht berücksichtigt. Gibt es eine Möglichkeit, die Aggregationen nur für die tatsächlichen Ergebnisse durchzuführen, die von der Abfrage zurückgegeben werden, unter Berücksichtigung der Paginierung? –

+0

Dies ist eine Antwort von ES Leuten: "innere Treffer führt eine weitere Suchanfrage für jedes Ergebnis durch. Das kann schon schwer sein, das Hinzufügen von Aggregationen wäre zu viel. Führen Sie stattdessen eine Multi-Suche mit einem Eintrag für jeden Treffer und berechnen die Aggregationen dort. " –

Verwandte Themen