gpt4 book ai didi

ElasticSearch 内容 ACL 过滤性能

转载 作者:行者123 更新时间:2023-12-03 16:20:24 24 4
gpt4 key购买 nike

以下是我的内容模型。

文档与定义有权访问文档的主体的用户和组 acls 相关联。文档本身是一堆元数据和一个大的内容主体(从 pdfs/docs 等中提取)。

执行搜索的用户必须仅限于他/她有权访问的文档集(由文档上的 ACLS 定义)。由于用户 acl 或由于用户所属的组,他/她可以访问该文档。文档上的组成员身份和 ACLS 本质上都是高度 transient 的,这意味着用户的组成员身份经常变化,文档本身的 ACL 也是如此。

方法一将 acls 及其元数据存储在文档中作为非存储字段。将 ACL 中的组扩展到单个用户(因为 acl 可以是一个组)。在查询时,将过滤器附加到用户查询,这将执行 bool 过滤器以仅包含 acl 字段中具有用户 ID 的文档

"filter" : {
        "query" : {
            "term": {
                "acls": "1234"
            }
        }
      }

我看到这种方法的问题是,尽管文档元数据/内容没有改变,但文档需要重新编制索引。

每次用户的组成员身份发生变化时
每次文档上的 ACL 更改(文档的权限更改)

我假设这将导致大量的段创建和合并,尤其是因为文档正文(文档的字段之一)是一个非常大的文本部分。

方法二:这是对方法 1 的修改。当更新与 acl 严格相关时,此方法试图限制对文档的更新。

而不是在元数据上定义 acls。这种方法需要创建多种类型

文档索引中

Document (with metadata & text body) as a parent

id
text


userschild Document (parent id & user acls only). This document will exist for each parent

id
parentid
useracls



groupschild Document (parent id & group acls only). This document will exist for each parent with group acls

id
parentid
groupacls

用户索引中系统中每个用户的条目以及他/她关联的组

User
id
groups

这里的想法是更新现在本地化到不同的 ElasticSearch 实体。在用户 acl 更改的情况下,只有 userschild 文档将得到更新(避免对父文档进行潜在的昂贵更新)。在组 acl 更改的情况下,只有 groupschild 文档将得到更新(再次避免对父文档进行潜在的昂贵更新)。如果用户组成员身份再次发生变化,则只会更新二级索引(避免更新父文档)。

查询本身如下所示。

   "filter" : {
"query" : {
"bool": {
"should": [
{
"has_child": {
"type": "userschild",
"query": {
"term": {
"users": "1234"
}
}
}
},{
"has_child": {
"type": "groupschild",
"query": {
"terms" : {
"groups" : {
"index" : "users",
"type" : "user",
"id" : "1234",
"path" : "groups"
}
}
}
}
}
]
}
}
}

由于将涉及的查询的性质,我对它的可扩展性存有疑问。它涉及两个术语查询,其中一个必须从单独的索引构建。我正在考虑使用启用了文档值的字段来改进术语查找。

方法 2 会扩展吗?我担心的是 has_child 查询及其可扩展性。

谁能澄清我在这方面的理解?

最佳答案

我认为在查询之前扩展组可能会过于复杂。将组标识符原封不动地保留在文档索引中怎么样?

通常,我会用两个索引来表示(没有父子关系,也没有任何类型的嵌套关系)。


用户索引(示例文档)

{
"user_id": 12345,
"user_name": "Swami PR"
"user_group_ids": [900, 901, 902]
}

文档索引(示例文档)

{
"doc_id": 98765,
"doc_name": "Lunch Order for Tuesday - Top Secret and Confidential",
"doc_acl_read_users": [12345, 12346, 12347],
"doc_acl_write_users": [12345],
"doc_acl_read_groups": [435, 620],
"doc_acl_write_groups": []
}

Users Index 可以很容易地存储在数据库中......您的应用程序只需要“Swami 的”user_idgroup_ids 可用查询文档。

然后,当您查询 [Top Secret] 文件作为 Swami PR 时,(阅读),确保添加:

"should": [
{
"term": {
"doc_acl_read_users": 12345
}
},
{
"terms": {
"doc_acl_read_groups": [900, 901, 902]
}
},
"minimum_should_match": 1
]

我可以在这里看到 2 种主要的更新类型:

  1. 在文档上更新的用户或组 := 重新索引文档索引

    中的一条记录
  2. 用户添加到组/从组中删除:= 重新索引用户索引

    中的一条记录

有一个边缘案例

  1. 已删除用户或群组

okay, here you might want to batch through and reindex all documents periodically to clean out stale user/group identifiers... but theoretically, stale user/group identifiers won't exist in the application anymore, so don't cause issues in the index.

关于ElasticSearch 内容 ACL 过滤性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com