使用sunspot_solr突出显示拥有对象中的字段

时间:2015-01-09 20:20:15

标签: ruby-on-rails solr sunspot highlighting searchable

我正在使用sunspot_solr在rails上的ruby中实现quickfind。我是全文搜索一些项目对象,但也想搜索自有笔记的内容。我将搜索设置为在用户输入时显示突出显示的匹配结果。我可以让代码显示突出显示的结果或返回注释中的命中,但不能同时返回两者。

返回记录结果的代码:

Project.rb中的

    attr_accessible:title,:description     has_many notes

searchable do
    text :title, :boost => 5
    text :description
    text :notes do
      notes.map(&:content)
    end
  end

在Project_controller.rb

def quick
     unless params[:q].nil? || params[:q].empty?
       @search = Project.search do
        fulltext params[:q]
       end

      @projects = @search.results
     else
      @projects = Project.none
     end

     respond_to do |format|
      format.json { render :json => @projects }
     end
   end
在Note.rb中

    attr_accessible:content,:project_id     belongs_to:project

突出显示匹配的代码,不搜索注释内容: Project_controller.rb

def quick
    unless params[:q].nil? || params[:q].empty?
      @search = Project.search do
        fulltext params[:q] do
          highlight :title
          highlight :description
        end

        adjust_solr_params do |sunspot_params|
          sunspot_params[:rows] = 15
        end
      end

      @result = []
      @search.each_hit_with_result do |hit, project|
        @highlight = hit.highlight(nil)
        @field_name = @highlight.field_name
        @text = hit.highlight(nil).format { |word| "<span style='color: orange;'>#{word}</span>" }
        @result << {:text => @text, :id => project.id, :fieldname => @field_name}
      end
    else
      @result = []
    end

    respond_to do |format|
      format.json { render :json => @result }
    end
  end

Project.rb和Note.rb在这里基本相同,只是我将:stored => true添加到项目的标题/描述中。

然而,尽管尝试了多种选项来对笔记内容进行全文搜索并返回注释内容的突出显示结果,但我似乎无法弄清楚如何。每当我尝试添加任何类型的代码以使注释内容存储和/或突出显示时,代码就会停止工作。它是不可能的,还是我错过了正确的语法?

Solr版本为4.2.0,Sunspot版本为2.1.1

1 个答案:

答案 0 :(得分:1)

因此,在寻找解决方案时,我发现了更多关于solr性能的信息。特别是你在存储字段时所采用的性能命中率,而不仅仅是索引它们。我开始认为在与正在搜索的表有多对一关系的表上存储字段可能是不可能的,即使它是,也不值得性能命中。 http://wiki.apache.org/solr/SolrPerformanceFactors

所以,虽然你在键入时实时突出显示文本中的文字的功能在理论上对我来说似乎非常好,但实际上它太慢而无法使用,所以我不仅不会因为突出显示音符而烦恼,但我可能也会删除存储描述,只显示突出显示的匹配,如果它们在标题中。

所以我认为问题的答案是&#34;它可能是可能的,但即使它是绝对不值得的。&#34;