如何用 Sunspot 突出显示找到的单词?
Posted
技术标签:
【中文标题】如何用 Sunspot 突出显示找到的单词?【英文标题】:How highlight found word with Sunspot? 【发布时间】:2011-11-01 22:54:13 【问题描述】:我想在文本中突出显示找到的单词,例如,如图所示here。
据我所知,我必须遵循以下步骤:
1) 在我的模型中,我必须将:stored => true
选项添加到我要突出显示的字段中:
searchable do
text :title, :stored => true
text :description
end
2) 在我的控制器中,我必须声明要突出显示的字段:
def search
@search = Article.search do
keywords params[:search] do
highlight :title
end
end
end
3)在我不确定该怎么做的视图中,我尝试了这个:
- @search.each_hit_with_result do |hit, result|
%p= link_to raw(hit_title(hit)), article_path(result)
这是什么方法hit_title
:
def hit_title(hit)
if highlight = hit.highlight(:title)
highlight.format |word| "<font color='green'>#word</font>"
else
h(hit.result.title)
end
end
但它并没有按预期工作,它总是突出显示标题的第一个单词,即使搜索的单词在它的末尾。
有没有更简单的方法来做到这一点?
【问题讨论】:
这可能是您的问题,也可能是粘贴错误......您需要“==”而不是“=”:if highlight = hit.highlight(:title)
不,这不是错字。这是 if 子句中的一个赋值,用于 DRY 并压缩代码;)
请将结果粘贴到hit.highlight(:title).inspect
【参考方案1】:
我在寻找解决方案以在 Rails 视图上从太阳黑子搜索中渲染高光时遇到这种情况。
我在任何地方都没有找到太多现成的解决方案,所以我使用了这篇文章的一部分来制作我的一个。 我对 Rails 很陌生,所以这可能不完全是 RoR 方式。
就我而言,我对两个字段进行了全文搜索,分别称为 notes
和 description
。
为了能够将高亮显示为 html,我引入了一个哈希值,其中包含记录的 id、列的名称及其高亮显示的值,并具有适当的格式。这使我可以突出显示不同字段的搜索结果。
entry.rb:
searchable do
text :description, :stored => true
text :notes, :stored => true
end
entries_controller.rb:
@search = Entry.search
if params[:search].nil? || params[:search].empty?
stext=''
else
stext=params[:search]
end
fulltext stext, :highlight => true
paginate(page: params[:page], :per_page => 10)
end
@entries=@search.results
@results=Hash.new
@search.hits.each do |hit|
hit.highlights(:description).each do |highlight|
id=hit.primary_key.to_s.to_sym
fr=highlight.format |word| "<result>#word</result>"
@results.merge!(id => ["description",fr])
end
hit.highlights(:notes).each do |highlight|
id=hit.primary_key.to_s.to_sym
fr=highlight.format |word| "<result>#word</result>"
@results.merge!(id => ["notes",fr])
end
end
在视图上,无论我想渲染这些值的任何地方,我都会执行以下操作:
<% @entries.each do |f| %>
<% j=f[:id].to_s.to_sym %>
<% if !@results[j].nil? && @results[j][0]=="description" %>
<%= @results[j][1].html_safe %>
<% else %>
<%= f[:description] %>
<% end %>
[...] (likewise for notes)
<% end %>
请注意,我为 <result>
标记创建了一个 CSS 定义,以使文本引人注目。
【讨论】:
【参考方案2】:代码在我看来很适合突出显示标题中的第一个匹配单词,因为我有类似的代码。您是否尝试过重建 solr 索引并重新启动服务器?
另外,您可以尝试将您的 solrconfig.xml 恢复为默认值吗?有人修改solrconfig.xml后出现类似问题,参考https://groups.google.com/forum/#!searchin/ruby-sunspot/highlight/ruby-sunspot/kHq0Dw35UWs/ANIUwERArTQJ
如果您想覆盖 solrconfig.xml 中的突出显示选项,请在此站点上搜索 max_sn-ps http://outoftime.github.io/ 。您可能想尝试类似的选项
highlight :title, :max_snippets => 3, :fragment_size => 0 # 0 is infinite
【讨论】:
【参考方案3】:您是否使用子字符串搜索?我在这里遇到了同样的问题,并意识到按照 sunspot wiki 教程启用子字符串匹配会导致问题。
【讨论】:
我按照github.com/sunspot/sunspot/wiki/Wildcard-searching-with-ngrams 上的说明添加了以上是关于如何用 Sunspot 突出显示找到的单词?的主要内容,如果未能解决你的问题,请参考以下文章