Elastic Search не отображает данные в рельсах

У меня есть модель документа, и я использую эластичный поиск по ней

Моя модель документа выглядит следующим образом

    require 'elasticsearch/model'

    class Document < ApplicationRecord
    include Elasticsearch::Model
    include Elasticsearch::Model::Callbacks
    belongs_to :user

    def self.search(query)
    __elasticsearch__.search(
    {
      query: {
      multi_match: {
      query: query,
      fields: ['name', 'service', 'description', 'tat', 'status']
    }
   },
   highlight: {
    pre_tags: ['<em>'],
    post_tags: ['</em>'],
    fields: {
      name: {},
      service: {},
      description: {},
      tat: {},
      status: {}
    }
   }
   }

  ) 
    end

  settings index: { number_of_shards: 1 } do
  mappings dynamic: 'false' do
  indexes :name, analyzer: 'english', index_options: 'offsets'
  indexes :service, analyzer: 'english'
  indexes :description, analyzer: 'english'
  indexes :tat, analyzer: 'english'
  indexes :status, analyzer: 'english'
  end
  end


 end

 Document.import force: true
 Document.__elasticsearch__.create_index! force: true 

Мой контроллер поиска выглядит следующим образом:

 def search
 if params[:q].nil?
  @documents = []
 else
  @documents = Document.search(params[:q])
 end
 end

Мой вид поиска выглядит следующим образом:

  <h1>Document Search</h1>

  <%= form_for search_path, method: :get do |f| %>
  <p>
  <%= f.label "Search for" %>
  <%= text_field_tag :q, params[:q] %>
  <%= submit_tag "Go", name: nil %>
  </p>
  <% end %>

  <ul>
  <% @documents.each do |document| %>
  <li>
  <h3>
    <%= link_to document.try(:highlight).try(:name) ? 
  document.highlight.name[0].html_safe : document.name,
    controller: "documents", action: "show", id: document._id %>
  </h3>
  <% if document.try(:highlight).try(:description) %>
    <% document.highlight.description.each do |snippet| %>
      <p><%= snippet.html_safe %>...</p>
    <% end %>
  <% end %>
  <% if document.try(:highlight).try(:service) %>
    <% document.highlight.service.each do |snippet| %>
      <p><%= snippet.html_safe %>...</p>
    <% end %>
  <% end %>
  <% if document.try(:highlight).try(:tat) %>
    <% document.highlight.tat.each do |snippet| %>
      <p><%= snippet.html_safe %>...</p>
    <% end %>
  <% end %>
  <% if document.try(:highlight).try(:status) %>
    <% document.highlight.status.each do |snippet| %>
      <p><%= snippet.html_safe %>...</p>
    <% end %>
  <% end %>


 </li>

  <% end %>
 </ul>

Теперь, когда я запускаю запрос с прокатом в качестве значения в имени параметра запроса, он не отображает данные на моей странице поиска, даже если существует запись с именем книги. На запущенном отладчике для моей строки контроллера поиска

  @documents = Document.search(params[:q])

Это то, что я получаю

 <Elasticsearch::Model::Response::Response:0x007fcdde617430 @klass=[PROXY] 
 Document(id: integer, name: string, service: string, stamp_required: boolean, 
 default_price: string, tat: string, automated: boolean, template_url: string, 
 status: string, description: string, priorty: string, user_id: integer, 
 created_at: datetime, updated_at: datetime), @search=#

<Elasticsearch::Model::Searching::SearchRequest:0x007fcdde6175e8 @klass=
[PROXY] Document(id: integer, name: string, service: string, stamp_required:    
boolean, default_price: string, tat: string, automated: boolean, template_url: 
string, status: string, description: string, priorty: string, user_id: 
integer, created_at: datetime, updated_at: datetime), @options={}, 
@definition={:index=>"documents", :type=>"document", :body=>{:query=>
{:multi_match=>{:query=>"Rental Agreement", :fields=>["name", "service", 
"description", "tat", "status"]}}, :highlight=>{:pre_tags=>["<em>"], 
:post_tags=>["</em>"], :fields=>{:name=>{}, :service=>{}, :description=>{}, 
:tat=>{}, :status=>{}}}}}>>

Мне нужно отобразить результат поиска. Что я делаю неправильно?

1 ответ

Решение

Document.__elasticsearch__.create_index! force: true фактически вынужден создать индекс и очистить все записи там.

Есть несколько других способов создания индекса, таких как:

index_klass.__elasticsearch__.client.indices.create(index: 'index_name')

Вы можете передать больше параметров, таких как сопоставления / настройки, но ваши данные всегда будут сохраняться и не затрагиваться!

С уважением

Другие вопросы по тегам