我的Elasticsearch索引中的每个文档都有两个包含用户ID的访问控制列表。一个是允许列表,另一个是拒绝列表。我正在尝试将过滤器添加到考虑这些ACL的给定查询中。我以为可以对给定查询使用bool
子句和must
子句,对允许列表使用filter
子句,对拒绝列表使用must_not
子句。到目前为止,我所拥有的(用户1的示例):
{
"bool" : {
"must" : {
[given query]
},
"filter" : [ {
"match" : {
"acl.allow" : {
"query" : "/user/1",
"type" : "boolean"
}
}
}],
"must_not" : [ {
"match" : {
"acl.deny" : {
"query" : "/user/1",
"type" : "boolean"
}
}
}]
}
}
不幸的是,该查询没有返回期望的结果。它返回未在允许列表中列出用户1的对象(这种行为我不理解)。同样,它(显然)会忽略具有空访问控制列表的对象(任何人都应该看到)。有什么建议可以解决吗?
最佳答案
我想到了。首先,由于它的分析器,对于这种查询,使用match
并不是一个很好的解决方案。尽管使用term
令我感到困惑,为什么我没有得到任何结果。仅当相应字段设置为not_analyzed
时,术语查询才返回结果。因此,我更改了映射:
"acl": {
"properties": {
"allow": {
"type": "string",
"index": "not_analyzed"
},
"deny": {
"type": "string",
"index": "not_analyzed"
}
}
}
我的第二个问题-使用空ACL对任何人都可见的对象进行处理-已使用嵌套在
exists
中的must_not
嵌套的bool
解决。建议使用它替代不推荐使用的missing
查询。我的最终查询看起来像这样,并通过了我能想到的所有与ACL相关的测试。{
"bool" : {
"must" : {
[given query]
},
"filter" : {
"bool" : {
"should" : [ {
"terms" : {
"acl.allow" : [ "/user/1" ]
}
}, {
"bool" : {
"must_not" : {
"exists" : {
"field" : "acl.allow"
}
}
}
} ]
}
},
"must_not" : {
"terms" : {
"acl.deny" : [ "/user/1" ]
}
}
}
}
关于elasticsearch - 使用访问控制过滤器查询文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37664383/