【问题标题】:How to show only results that user has access to如何仅显示用户有权访问的结果
【发布时间】:2019-10-08 21:18:10
【问题描述】:

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

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

我在 ElasticSearch 中的数据仅以平面格式在多个索引中建立索引,一个索引用于用户,一个用于帖子。

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

我还可以在索引时将每个用户的关注者 ID 列表添加到 ElasticSearch,然后与它们进行匹配,但如果用户有数千个关注者,这些列表会很大,我不确定它是否方便将它们保留在 ElasticSearch 中。

我怎样才能有效地做到这一点?我的堆栈是后端 Python + Flask、PostgreSQL 数据库和 ElasticSearch 作为搜索索引。

【问题讨论】:

  • 您用于搜索的查询是什么?我想知道您是否只需要在某处添加一个额外的WHERE 子句
  • 我正在根据参数以编程方式构造查询,它是一个 bool + must 和几个子 bool & should 语句。
  • @MarkoPaunovic,你是如何进行的?
  • @Soumendra 我设法在一个查询中做到了,通过过滤掉带有termsfiltersmust_not 的帖子和用户。例如,我做的一件事是保存用户关注者 ID 列表,然后过滤掉除此列表中的所有私人用户。

标签: elasticsearch elasticsearch-py


【解决方案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 个术语的限制(但可以被覆盖),因此如果您的服务没有数百万用户,默认限制就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-18
    • 2014-01-03
    • 1970-01-01
    • 2018-08-15
    • 2018-06-06
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    相关资源
    最近更新 更多