【发布时间】: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 我设法在一个查询中做到了,通过过滤掉带有
terms、filters和must_not的帖子和用户。例如,我做的一件事是保存用户关注者 ID 列表,然后过滤掉除此列表中的所有私人用户。
标签: elasticsearch elasticsearch-py