Sử dụng Elasticsearch trong Rails với gem SEARCHKICK (Phần 2)
Bài đăng này đã không được cập nhật trong 3 năm
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
. VI. Tài liệu tham khảo
All rights reserved