我做了一个应用程序,用户可以在搜索框中搜索文章,现在我想制作一些列表,看看哪些是最受欢迎的搜索短语/单词。什么是最方便的解决方案。
我唯一能想到的就是这样简单:
create_table "searches", force: true do |t|
t.string "phrase"
t.integer "count"
t.datetime "created_at"
t.datetime "updated_at"
end
因此,每当用户键入单词时,我会查看所有用户以前的搜索列表,如果找到单词,则计数器会增加1。如果我没有找到短语,则将其添加到值为count = 1的表中。\
问题是这对我看起来效率低下,因为像“汽车”这样简单的用户可以键入许多不同的变体,如“蓝色汽车”,“红色汽车”,“宝马汽车”等。随着用户名单的增加,名单会增长以指数方式,通过整个列表找到某个短语并增加该计数器真的很慢。
任何想法如何处理这个问题?
答案 0 :(得分:0)
<强> Redis的强>
您最好使用第三方半持久数据存储;通常Redis
对此进行排序
基本上,当您在应用上收到搜索请求时,您应该让操作执行以下两项操作:
- 使用搜索工具(直接ping数据库,或使用像Solr这样的东西)
- 发送查询字符串&amp;约会到Redis
醇>
Redis是key / value
数据对存储;这意味着它将使您能够保存简单的数据位以备将来使用。 Redis的典型案例包括存储投票模式(对于像SO这样的网站),存储用户跟随(在社交网络上)以及存储累积视图等。
您应该调查的原因是,不是严重依赖您的数据库,而是提供第三方资源来存储较小的数据块,这将使您的应用更加modular,从而提高效率
-
搜索强>
有关搜索字词规范的问题最好通过某种关联来解答(可能会引用评论中的tag
列表)
如果您让所有搜索字词都通过&#34;裸体&#34; (没有任何预先关联的I.E),您可能会得到随机数据的混合。一个更好的方法是&#34; group&#34;某种程度上的数据。我没有任何相关经验,但我会使用Redis
存储搜索字词,然后在插入数据库之前使用group