【问题标题】:What is a good approach to allow users subscribe to keywords允许用户订阅关键字的好方法是什么
【发布时间】:2015-01-01 22:56:24
【问题描述】:

我有一个使用 Rails 4、PostgreSQL 并托管在 Heroku 上的 rails 应用程序。 该应用程序围绕以下模型:用户和文章。 用户可以创建文章。一篇文章包含标题、描述、位置(纬度、经度)和图像。

我想添加一个通知系统,其工作原理如下:

  • 用户可以设置他们希望订阅的关键字列表。
  • 如果添加了包含其关键字之一的文章(在标题中,但可能在时间描述中),用户会收到通知。

以可扩展的方式实现这一点的最佳方法是什么?

在最简单的形式中,我可以创建一个名为 Keyword 的模型,用于存储用户希望收到通知的关键字。 然后在文章的创建操作中,检查标题(或描述)是否包含任何已保存的关键字。

这听起来不错,但一旦添加了任何合理数量的用户,可能就会失败。

显然,后台任务可以解决问题,但直接在数据库中包含基本字符串听起来仍然是错误的。

也许我可以将标题和描述标记为索引并使用后台进程来处理繁重的工作?我听说 Postgres 有一些内置的文本搜索功能——这可行吗? 我可以使用 Solr 或 Redis 之类的 Heroku 插件来处理所有这些问题,还是有点矫枉过正? (不必为附加组件付费是一个优势)。 也许有人对相同的功能有更好的实现。

我知道我可以快速实现它,我只是想确保它的实现符合标准。

谢谢, 布赖恩

【问题讨论】:

    标签: ruby-on-rails postgresql heroku solr redis


    【解决方案1】:

    我也遇到过类似的问题。最慢的事情是进行不区分大小写的搜索。我向您建议的是以下方法:让 TID 成为您存储标题的行的 id;然后创建一个表格,其中标题中的每个单词都有一行小写,并带有相应的 TID。您需要的是单词和给定用户的关键字之间的连接。您可以使用散列索引加快查询速度。

    就我而言,没有一个 postgres 文本函数可用,因为它们的性能都很差。

    PS 我们对大约 60000 个文档实施了全文搜索,因此您的情况可能会有所不同。

    【讨论】:

    • 感谢您的回答 @mark91 - 我是否正确地说架构将是文章表(id、标题、...)、UserKeyword 表(id​​、user_id、关键字)和文章创建将标题的单词插入 ArticleKeywords (id, article_id, keyword) ?字符串上的连接不会很慢吗?我必须过滤停用词(a、the、it...等),但它会起作用。
    • 是的,你是对的,就像这样。连接(如果所有内容都是小写或大写)比使用 like 运算符快得多。显然,如果你加入数字,你会走得更快,但现在你正在处理字符串......此外,一些索引可以通过这种方式提高你的性能(我建议使用哈希索引),而如果你不使用连接索引则不要提高你的表现(我们尝试过他们......)。如果你愿意,你可以试试这个解决方案,这样你就可以自己估计性能了。
    • 谢谢。我将尝试对此进行测试,然后告诉您进展如何。
    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2015-02-13
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    相关资源
    最近更新 更多