12/08/2018, 13:33

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

1.png

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

2.png

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}]

3.png

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.

0