ben

OMÜ , Bilgisayar Mühendisliği, 13'

10 Ocak 2016 Pazar

elasticsearch

Modeldeki verileri indexleyerek arama işlemini yapan bir gem. Burda cok basit olarak  kullanımı ve arama işlemini yapacağız. Burdaki projede bulunan movie modelim üzerinden arama işlemini yaptıracağım.


gem:

gem 'elasticsearch-rails'
gem 'elasticsearch-model'



movie.rb

   def as_indexed_json(options={})
     self.as_json(only: [:name, :director])
  end

=> eğer movie modelim başka bir modelle ilişkili olsaydı ve o alanlardada arama yapmak isteseydik bu kod şöyle olacaktı.


  def as_indexed_json(options={})
      self.as_json(only: [:name,:director],
                   include: { player: { only: [  name:],
                       include: { player_profile: { only: [:country] } }
                     }
                 })
  end
Biraz saçma bi ilişki oldu ama örnek vermesi açısından..:)
movie modelimiz  oyuncular modeline bağli oyuncularda kendi profillerine
bu modele göre arama yaptığımız kelimeyi, filmin adında, yapımcısında, oyuncularda ve oyuncuların sehirlerine bakarak arayacak ve herhengi bir alanla eşleşirse o veriye ait film bilgisini getirecek

biz sadece movie filminin adını ve yapımcısına bakarak arama yapmasını sağlayıp devam edelim


index.html sayfamıza arama yapmak için alan ekleyelim

<%=form_tag movies_path, method: :get ,  :role => 'form' do%>
<p>
  <%=text_field_tag :q, params[:q],placeholder: 'Arama yapın...'%>
  <%=submit_tag "Ara"%>
</p>
<%end%>


index sayfamız şu şekilde:



movie_controller.rb index methodumuza gelelim

  def index
    @movie = Movie.all
   if params[:q].present?
      @movies =  @movie.search(query: { query_string: {query: "*#{params[:q]}*"}}).records
    else
      @movies =  @movie
    end
  end


=> burda willpaginate kullanmadık. eğer verilerimiz will paginateli olsaydı bu kodlar şöyle olurdu

  if params[:q].present?
      @movies = @movie.search(query: { query_string: {query: "*#{params[:q]}*"}}).page(params[:page]).records
    else
      @movies = @movie.paginate(page: params[:page], per_page: 15).order(name: :asc)
    end


=>  eğer translate kullandıysak(globalize)  @movie değişkenini şu şekilde oluşturmamız gerekirdi

  @movie = Movie.includes(:translations)


Şimdi çalıştırıp bakalım



 name alanında arama



yapımcı alanında arama