【问题标题】:Limiting GAE Search API results by user按用户限制 GAE 搜索 API 结果
【发布时间】: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


【解决方案1】:

您的问题没有简单的答案。您需要规划 (a) 典型用例和 (b) 极端情况。

如果一个典型的用户属于 1-3 个组,按 group_id 搜索可能是最好的解决方案。您将进行 1-2 次额外搜索,但您无需在每次用户加入或退出组时重新索引每个文档,这非常昂贵。

对于极端情况,您可以有一个单独的实现。如果用户属于X个以上的组,那么检索所有匹配关键字的结果,然后通过group_id过滤可能会更有效。

另一种方法是始终检索所有结果,而不考虑 group_id/user_id,并将它们存储在 Memcache 中。然后你可以在内存中过滤它们。

用户倾向于使用相同的关键字进行搜索 - 根据您的语料库,1% 的字词可能占搜索量的 99%。如果您有很多用户 - 以及足够大的缓存 - 您将获得大量缓存命中。请注意,1GB 的缓存可以容纳数万甚至数十万条查询结果。这种方法的另一个优点是它可以加快所有查询,尤其是短语或多关键字搜索。

【讨论】:

  • 感谢您的回复。我看到索引 1GB 的成本是 2.00 美元。您知道如何为提交的内容计算数据使用量吗?我的意思是如果一个人提交1KB的数据进行索引,索引量会增加吗?另外,您是否知道索引成本是否也占 CPU 成本?谢谢
  • 这些是谷歌支持的问题。我会假设“索引”本身不包含在实例成本中。我已经有一段时间没有查看他们对 Search API 的定价了。
猜你喜欢
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2014-12-20
  • 2016-10-02
  • 1970-01-01
相关资源
最近更新 更多