12/08/2018, 17:57

Apply ElasticSearch to search on Rails applications

Full text search là gì? Định nghĩa Full text search có thể hiểu là việc tìm kiếm một chuỗi ký tự cụ thể từ nhiều tài liệu (files) trên máy tính. Khác với "tìm kiếm tên file" và "tìm kiếm chuỗi ký tự trong một file", nó có nghĩa là "tìm kiếm trên nhiều tài liệu, cho tất cả các câu có trong tài ...

Full text search là gì?

Định nghĩa

Full text search có thể hiểu là việc tìm kiếm một chuỗi ký tự cụ thể từ nhiều tài liệu (files) trên máy tính. Khác với "tìm kiếm tên file" và "tìm kiếm chuỗi ký tự trong một file", nó có nghĩa là "tìm kiếm trên nhiều tài liệu, cho tất cả các câu có trong tài liệu".

Phương pháp cắt từ khóa

Là phương pháp để tạo index. (Inverted index) ảnh nguồn: http://siddhumehta.blogspot.com/2014/06/elasticsearch-tutorial-inverted-index.html Morphological analysis(Phân tích hình thái học) Trong ruby thường sử dụng là mecab. Đây là một kỹ thuật để phân chia các câu được viết bằng ngôn ngữ tự nhiên thành các hình thái (đơn vị tối thiểu có ý nghĩa bằng ngôn ngữ). Khi đó, bằng việc tham chiếu thông tin trong từ điển có thể lấy được thông tin như "từ loại", "dạng sử dụng", "cách đọc", ... Việc cập nhật từ điển thường xuyên là điều quan trọng. N-gram Morphological analysis thì yêu cầu có từ điển, còn N-gram là một kiểu cắt các ký tự với số lượng ký tự chỉ định. ảnh nguồn: http://recognize-speech.com/language-model/n-gram-model/comparison

Ví dụ về full text search engine

Có thể biết đến các ví dụ điển hình như là: Apache Solr, elasticsearch, Amazon cloudsearch. Sau khi đọc các bài so sánh giữa những cái bên trên, thì có vẽ như elasticsearch là lựa chọn khá tối ưu.

Elasticsearch

Cài đặt Elastic search trên Cloud 9

Để development và muốn sử dụng gem tìm kiếm, bạn sẽ cần phải cài đặt elastic search.

sudo apt-get --purge autoremove elasticsearch

Sau đó, install mới lại

wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.7.0.deb
sudo dpkg -i elasticsearch-1.7.0.deb

#enable khi khởi động
sudo update-rc.d elasticsearch defaults 95 10

### Start ElasticSearch 
sudo /etc/init.d/elasticsearch start

### Confirm lại
curl http://localhost:9200

Add elasticsearch-rails Gem

Trước khi khởi động Rails Console thì add gem bên dưới vào Gemfile

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

Install bằng bundle install rồi khởi động Rails Console bằng rails c.

tranthitinh:~/workspace/toy_app (modify) $ rails c
Running via Spring preloader in process 2511
Loading development environment (Rails 5.1.4)

Include Elasticsearch::Model

Trước tiên, Include Elasticsearch::Model ở ActiveRecord model class của data muốn xử lý.

> class User::UserSite; include Elasticsearch::Model; end
 => User::UserSite

Gọi User.connection để thiết lập kết nối.

import data vào Elasticsearch

Sử dụng import method để import vào Elasticsearch

> User::UserSite.__elasticsearch__.import
=> 0

Confirm mapping

Trong request tới Elasticsearch thì cần thiết phải có index name và type name nên chúng ta confirm về nó.

>User::UserSite.__elasticsearch__.index_name
"users"
> User::UserSite.__elasticsearch__.document_type
"user"

Vậy là nó đã được đăng ký với type là user của index là users. Biết được tên này thì có thể access được API của Elasticsearch nên hãy thử confirm kết quả import. Có một số cách confirm mapping, nhưng giờ thử sử dụng perform_request

> User::UserSite.__elasticsearch__.client.perform_request(
  :get,
  users/user/_mapping'
).body
=> {"users"=>
  {"mappings"=>
    {"user"=>
      {"properties"=>
        {
         "name"=>{"type"=>"string"},
         "id"=>{"type"=>"integer"},
         "email"=>{"type"=>"string"},
         "title"=>{"type"=>"string"},
         "created_at"=>{"type"=>"date", "format"=>"dateOptionalTime"},
         "updated_at"=>{"type"=>"date", "format"=>"dateOptionalTime"}}}}}}

Đang đăng ký các property dạng integer, string, date

Get số dòng

Tiếp theo, thử xem số lượng record

> User::UserSite.__elasticsearch__.client.perform_request(
  :get,
  'users/user/_count'
).body

Confirm data

Thử xem bên trong của data có id =1

> User::UserSite.__elasticsearch__.client.perform_request(
  :get,
  'users/user/1'
).body

Tham khảo:

http://blog.enogineer.com/2014/12/03/rails-console-elasticsearch/ https://qiita.com/moriyaman/items/373107a3870c33229bac http://y-ken.hatenablog.com/entry/essential-japanese-blogs-for-elasticsearch-study http://gengoro.zoo.co.jp/ http://engineer.wantedly.com/2014/02/25/elasticsearch-at-wantedly-1.html

0