elasticsearch - 使用访问控制过滤器查询文档

标签 elasticsearch

我的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/

相关文章:

apache - 映射 ElasticSearch apache 模块字段

elasticsearch - 是否可以在 Elasticsearch 中运行两个节点但只允许查询一个?

elasticsearch - 如何在 elasticsearch 中有多个基于或条件的正则表达式?

elasticsearch - 为Elasticsearch集群设置单个备份节点?

ruby-on-rails - Rails 4链接以使用Elasticsearch搜索

elasticsearch - 同一ES索引下有不止一种类型?

elasticsearch - 如何在嵌套的 top_hits 聚合中获取父文档?

elasticsearch - BM25与Elasticsearch中二项项频率的相似性

Elasticsearch 先按某个字段值排序

elasticsearch - 您能否确定Elasticsearch索引是否正在重新编制索引?