2014-11-05 71 views
0

我有一个使用Rails 4,PostgreSQL并托管在Heroku上的Rails应用程序。 该应用程序围绕以下模型:用户和文章。 用户可以创建文章。一篇文章包含标题,描述,位置(纬度,经度)和图像。什么是允许用户订阅关键字的好方法

我想补充的通知系统,该系统的工作原理如下:

  • 用户可以建立自己想订阅的关键词列表。
  • 如果添加包含其关键字之一的文章(在标题中,但可能在时间描述中),用户将收到通知。

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

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

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

很明显,后台任务可以做到这一点,但直接在数据库中执行基本字符串仍然听起来不对。

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

我知道我可以很快实现它,我只是想确保它的实现是从头开始的。

感谢, 布赖恩

回答

0

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

在我的情况下,没有一个postgres文本函数可用,因为它们的性能都很差。

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

+0

感谢您的回答@ mark91 - 我说的架构是一个文章表(id,title,...),UserKeyword表(id,user_id,关键字),并且在创建文章时插入文字标题转化为ArticleKeywords(id,article_id,keyword)?字符串连接不会很慢吗?我必须筛选停用词(a,the,it ...等),但它会起作用。 – 2014-11-06 16:59:34

+0

是的,你是对的,像这样。连接(如果一切都是小写或大写)比使用'like'运算符快得多。显然,如果你加入数字你会更快,但现在你正在处理字符串...此外,一些索引可以以这种方式提高你的性能(我建议使用散列索引),而如果你不使用连接索引不会提高你的性能(我们尝试过他们......)。如果你愿意,你可以试试这个解决方案,这样你就可以自己评估表演。 – mgaido 2014-11-06 17:25:01

+0

谢谢。我会试着测试一下,然后我会告诉你它是怎么回事。 – 2014-11-10 11:11:50

相关问题