13
6

More than 3 years have passed since last update.

Searchkickの設定

Last updated at Posted at 2018-12-07

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

※2020/12/12追記
Searchkick4.4.2だと [] 無しでも動くことを確認しました。
ですが、 _id カラムに変換されdeprecatedになってしまうため [] ありの方が適切そうです。
検証コメント
https://qiita.com/akinov/items/e29c3f3802c3d7ef5ac5#comment-6897e5b1bb349b2bdd86
※追記ここまで

ハマりました
idでorderする場合には配列で囲むとのこと…

order: [{id: :ask}]

13
6
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
6