ne aradığınız Children Aggregation olduğuna inanıyoruz.
PUT /my_index
{
"mappings": {
"user": {
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "integer"
}
}
},
"privilege": {
"properties": {
"privilegeName": {
"type": "string"
}
},
"_parent": {
"type": "user"
}
}
}
}
Sonra ben şu kullanıcı eklemek:
PUT /my_index/user/1
{
"name": "sally",
"age": 32
}
PUT /my_index/user/2
{
"name":"bob",
"age": 41
}
çocuk olarak
Örneğin
, bu reklam ebeveyn olarak kullanıcı ile aşağıdaki indeksi oluşturmak diyelim ve ayrıcalık
Daha sonra her kullanıcıya bazı ayrıcalıklar veriyorum.
POST /my_index/privilege/?parent=1
{
"privilegeName":"add"
}
POST /my_index/privilege/?parent=1
{
"privilegeName":"update"
}
POST /my_index/privilege/?parent=1
{
"privilegeName":"delete"
}
Ama sadece Ali'ye 'güncelleme' 'ekle' ve ayrıcalığını verin:
POST /my_index/privilege/?parent=2
{
"privilegeName":"add"
}
POST /my_index/privilege/?parent=2
{
"privilegeName":"update"
}
ı, 'ekle' 'güncelleme' ve 'sil' olarak Sally ayrıcalığı vermek diyelim Şimdi has_child
sorgusunu kullanarak 'ekle' ayrıcalığına sahip olan tüm kullanıcıları arayabilirim.
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"
}
}
}
}
}
}
}
}
çocuk toplama iyi bir fikirdir: Ama,
aggs
yılında, ben de uyan kullanıcıların her sahip olduğu tüm ayrıcalıklarla tam bir listesini gösterebilir. Yine de bir sorun var. Kullanıcı sonuçlarını paginate etmek istiyorum. Kullanıcılar için sayfalandırma, toplamalar için dikkate alınmaz. Birleştirme, yalnızca sorgulama tarafından döndürülen gerçek sonuçlar için, sayfalandırma göz önüne alındığında bir yol var mı? –Bu, ES arkadaşlarından gelen bir yanıttır: "iç isabetler her sonuç için daha fazla arama isteği gerçekleştirir. Bu zaten ağır olabilir, toplamaların çok fazla olması çok fazla olabilir. Daha doğrusu, her bir isabet için bir girişle bir çoklu arama çalıştırın ve hesaplayın oradaki agregasyonlar. " –