2015-11-21 2 views
1

Я установил Searchkick и Elasticsearch в первый раз.Выделите с Searchkick и Elasticsearch

У меня есть основы работы и я пытаюсь включить функцию highlight.

Индекс:

<%= form_tag books_path, method: :get do %> 
     <%= text_field_tag :q, nil %> 
    <% end %> 
    <div class="row"> 
     <div class="col-md-8"> 
     <% @books.each do |book| %> 
      <div class="media"> 
      <div class="media-body"> 
       <h4 class="media-heading"> 
       <%= link_to book.title, book %> 
       </h4> 
       <small> 
       <%= book.description %> 
       </small></br> 
       <% if policy(book).edit? %> 
       <%= link_to 'Edit', edit_book_path(book) %> 
       <% end %> 
      </div> 
      </div> 
     <% end %> 
     <%= paginate @books %> 
     </div> 
     <div class="col-md-4"> 
     <% if policy(Book.new).create? %> 
     <%= link_to "New Book", new_book_path, class: 'btn btn-success' %> 
     <% end %> 
     </div> 
    </div> 

Контроллер

 def index 
      query = params[:q].presence || "*" 
      @books = Book.search(query, field: [:title], highlight: {tag: "<strong>"}) 
      authorize @books 
     end 

Модель

class Book < ActiveRecord::Base 
     require 'elasticsearch/model' 
     searchkick highlight: [:title, :description] 

Что мне не хватает?

ответ

2

Я понял, как выделить с помощью Searchkick.

Во-первых, включите поиск в своей модели. Например:

class Book < ActiveRecord::Base 
searchkick highlight: [:description] 
end 

Во-вторых, укажите поля подсветки в вашем контроллере. У меня есть отдельный контроллер поиска для нескольких моделей.

class SearchesController < ApplicationController 
     def index 
     @book_searches = Book.search(params[:query], operator: "or", fields: [:description], highlight: {tag: "<strong>", fields: {description: {fragment_size: 100}}}) 
     @chapter_searches = Chapter.search(params[:query], operator: "or", fields: [:body], highlight: {tag: "<strong>", fields: {body: {fragment_size: 100}}}) 
     end 
    end 

В-третьих, включите функцию выделения в свой индексный индекс поиска.

<% @book_searches.with_details.each do |book_search, details| %> 
     <% if book_search.class == Book %> 
     <h3><%= link_to book_search.title, [book_search] %></h3> 
     <p><%= simple_format details[:highlight][:description] %></p> 
     <% end %> 
    <% end %> 

Не забудьте использовать with_details в каждом цикле.

+0

Ваше решение отлично работает. Спасибо за подробное описание. – codingbear