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"
}
}
}
}
}
}
}
}
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? –
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. " –