Как выделить слово с Sunspot? - PullRequest
       23

Как выделить слово с Sunspot?

5 голосов
/ 23 августа 2011

Я хочу выделить найденные слова в тексте, например, как показано здесь .

Насколько я знаю, я должен выполнить следующие шаги:

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

Но он не работает должным образом, он всегда выделяет первое слово заголовка, даже если искомое слово находится в конце его.

Есть ли более простой способ сделать это?

Ответы [ 3 ]

1 голос
/ 27 декабря 2013

Я наткнулся на это в поисках решения для рендеринга бликов с помощью поиска солнечных пятен на виде рельсов.

Я не нашел нигде готового решения, поэтому использовал часть этого поста, чтобы сделать один измой один.Я довольно плохо знаком с рельсами, так что это может быть не совсем путь RoR.

В моем случае я выполнил полнотекстовый поиск по двум полям, назвав их notes и description.

Для того, чтобы иметь возможность рендерить в html блики, я ввел хэш значений, содержащий идентификатор записи, имя столбца и его выделенное значение, соответствующим образом отформатированные.Это позволяет мне выделять результаты поиска в разных полях.

entry.rb:

searchable do
    text :description, :stored => true
    text :notes, :stored => true
end

records_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 %>

Обратите внимание, что я создал определение css для разметки <result>, чтобы сделать текст заметным.

1 голос
/ 14 января 2014

Код хорошо подходит для выделения первого подходящего слова в заголовке, так как у меня похожий код.Вы пытались перестроить свой индекс solr и перезапустить серверы?

Кроме того, можете ли вы попытаться вернуть ваш solrconfig.xml к его значениям по умолчанию?У кого-то возникла похожая проблема после изменения файла solrconfig.xml, Ref https://groups.google.com/forum/#!searchin/ruby-sunspot/highlight/ruby-sunspot/kHq0Dw35UWs/ANIUwERArTQJ

Если вы хотите переопределить опцию выделения в solrconfig.xml, выполните поиск max_snippets на этом сайте http://outoftime.github.io/.Вы можете попробовать варианты, такие как

highlight :title, :max_snippets => 3, :fragment_size => 0  # 0 is infinite
0 голосов
/ 14 сентября 2011

Вы используете поиск по подстроке? У меня возникла та же проблема, и я понял, что включение соответствия подстроки с помощью следующего вики-руководства sunspot привело к проблеме.

...