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')
Вы можете передать больше параметров, таких как сопоставления / настройки, но ваши данные всегда будут сохраняться и не затрагиваться!
С уважением