【问题标题】:How can I search across multiple tables(models) with Sunspot Solr?如何使用 Sunspot Solr 搜索多个表(模型)?
【发布时间】:2012-01-18 19:58:17
【问题描述】:

我希望用户能够使用一个搜索框来搜索不同的对象。我会在结果页面上区分它们。两者都是全文搜索。

我是否应该创建一个搜索控制器并将所有内容加载到索引操作中,例如:

@posts = Post.all
@groups = Group.all

有些事情告诉我,这将是非常低效的。

我真的不确定从哪里开始,我还没有设法在互联网上找到任何解决这个问题的东西,但是如果我忽略了一些东西,请告诉我。

谢谢

编辑: 这是在我的网站上全球可用的搜索栏:

    -form_tag posts_path, :method => :get do
     =text_field_tag :search, params[:search], :id => 'searchfield'
     =submit_tag '',:name => nil, :id => 'searchbutton'

它现在只搜索“Post”模型,并在 Post#index 视图中显示结果

我希望能够在 Post 和 Group 表中搜索输入到搜索框中的查询,并将结果显示在同一页面上的两个单独列中。也许通过搜索控制器/视图

【问题讨论】:

  • 你想达到什么目的?在两列中显示结果?在系列第一组,第二个帖子中展示它们?按相关性顺序显示它们?
  • 用代码编辑来解释我的意思。我希望结果显示在两列中,每列对应于对象的类型。

标签: ruby-on-rails ruby-on-rails-3 search solr sunspot


【解决方案1】:

如果你想同时搜索这两种类型,你可以使用这种形式:

# Pass your models in by class constant
Sunspot.search(Post,Group) do |s| 
    s.fulltext(params[:search])
end

这在 wiki 中有记录: https://github.com/sunspot/sunspot/wiki/Working-with-search#initiating-a-search

【讨论】:

    【解决方案2】:

    将 sunspot solr 中的可搜索指令添加到您的模型中以进行索引。例如:

    class Post < ActiveRecord::Base
      searchable do
        text :title, :body
      end
    end
    
    class Group < ActiveRecord::Base
      searchable do
        text :name
      end
    end
    

    如果您在 DB 中有现有数据,请确保运行 rake sunspot:solr:reindex 进行索引。对于新数据,索引将在挂钩中完成。

    现在你可以搜索了:

    @posts = Post.search {fulltext params[:search]}
    @groups = Group.search {fulltext params[:search]}
    

    现在您有了两列的数据。

    【讨论】:

    • 但是如果有一个搜索栏,假设用户输入“旱冰鞋”,我如何同时在两个表中运行该搜索?
    • 我应该做一个搜索控制器吗?现在 @posts = Post.seach {fulltext params[:search] 正在 Post#index 操作中进行,所以当我尝试添加 @groups = Group.search {fulltext params[:search] 它不起作用
    • 它一直给我错误undefined method 'model_name' for Sunspot::Search::StandardSearch:Class 我现在正在通过搜索控制器运行它。帖子和群组都已设为“可搜索”
    • 明白了!我必须使用不同的格式,而不是:@posts = Post.search {fulltext params[:search]} 等...我必须这样做@search = Post.search do{ fulltext params[:search]} end @posts = @search.results
    • 此解决方案将对太阳黑子服务器进行两次调用,对数据库进行两次调用。下面knowuh的回答更可取。
    【解决方案3】:

    这不是答案,但我发现了一些有用的东西。它是一个可以帮助您在多个表中进行搜索的 gem:

    https://github.com/toptierlabs/acts_as_fulltextable

    它可以帮助您将所有可搜索的数据(来自不同的模型)保存在一个地方。

    【讨论】:

      猜你喜欢
      • 2013-09-19
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多