12/08/2018, 15:02

Fulltext search sử dụng ElacticSearch trong Rails 5

Cài đặt Elasticsearch Để cài đặt Elasticsearch, bắt buộc máy đã cài JDK, nếu chưa mọi người có thể tham khảo tại https://docs.oracle.com/javase/8/docs/technotes/guides/install/linux_jdk.html. sudo apt-get update Download Elasticsearch tại https://www.elastic.co/downloads/elasticsearch Cài ...

  1. Cài đặt Elasticsearch Để cài đặt Elasticsearch, bắt buộc máy đã cài JDK, nếu chưa mọi người có thể tham khảo tại https://docs.oracle.com/javase/8/docs/technotes/guides/install/linux_jdk.html. sudo apt-get update Download Elasticsearch tại https://www.elastic.co/downloads/elasticsearch Cài đặt: sudo dpkg -i elasticsearch-[VERSION].deb Start ElacticSearch: sudo systemctl start elasticsearch Sau khi cài đặt xong thành công, chúng ta truy cập địa chỉ http://localhost:9200/ 2 Tạo project rails Khởi tạo project rails new elactis cd elactis bundle install rails s Tạo Articles Controller rails g controller articles Thêm resources :articles vào config/routes.rb Code app/controllers/articles_controller.rb
    class ArticlesController < ApplicationController
      def index
        @articles = Article.search(params[:term]).records
      end

      def show
        @article = Article.find_by id: params[:id]
      end

      def new
      end

      def create
      end

      private
      def article_params
        params.permit(:article).permit :title, :content
      end
    end

Tạo model article rails g model Article title:string content:text rails db:migrate 3. Tích hợp ElactisSearch Để sử dụng ElasticSearch, chúng ta sử dụng 2 gem là

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

Tạo controller Search rails g controller search

def index
  if params[:q].nil?
    @articles = Article.all
  else
    @articles = Article.search(params[:q])
  end
end

Thêm get 'search', to: 'search#index' vào config/routes.rb Trong article.rb chúng ta sẽ thêm

require "elasticsearch/model"

class Article < ApplicationRecord
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks
end

app/views/search/search.html.erb:

<h1>Articles 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>
  <% @articles.each do |article| %>
    <li>
      <h3>
        <%= link_to article.title, controller: "articles", action: "show", id: article._id%>
      </h3>
    </li>
  <% end %>
</ul>

Custom Query: Thêm đoạn code sau vào app/model/article.rb

class << self
    def search query
      __elasticsearch__.search(
        {
          query: {
            multi_match: {
              query: query,
              fields: ['title^10', 'text']
            }
          },
          highlight: {
            pre_tags: ['<em>'],
            post_tags: ['</em>'],
            fields: {
              title: {},
              text: {}
            }
          }
        }
      )
    end
  end
  
  
Article.__elasticsearch__.client.indices.delete index: Article.index_name rescue nil

Article.__elasticsearch__.client.indices.create 
  index: Article.index_name,
  body: {settings: Article.settings.to_hash, mappings: Article.mappings.to_hash}

Article.import force: true

Kết quả: Thật tuyệt vời phải không nào.             </div>
            
            <div class=

0