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
- 为角色 1 分配了权限 2 的文档。
但我好像明白了
- 所有分配了角色 1 的文档,而不考虑权限
- 以及所有分配了权利 2 的文档,忽略了角色。
有什么提示吗?
您需要将 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}
}
}
}
]
}
}
}
我的文档包含多个 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
- 为角色 1 分配了权限 2 的文档。
但我好像明白了
- 所有分配了角色 1 的文档,而不考虑权限
- 以及所有分配了权利 2 的文档,忽略了角色。
有什么提示吗?
您需要将 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}
}
}
}
]
}
}
}