elasticsearch - 通过完全匹配嵌套对象来查找文档

时间:2016-07-21 08:18:45

标签: elasticsearch elasticsearch-query

我的文档包含多个角色/权限定义作为嵌套对象数组:

{
  ...
  'roleRights': [
    {'roleId':1, 'right':1},
    {'roleId':2, 'right':1},
    {'roleId':3, 'right':2},
  ]
}

我正在尝试使用特定的roleRights过滤掉文档,但我的查询似乎混淆了组合。这是我的filterQuery as" pseudoCode"

boolFilter > must > termQuery >roleRights.roleId: 1
boolFilter > must > termQuery >roleRights.type: 2

上面应该只返回

  • 具有权限2的角色1的文档。

但看起来我得到了

  • 分配了角色1的所有文档,无视正确的
  • 以及所有分配了权利2的文件而忽略该角色。

任何提示?

1 个答案:

答案 0 :(得分:1)

您需要将roleRights映射为nested(请参阅good explanation here),如下所示:

PUT your_index
{
  "mappings": {
    "your_type": {
      "properties": {
        "roleRights": {
          "type": "nested",
          "properties": {
             "roleId": { "type": "integer" },
             "right": { "type": "integer" }
          }
        }
      }
    }
  }
}

请务必先删除索引,然后重新创建索引并重新填充索引。

然后,您就可以像这样进行查询:

POST your_index/_search
{
   "query": {
      "bool": {
         "must": [
            {
               "nested": {
                  "path": "roleRights",
                  "query": {
                     "term": { "roleRights.roleId": 1}
                  }
               }
            },
            {
               "nested": {
                  "path": "roleRights",
                  "query": {
                     "term": { "roleRights.type": 2}
                  }
               }
            }
         ]
      }
   }
}