内部命中的聚合

时间:2015-08-23 19:30:41

标签: elasticsearch

我在ElasticSearch中有一个父子映射:

父级:用户

儿童:特权

对于特权,有一些属性,一个是" privilegeName "。

查询返回具有特定权限的用户,但我想为每个用户返回聚合的 privilegeName ,以获取与has_child查询匹配的权限。 我可以使用inner_hits返回所有特权并在客户端处理它们,但这可能很麻烦。 是否有可能汇总inner_hits

由于

1 个答案:

答案 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"
              }
            }
          }
        }
      }
    }
  }
}