elasticsearch - 通过精确匹配嵌套对象来查找文档

elasticsearch - find document by exactly matching a nested object

我的文档包含多个 role/right 定义作为嵌套对象数组:

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

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

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

以上应该只有return

但我好像明白了

有什么提示吗?

您需要将 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}
                  }
               }
            }
         ]
      }
   }
}