【问题标题】:Rails & Sunspot facets and filteringRails & Sunspot 刻面和过滤
【发布时间】:2011-08-11 19:54:36
【问题描述】:

这里几乎是个菜鸟,所以我很感激有人可以提供任何帮助。

我正在尝试通过 Sunspot 在我的网站上的搜索中添加分面。 Ryan 刚刚发布了一个很棒的 Railscast,让我开始了:http://railscasts.com/episodes/278-search-with-sunspot。我得到了这个工作,并且能够添加额外的方面。我的问题是这些方面是相互独立的。如果我在 3 个不同的属性上有 3 个方面,当我选择一个方面时,我已经选择了一个方面,我只想显示属于这两个方面的结果。到目前为止,它只是从一个方面切换到另一个方面。我觉得这不应该那么困难,但我不知道该怎么做。

我确实找到了这个教程:http://blog.upubly.com/2011/01/06/using-sunspot-in-your-views/,我认为它正在做我想做的事。我试图让它工作,但即使我试图让它只在一个方面工作,我也没有列出任何结果。只是方面名称,然后没有其他内容。

想法?

谢谢!!

更新

这是我正在尝试做的代码示例:

调整 Railscasts 代码我得到了这个:

在我的 StylesController 中:

 def index
  @search = Style.search do
  fulltext params[:search]
  facet :departmental, :seasonal, :classifier
  with(:departmental, params[:department]) if params[:department].present?
  with(:classifier, params[:classification]) if params[:classification].present?
  with(:seasonal, params[:season]) if params[:season].present?
end

在我的样式索引视图中(我知道我需要压缩它)

  = form_tag styles_path, :method => :get do
    %p
      = text_field_tag :search, params[:search]
      = submit_tag "Search", :name => nil
  #facets
    %h4 Departments
    %ul
      - for row in @search.facet(:departmental).rows
        %li
          - if params[:department].blank?
            = link_to row.value, :department => row.value
            (#{row.count})
          - else
            %strong= row.value
            (#{link_to "remove", :department => nil})
    %h4 Classifications
    %ul
      - for row in @search.facet(:classifier).rows
        %li
          - if params[:classification].blank?
            = link_to row.value, :classification => row.value
            (#{row.count})
          - else
            %strong= row.value
            (#{link_to "remove", :classification => nil})
    %h4 Seasons
    %ul
      - for row in @search.facet(:seasonal).rows
        %li
          - if params[:season].blank?
            = link_to row.value, :season => row.value
            (#{row.count})
          - else
            %strong= row.value
            (#{link_to "remove", :season => nil})

在我的风格模型中:

     searchable do
       text :number, :description, :department, :classification, :season
       string :departmental
       string :classifier
       string :seasonal
     end

     def departmental
       self.department
     end

     def classifier
       self.classification
     end

     def seasonal
       self.season
     end

还有我的 upubly 代码版本,配对只是试图让“季节性”方面发挥作用:

我将 Search Partial、Search Model 和 SearchHelper 与示例中的相同。我试图弄乱 Helper,因为我的 Facets 将提取文本值,而不仅仅是其他模型的 ID,但无济于事。我没有将我的各种属性设置为单独的模型,因为我认为我不需要那个功能,但我开始不这么想了。

样式控制器:

  def index
@title = "All styles"
@search = search = Search.new(params[:search]) # need to set local variable to pass into search method
@search.url = styles_path
@search.facets = [:seasonal]

@solr_search = Style.search do
  keywords search.query
  with(:seasonal, true)
  search.facets.each do |item|
    facet(item)
    with(:seasonal, params[:season]) if params[:season].present?
  end
  any_of do
      # filter by facets
      search.facets.each do |item|
        with(item).all_of( params[item].try(:split, "-") ) if params[item].present?
      end
  end  
  paginate(:page => params[:page], :per_page => 10)
end

再次感谢您的帮助。绝对是菜鸟,但真的很享受建立这个网站的过程。 Stackoverflow 已经为我提供了巨大的帮助,所以我非常感谢所有在这里发布答案的人。

【问题讨论】:

  • 来自创作者github账号github.com/outoftime/sunspot/wiki/Drilling-down-with-facets的分面教程
  • 谢谢,我可以按照教程中的方式进行刻面。但我试图包含多个不独立的方面。
  • 添加一个简单的缩进示例来说明您如何看待这个工作,这将有助于我们理解为什么建议的解决方案不起作用。输入一个小样本缩进列表(方面信息的层次结构),使用空格进行缩进,然后突出显示帖子的该部分并使用问题输入框顶部的 {} 编辑功能。 ( {} = 代码块,但它使您保持缩进不变)。
  • 谢谢,我添加了我的代码 sn-ps。

标签: ruby-on-rails solr sunspot facet


【解决方案1】:

我自己需要这个问题的答案,并且看到网上似乎没有其他关于它的内容,我决定自己尝试找出答案。

首先我通过逻辑得出结论,控制器可以处理多个方面,并且没有理由不能,我记得关于 ruby​​ 最好的部分是它是最人类可读的代码,尝试阅读你的第一个控制器你会发现它起作用是有道理的。我通过在 url 中手动输入查询字符串对此进行了测试,该字符串返回了预期的结果。因此,一旦我弄清楚了这一点,我就知​​道问题存在于我的观点中(这让我不得不面面相觑,因为现在已经很明显了)

你的例子比我的复杂得多,我的答案可能不是 100% 满足所有要求,但我很确定它很接近。在我看来,您的模型中关于“部门”等的代码也有点多余

控制器

def index
  @search = Style.search do
  fulltext params[:search]
  facet :departmental, :seasonal, :classifier
  with(:departmental, params[:department]) if params[:department].present?
  with(:classifier, params[:classification]) if params[:classification].present?
  with(:seasonal, params[:season]) if params[:season].present?
end

查看

%h4 Departments
%ul
  - for row in @search.facet(:departmental).rows
    %li
      - if params[:department].blank?
        = link_to row.value, styles_path(
          :department => row.value,
          :classification => (params[:classification] unless params[:season].blank?),
          :season => (params[:season] unless params[:season].blank?))
        (#{row.count})
      - else
        %strong= row.value
        = link_to "remove", styles_path(
          :department => nil,
          :classification => (params[:classification] unless params[:season].blank?),
          :season => (params[:season] unless params[:season].blank?))

【讨论】:

    猜你喜欢
    • 2011-07-10
    • 2011-09-28
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多