如何仅显示用户有权访问的结果

时间:2019-10-08 21:18:10

标签: elasticsearch elasticsearch-py

我的Python应用程序的数据库结构与Instagram非常相似。我有用户,帖子,并且用户可以互相关注。有公共帐户和私人帐户。

我正在ElasticSearch中为该数据建立索引,并且搜索到目前为止工作正常。但是,存在一个问题,即搜索返回所有帖子,如果用户有权访问该帖子,则不按标准过滤(例如,帖子是由另一个拥有私人帐户的用户创建的,而当前用户没有关注该用户)。

ElasticSearch中的数据仅以固定格式跨多个索引建立索引,一个索引用于用户,一个索引用于帖子。

我可以对ElasticSearch返回的结果进行后处理,并删除当前访问权限无权访问的帖子,但这会向数据库引入其他查询以检索该用户关注者列表,甚至可能是阻止列表(我不想向彼此屏蔽的用户显示帖子。

我还可以在建立索引后将每个用户的关注者ID列表添加到ElasticSearch中,然后与它们进行匹配,但是如果用户有数千个关注者,则这些列表将非常庞大,并且我不确定它的便利性将它们保留在ElasticSearch中。

如何有效地做到这一点?我的堆栈是后端Python + Flask,PostgreSQL数据库和ElasticSearch作为搜索索引。

1 个答案:

答案 0 :(得分:1)

也许您已经找到了解决方案...

如果您有一个可以过滤的关注者列表索引,则使用弹性的“术语查找”可以解决此问题,如您在此处所述:

我还可以将每个用户的关注者ID列表添加到ElasticSearch中 索引后再与之匹配,但如果用户具有 成千上万的追随者,这些名单将是巨大的,我不确定 将它们保留在ElasticSearch中将有多方便。

文档中的更多详细信息: https://www.elastic.co/guide/en/elasticsearch/reference/7.5/query-dsl-terms-query.html#query-dsl-terms-lookup

请注意,有65 536个字词的限制(但可以覆盖),因此,如果您的服务没有数百万用户,则默认限制就可以了。