Search code examples
ruby-on-railselasticsearchelasticsearch-railselasticsearch-ruby

Elastic Search not displaying data in rails


I have a document model and I am using elastic search on it

My document model is as Follows

    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 

My search Controller is as follows:

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

My search view is as follows:

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

Now when I run a query with rental as the value in the query params name, it does not display the data on my search page even though the record with name book exists. On Running debugger for my search controller line

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

This is what I get

 <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=>{}}}}}>>

I need to display the search result. What am I doing wrong?


Solution

  • Document.__elasticsearch__.create_index! force: true actually forced to create index and clear all records there.

    There are some other ways to create index like :

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

    You can pass more options like mappings/settings but your data will be always persisted and not-touched !

    Regards