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