在 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 中实现通用搜索的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中实现通用堆栈

通用扩展类 AND 在 Kotlin 中实现接口

如何在 BigQuery 中实现通用 Oracle DECODE 函数?

在 Java 中实现和使用通用的抽象接口

如何在 Swift 中实现一个管理 UserDefaults 的键值对的通用结构?

在 Ruby on Rails 3 应用程序中实现搜索?