RailsでSearchkickを使う設定
インストールと設定
基本設定
Elasticsearchをインストール
brewでelasticsearchをインストール
$ brew install elasticsearch
Searchkickをインストール
Gemfileに以下を追記
gem 'searchkick'
ターミナルからgemをインストール
bundle install
Modelに設定を追加
class Product < ApplicationRecord
searchkick
インデックスを作成
Product.reindex
関連付けされたデータの追加
product
has_many comments
があるとした時、以下のように設定することでインデックス対象を設定できます。
def search_data
as_json(
only: [:id, :name], # productで検索対象にしたいカラム名
include: {
comments: { only: [:id, :body] } # commentで検索対象にしたいカラム名
})
end
使い方
簡単な検索
apples
という文字を含むレコードを検索
products = Product.search("apples")
products.each do |product|
puts product.name
end
クエリの使い方
ActiveRecordライクに書けます
Product.search("apples", where: {in_stock: true}, limit: 10, offset: 50)
fieldsを指定することで検索するカラムを指定できます
fields: [:name, :brand]
where
gt
, lt
, gte
, lte
で大なり小なりや
not
で否定
正規表現なども使えます
where: {
expires_at: {gt: Time.now}, # lt, gte, lte also available
orders_count: 1..10, # equivalent to {gte: 1, lte: 10}
aisle_id: [25, 30], # in
store_id: {not: 2}, # not
aisle_id: {not: [25, 30]}, # not in
user_ids: {all: [1, 3]}, # all elements in array
category: /frozen .+/, # regexp
_or: [{in_stock: true}, {backordered: true}]
}
関連付けされたデータの検索
product
has_many comments
の場合
キーに関連するリレーション名(has_oneの場合は単数)を入れる必要があります。
where {
'comments.id': 1
}
Order
orderはActiveRecordとほぼ同じ。
頭の_
無くても動きます
order: {_score: :desc} # most relevant first - default
idでorderしたい時の罠
※2020/12/12追記
Searchkick4.4.2だと []
無しでも動くことを確認しました。
ですが、 _id
カラムに変換されdeprecatedになってしまうため []
ありの方が適切そうです。
検証コメント
https://qiita.com/akinov/items/e29c3f3802c3d7ef5ac5#comment-6897e5b1bb349b2bdd86
※追記ここまで
ハマりました
idでorderする場合には配列で囲むとのこと…
order: [{id: :ask}]