我在ElasticSearch中有一个父子映射:
父级:用户
儿童:特权
对于特权,有一些属性,一个是" privilegeName "。
查询返回具有特定权限的用户,但我想为每个用户返回聚合的 privilegeName ,以获取与has_child
查询匹配的权限。
我可以使用inner_hits
返回所有特权并在客户端处理它们,但这可能很麻烦。
是否有可能汇总inner_hits
?
由于
答案 0 :(得分:1)
我相信你要找的是Children Aggregation。
例如,假设我创建了以下索引,其中 user 作为父级, privilege 作为子级:
PUT /my_index
{
"mappings": {
"user": {
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "integer"
}
}
},
"privilege": {
"properties": {
"privilegeName": {
"type": "string"
}
},
"_parent": {
"type": "user"
}
}
}
}
然后,我添加以下用户:
PUT /my_index/user/1
{
"name": "sally",
"age": 32
}
PUT /my_index/user/2
{
"name":"bob",
"age": 41
}
然后我给每个用户一些特权。假设我给Sally特权'添加','更新'和'删除':
POST /my_index/privilege/?parent=1
{
"privilegeName":"add"
}
POST /my_index/privilege/?parent=1
{
"privilegeName":"update"
}
POST /my_index/privilege/?parent=1
{
"privilegeName":"delete"
}
但我只给鲍勃特权'添加'和'更新':
POST /my_index/privilege/?parent=2
{
"privilegeName":"add"
}
POST /my_index/privilege/?parent=2
{
"privilegeName":"update"
}
我现在可以使用has_child
查询搜索具有“添加”权限的所有用户。但是,在aggs
中,我还可以显示每个匹配用户拥有的所有权限的完整列表:
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"
}
}
}
}
}
}
}
}