假设我有一个博客的前端应用程序,并将博客文章存储在Elasticsearch实例中(这是一个示例)。
我希望多个用户能够将某些博客帖子标记为收藏,而超级用户希望对其进行标记。对于标记为收藏,只有进行标记的用户才能看到已标记。对于标记,如果一个用户标记了它,则其他所有用户都将其视为已标记。
我正在考虑为标记添加boolean field,并为标记添加带有用户ID的array field。这样,我可以使用boolean query查找已标记的帖子,对于用户喜欢的帖子,可以使用exists query。
我对Elasticsearch来说还很陌生,所以我不确定这是否会对数百万/十亿的帖子足够好。还有什么其他选择?
编辑:忘记了,我也希望对博客帖子进行分页,并能够过滤掉/过滤出已标记或标记的帖子。例如,我要首先(按创建日期排序)将10篇博客文章标记为收藏,或将最后10篇博客文章标记。
答案 0 :(得分:1)
要创建一个喜欢的系统,一种解决方案是使用blog_id将数据存储在不同的索引中 用户身份 created_at
通过这种方式,您可以轻松添加删除和搜索。
我希望多个用户能够将某些博客帖子标记为收藏
用户1单击博客2的收藏夹链接,系统将在“收藏夹”索引中存储{{user_id“:1,” blog_id“:2,2,” created_at“:” 2019-10-02 12:00:02 “,” blog_created_at“:” 2019-01-01 09:10:11“}
只有做过标记的用户才能看到标记的内容。
如果您将user_id-blog_id连接起来,则可以使用get by id进行搜索,或者可以使用blog_id,user_id进行搜索,并且如果显示的博客被阅读的用户标记为收藏,则可以知道记录是否存在。 列表页面与您知道的user_id相同,并且在构建blog_ids列表后将显示,您可以进行搜索并检索一个列表,该列表将在您显示博客列表时使用。
即使对于数十亿个帖子,此解决方案也将具有良好的性能。
如果您有标记,也可以用相同的方式标记博客文章并放置类别字段。
根据您将拥有多少标志和哪种标志,可以考虑使用类别字段['favorite','flag',...]将其保存在相同的索引中,或者保存在不同的索引中。
要检查的另一件事是使用定期索引(每月,每周或每天)取决于要存储的文档数量以及要进行的更新(添加/删除收藏夹)数量。如果您对它们有不良活动,则可以在以后每年汇总一次索引。 最后,也许考虑使用缓存来处理对收藏夹按钮的疯狂单击,这可能导致添加/删除文档,这将增加索引中已删除文档的数量,从而使索引变慢。
针对问题中的“编辑”进行编辑:
例如我要首先(按创建日期排序)10个博客文章 被标记为“收藏”或已标记最近的10条博客帖子。
您可以在您喜欢的记录“ blog_created_at”中添加博客创建日期(我更新了示例文档)。因此,您可以按博客创建日期进行排序,并且如果要首先选择10个,则可以将汇总限制为10个。
对于您评论中的另一种情况:
如果我只想按日期排序10篇博客文章,这些文章不是 标记为收藏或未标记
如果您有收藏夹(例如“ has_favorite”或“ has_flag”),则可以在博客中添加一个字段并将其设置为True。 首次设置为收藏夹时,您将其设置为True,如果已经收藏,则不执行任何操作。 因此,您可以在此字段中进行搜索以过滤没有收藏夹的博客。
如果某人删除了收藏夹,则可以将0设置has_favorite设置为False来计算该博客有多少收藏夹。 <-仅此情况可以生成更新,但可能是0.001%的情况,因此最好关注99%的情况。如果增加,则需要调整解决方案。