2015-08-23 11 views
9

Ben ElasticSearch bir üst-çocuk eşleme ayrıcalıkları ayrıcalıkları içintoplamaları

orada birkaç özellikleri vardır ve Bir "privilegeName".

sorgu belli ayrıcalıklara sahip kullanıcıların döndürür, ancak ben has_child eşleşen ayrıcalıkları için her kullanıcı için toplu privilegeName s dönmek istiyorum. Tüm ayrıcalıklarınıinner_hits ile iade edebilir ve bunları istemci tarafında işleyebilirim, ancak bu hantal olabilir. inner_hits'u bir araya getirme olanağı var mı?

Teşekkür

cevap

1

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" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

ç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ı? –

+0

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