Fulltext search sử dụng ElacticSearch trong Rails 5
Bài đăng này đã không được cập nhật trong 3 năm
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
app/controllers/articlescontroller.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. .
All rights reserved