使用 sunspot_solr 突出显示拥有的 object 中的字段
Highlighting a field from an owned object with sunspot_solr
我正在使用 sunspot_solr 在 rails 的 ruby 中实现快速查找。我正在通过一些项目 objects 进行全文搜索,但也想通过拥有的笔记的内容进行搜索。我将搜索设置为在用户键入时显示突出显示的命中结果。我可以获得代码以显示突出显示的结果或 return 注释中的命中,但不能同时显示两者。
编码为 return 注释结果:
在Project.rb
attr_accessible:标题,:描述
has_many 笔记
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:内容,:project_id
belongs_to:项目
高亮命中的代码,不搜索笔记内容:
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 本质上是一样的,只是我在项目的 title/description 中添加了 :stored => true
。
然而,尽管尝试了多种选项来对笔记内容进行全文搜索并 return 突出显示笔记内容的结果,但我似乎无法弄清楚如何。每次我尝试添加任何类型的代码以使存储的笔记内容 and/or 突出显示时,代码都会停止工作。这是不可能的,还是我错过了正确的语法?
Solr 是 4.2.0 版本,Sunspot 是 2.1.1 版本
所以,在寻找解决方案的过程中,我发现了更多关于 solr 性能的信息。特别是存储字段与仅索引字段相比对性能的影响。我开始认为在 table 上存储字段与正在搜索的 table 具有 many-to-one 关系可能是不可能的,即使是这样,也不值得性能损失. http://wiki.apache.org/solr/SolrPerformanceFactors
因此,虽然在您键入时实时突出显示笔记中的文本的功能在理论上对我来说似乎非常好,但在实践中它太慢而没有用,所以我不仅没有为突出显示而烦恼注释,但我可能也会放弃存储描述,只显示标题中突出显示的匹配项。
所以我想问题的答案是"It might be possible, but definitely wouldn't be worth it even if it is."
我正在使用 sunspot_solr 在 rails 的 ruby 中实现快速查找。我正在通过一些项目 objects 进行全文搜索,但也想通过拥有的笔记的内容进行搜索。我将搜索设置为在用户键入时显示突出显示的命中结果。我可以获得代码以显示突出显示的结果或 return 注释中的命中,但不能同时显示两者。
编码为 return 注释结果:
在Project.rb attr_accessible:标题,:描述 has_many 笔记
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:内容,:project_id belongs_to:项目
高亮命中的代码,不搜索笔记内容: 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 本质上是一样的,只是我在项目的 title/description 中添加了 :stored => true
。
然而,尽管尝试了多种选项来对笔记内容进行全文搜索并 return 突出显示笔记内容的结果,但我似乎无法弄清楚如何。每次我尝试添加任何类型的代码以使存储的笔记内容 and/or 突出显示时,代码都会停止工作。这是不可能的,还是我错过了正确的语法?
Solr 是 4.2.0 版本,Sunspot 是 2.1.1 版本
所以,在寻找解决方案的过程中,我发现了更多关于 solr 性能的信息。特别是存储字段与仅索引字段相比对性能的影响。我开始认为在 table 上存储字段与正在搜索的 table 具有 many-to-one 关系可能是不可能的,即使是这样,也不值得性能损失. http://wiki.apache.org/solr/SolrPerformanceFactors
因此,虽然在您键入时实时突出显示笔记中的文本的功能在理论上对我来说似乎非常好,但在实践中它太慢而没有用,所以我不仅没有为突出显示而烦恼注释,但我可能也会放弃存储描述,只显示标题中突出显示的匹配项。
所以我想问题的答案是"It might be possible, but definitely wouldn't be worth it even if it is."