在 Rails 4 中实现通用搜索
Posted
技术标签:
【中文标题】在 Rails 4 中实现通用搜索【英文标题】:Implementing Universal search in rails 4 【发布时间】:2015-05-12 19:32:29 【问题描述】:我有一个带有多个模型和视图页面的 rails 4 应用程序。我的应用程序的应用程序布局包含一个搜索栏。但它目前处于非活动状态。搜索栏的目的是允许用户在所有模型中搜索输入的关键字,基本上使其成为全局搜索。有没有可以进行通用搜索的宝石?还是必须通过sql查询手动完成? 我可以看到在其视图页面上实现对特定模型的搜索的方法。但我希望它一次搜索所有模型。我该怎么办?
【问题讨论】:
【参考方案1】:Sunspot 是在 Rails 应用程序中添加搜索最常用的 gem 之一。
索引如下所示:
class Post < ActiveRecord::Base
searchable do
text :title, :body
text :comments do
comments.map |comment| comment.body
end
integer :blog_id
integer :author_id
integer :category_ids, :multiple => true
time :published_at
string :sort_title do
title.downcase.gsub(/^(an?|the)\b/, '')
end
end
end
然后搜索:
Post.search do
fulltext 'best pizza'
with :blog_id, 1
with(:published_at).less_than Time.now
order_by :published_at, :desc
paginate :page => 2, :per_page => 15
facet :category_ids, :author_id
end
【讨论】:
Sunspot 允许跨多个模型进行单一搜索【参考方案2】:我认为在您的情况下最好的方法是使用 ElasticSearch。 here 提供了一个简洁的集成 gem。该页面上提供了文档链接。
【讨论】:
gem 不会为每个模型创建一个索引吗?有没有办法为所有模型创建一个索引?或者你如何在多个索引上搜索一次?将我指向一个链接对我来说已经足够了。 pg_search gem 怎么样?值不值得。因为我的数据库不是太大,不能承受黑子。 @VivekTripathi 好吧,如果你的搜索这么简单,你当然可以使用pg_search
,但这意味着你会被困在你的数据库中,并且当你的应用程序增长时它的可扩展性并不高。
@Almaron,现在这是一个实用且非常有效的观点。谢谢你的建议。我们是否有任何演示或示例代码可以指导我从模型到控制器再查看?我的意思是已经实现了功能齐全的搜索表单,因此可以减少额外的工作量。
@VivekTripathi 在 Google 上对“Elasticsearch rails example”的简短搜索提供了很多有趣的教程,例如:sitepoint.com/full-text-search-rails-elasticsearch。【参考方案3】:
其中一个好方法是使用gem 'searchkick'
它使用弹性搜索。
Searchkick 的资源: https://github.com/ankane/searchkick https://github.com/ankane/searchkick#advanced
【讨论】:
以上是关于在 Rails 4 中实现通用搜索的主要内容,如果未能解决你的问题,请参考以下文章
如何在 BigQuery 中实现通用 Oracle DECODE 函数?