如何用 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 方式。

就我而言,我对两个字段进行了全文搜索,分别称为 notesdescription

为了能够将高亮显示为 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 %>

请注意,我为 &lt;result&gt; 标记创建了一个 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 上的说明添加了 过滤器。那里的注释说,“人们也可以使用 NGramFilterFactory 进行子字符串搜索,而不是前/后缀搜索。”我仍然遇到与@zolter 相同的问题。关于我可以做些什么不同的任何想法? 我刚刚点击了这个链接:github.com/sunspot/sunspot/wiki/…,它成功了。

以上是关于如何用 Sunspot 突出显示找到的单词?的主要内容,如果未能解决你的问题,请参考以下文章

静态 HTML 页面中的 JQuery 搜索,突出显示找到的单词

基于正则表达式在闪亮的 DT 中突出显示单词

VS 代码 - 在小地图中突出显示选定的单词

Qt突出显示选定的行会覆盖单个单词的突出显示

Javascript:如何检测单词是不是突出显示

Solr 不突出显示某些单词