Posted at

Searchkickの設定

RailsでSearchkickを使う設定


インストールと設定


基本設定


Elasticsearchをインストール

brewでelasticsearchをインストール

$ brew install elasticsearch


Searchkickをインストール

Gemfileに以下を追記


Gemfile

gem 'searchkick'


ターミナルからgemをインストール

bundle install


Modelに設定を追加


product.rb

class Product < ApplicationRecord

searchkick


インデックスを作成

Product.reindex


関連付けされたデータの追加

product has_many comments があるとした時、以下のように設定することでインデックス対象を設定できます。


product.rb

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したい時の罠

ハマりました

idでorderする場合には配列で囲むとのこと…

order: [{id: :ask}]

https://github.com/ankane/searchkick/issues/203#issuecomment-186176516