Sử dụng Elasticsearch trong Rails với gem SEARCHKICK (Phần 2)
I. Pagination Trước hết ta cài gem will_paginate add vào Gemfile gem “will_paginate” Sửa trong controller @products = Product . search params [ :query ] , page : params [ :page ] , per_page : 10 Sửa trong view < % = will_paginate @products % ...
I. Pagination
Trước hết ta cài gem will_paginate
add vào Gemfile
gem “will_paginate”
Sửa trong controller
@products = Product.search params[:query], page: params[:page], per_page: 10
Sửa trong view
<%= will_paginate @products %>
II. Partial Matches
Mặc định, kết qủa trả về phải phù hợp với tất cả các từ trong truy vấn.
Product.search "phong henry" # phong AND henry
Ta có thể thay đổi:
Product.search "phong henry", operator: "or" # phong OR henry
Theo mặc định, kết qủa trả về phải phù hợp với toàn bộ từ. Ví dụ ta tìm từ phong thì từ phonghenry sẽ không phù hợp. Để thay đổi, ta sử dụng:
searchkick word_start: [:name]
Reindex lại, rồi thay đổi trong controller
Product.search "phong", fields: [{name: :word_start}]
III. Indexing
Để kiểm soát dữ liệu được đánh index ta sử dụng hàm search_data. Gọi Product.reindex sau khi thay đổi hàm.
class Product < ActiveRecord::Base def search_data as_json only: [:name] { name: name } end end
IV. Khi nào cần reindex
Ta cần chạy reindex khi:
- Cài đặt và thay đổi searchkick
- Thay đổi hàm search_data
- Thay đổi hàm searchkick
Khi khởi động app thì không cần reindex
V. Mapping
Ta sử dụng mapping để định dạng lại kiểu và cách phân tích từ cho từng trường.
class Product < ActiveRecord::Base searchkick mappings: { product: { properties: { name: {type: "string", analyzer: "keyword"} } } } end
Sau đó reindex và thay đổi trong controller:
products = Product.search query: {match: {name: params[:query]}}
Để giữ cả cài đặt sẵn có của Searchkick và mapping mới viết ta sửa như sau:
class Product < ActiveRecord::Base searchkick merge_mappings: true, mappings: {...} end