2014-01-22 3 views
2

Я совершенно новый в поиске эластичности. Я установил эластичный поиск в своей системе. на локальном хосте: 9200 он показываетКак использовать elasticsearch в рельсах

{ 
    "ok" : true, 
    "status" : 200, 
    "name" : "Unseen", 
    "version" : { 
    "number" : "0.90.10", 
    "build_hash" : "0a5781f44876e8d1c30b6360628d59cb2a7a2bbb", 
    "build_timestamp" : "2014-01-10T10:18:37Z", 
    "build_snapshot" : false, 
    "lucene_version" : "4.6" 
    }, 
    "tagline" : "You Know, for Search" 
} 

Я включил эти два драгоценных камней в моем файле самоцвета.

gem 'tire' 
gem 'elasticsearch' 

У меня есть модель кино & контроллер называется search_controller.

movie.rb

class Movie < ActiveRecord::Base 
include Tire::Model::Search 
include Tire::Model::Callbacks 
mapping do 
    indexes :title 
end 
def self.search(params) 
     binding.pry 
     tire.search(load: true, page: 1, per_page: 10) do 
     query { string params[:query]} if params[:query].present? 
    end 

миграции для модели фильмов

class CreateMovies < ActiveRecord::Migration 
    def self.up 
    create_table :movies do |t| 
     t.string :title 
     t.timestamps 
    end 
    def self.down 
     drop_table movies 
    end 
    end 
end 

search_controller

class SearchController < ApplicationController 
    def index 
    if(params[:query]).present? 
    @results=Movie.search(params) 
    else 
    @results=[] 
    end 
    end 
end 

view/search/index 
<h1>Search#index</h1> 
<p>Find me in app/views/search/index.html.erb</p> 

<%= form_tag search_index_path, method: :get do %> 
    <p> 
    <%= text_field_tag :query, params[:query] %> 
    <%= submit_tag "Search", name: nil %> 
    </p> 
<% end %> 
<% if @results %> 
<% @results.each do |fetchresults| %> 
<%= fetchresults.title %> 
<%= fetchresults.year %><br/> 
<% end %> 
<% end %> 

routes.rb ресурс: поиск корень 'поиск # индекс'

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

404 : {"error":"IndexMissingException[[movies] missing]","status":404} 
+0

в киномодели, используйте Movie.import и в SearchController используйте параметры Moview.search [: query] – indb

ответ

1

Это было некоторое время, так как я работал с шинами, но с верхней части моей головы:

  • Решение 1: Противопожарные вверх рельсы консоли и сохраните новый объект Movie (например, Move.create(...)). Это может создать индекс для вас, но не уверен.
  • Решение 2: Запустите rake environment tire:import:all в корневой папке проекта. Это должно переинсталлировать все ваши модели в ElasticSearch.

Надеюсь, что это поможет.

Update:

index = Tire::Index.new('oldskool') 
index.delete 
index.create 
+0

Спасибо за ответ Matt. Я уже пробовал их обоих. при попытке их выполнения отображает [ERROR] При создании возвращаемого индекса - elasticsearch возникла ошибка: 500: {"error": "IndexCreationException [[custom-index-name] не удалось создать index]; inested: NoClassDefFoundError [Не удалось инициализировать класс org.elasticsearch.index.codec.postingsformat.PostingFormats]; "," status ": 500} И такая же ошибка для грабли окружающей среды Шина: импорт: все – NamingException

+0

Это сообщение об ошибке в основном говорит о том, что индекс фильмов еще не создан. создайте его программным путем изнутри консоли рельсов ('rails c'): ' index = Tire :: Index.new ('movies') index.delete index.create' – Matt

+0

Есть 3 заявления. Я обновил ответ, комментарий испортил форматирование. – Matt

6

Когда я добавил elasticsearch в моем приложении рельсы я использовал searchkick:

https://github.com/ankane/searchkick

Это действительно дружелюбный и быстро настроить пользователя. Вы можете использовать команду rake searchkick:reindex:all для индексации всех данных.

+0

Я не понял, что он действительно делает, но он работает со мной, спасибо большое. –

Смежные вопросы