【发布时间】:2016-09-08 16:31:54
【问题描述】:
我们有一个用例,用户必须能够搜索仅在他们有权访问的组中可用的内容。搜索必须跨越他们有权访问的所有组。
一些细节: 一个组有很多帖子,一个用户可以访问数百个组和每个组内的数千个帖子。 搜索“Foo”应返回名称中包含“Foo”的所有组和他们有权访问的组中的所有帖子,并且内容中包含“Foo”。
我想到的处理方法是在每个文档索引上关联一个 user_id 列表,然后在查询字符串中包含 user_id 以验证用户是否具有访问权限。返回结果后,我们可以在返回结果之前进行额外检查以查看他们是否可以访问内容。
文档索引是这样的:
fields = [
search.TextField(name="data", value="some searchable stuff"),
search.AtomField(name="post_id", value="id of post"),
search.AtomField(name="group_id", value="id of group"),
search.AtomField(name="user_id", value=user_id_1),
search.AtomField(name="user_id", value=user_id_2),
#.... add the thousand other users who have access to the group (done in loop)
]
#then query run a user 123 would be as follows:
results = index.search("data = Foo AND user_id = 123")
我对上述方法的担忧: 每个订阅组的新用户都需要重新索引搜索索引,以在每个文档中包含他们的 user_id。
有没有更好的方法来处理这个用例?
谢谢 抢
【问题讨论】:
-
既然已经包含了group_id,为什么还要包含user_id,并且知道用户属于哪些组?
-
@AndreiVolgin 以便用户可以在站点范围内搜索他们所属的所有组)。这可能是100年代。您是否建议将 group_ids 列表作为查询的一部分传递?如果有 100 个,那么 100 个 OR 查询不是很昂贵吗?
标签: google-app-engine gae-search