notebook

都内でWEB系エンジニアやってます。

Algolia Rubyクライアントのメジャーバージョン更新のメモ(v3系)

2系から3系に上げたらかなり変更が入っていたようで全然動かなかった

対応した内容のメモを残していく

ドキュメント

Upgrade the Ruby API clients to v3 | Algolia docs

マイグレーション方法が書いてある

init_indexは削除された、その代わりすべてのクライアントのメソッド引数にインデックス名を入れるようになった

ほう…、そりゃ全然動かないな…ということで対応していく

モジュールの読み込み方法

client生成の方法が変わった

-client = Algolia::Search::Client.create(ENV['ALGOLIA_APP_ID'], ENV['ALGOLIA_ADMIN_API_KEY'])  
+client = Algolia::SearchClient.create(ENV['ALGOLIA_APP_ID'], ENV['ALGOLIA_ADMIN_API_KEY'])

list_indexのメソッド名

-puts client.list_indexes.to_json  
+puts client.list_indices.to_json

Ruby Clientで使えるメソッド

新たに使えるようになったメソッドなどもあるようなので一通り試してみる

Helper methods | Algolia docs

この辺を見るのがよいのかな

これくらいしか参考になりそうなのが見つからない

レコードのSave

require 'algolia'
require 'awesome_print'

def main
  client = Algolia::SearchClient.create(ENV['ALGOLIA_APP_ID'], ENV['ALGOLIA_ADMIN_API_KEY'])
  record = [{ objectID: "object-1", name: "test record" }]
  index = 'sandbox'

  client.save_objects(
    index,
    record
  )
end

main

全件洗いがえ

require 'algolia'
require 'awesome_print'

def main
  client = Algolia::SearchClient.create(ENV['ALGOLIA_APP_ID'], ENV['ALGOLIA_ADMIN_API_KEY'])
  record = [{ objectID: "object-1", name: "test record!" }, { objectID: "object-2", name: "test record2" }]
  index = 'sandbox'

  client.replace_all_objects(
    index,
    record,
    1000,
  )
end

main

以前はなかった気がする、前のコードはDeleteしてからSaveしてた

前回更新時からSave対象のレコードが削除された場合もしっかり対応してくれている(消えるべきレコードが消えている)

第3引数はバッチサイズとのことで、件数が多い場合は内部的にリクエストを分割してくれているということかな、使う側でハンドリングしなくてよいのは助かる

デフォルトが1000だった、自分のケースは500件もないので特に指定しなくても良いんだけど一応指定しておいた

実行自体はちょっと時間掛かったけど普通に完了した

set_settings

インデックスの設定更新も行っていたためこちらも変更が必要となった

ドキュメントには載っていなかったがset_settingsは残っていそう…

コード

algoliasearch-client-ruby/lib/algolia/api/search_client.rb at a1b1b93bffec2666f78979697d12ce128da11299 · algolia/algoliasearch-client-ruby

マイグレーション内容を加味し、書いてみたが普通にハッシュ渡しただけだとエラーになった、リクエストがおかしいって内容だったのでIndexSettingsのインスタンスを生成すれば良さそう…?

algoliasearch-client-ruby/lib/algolia/models/search/index_settings.rb at a1b1b93bffec2666f78979697d12ce128da11299 · algolia/algoliasearch-client-ruby

algoliasearch-client-ruby/lib/algolia/models/search/index_settings.rb at a1b1b93bffec2666f78979697d12ce128da11299 · algolia/algoliasearch-client-ruby

サーッと色々コード読んでたらindex_settings.rbbuild_from_hashというクラスメソッドを見つけたのでこれかな? ということで下記のコードになった

  • indexSettingsの更新
require 'algolia'
require 'awesome_print'

def main
  client = Algolia::SearchClient.create(ENV['ALGOLIA_APP_ID'], ENV['ALGOLIA_ADMIN_API_KEY'])
  record = [{ objectID: "object-1", name: "test record!!" }, { objectID: "object-2", name: "test record2!!" }]
  index = 'sandbox'

  client.set_settings(
    index,
    Algolia::Search::IndexSettings.build_from_hash(
      {
        attributesToSnippet: ['text:50'],
        attributesForFaceting: ['tags'],
        attributeForDistinct: 'section',
        distinct: true,
      }
    )
  )
end

main

実行し、すべて管理画面上から反映されたことが確認できた

おわり

そんなに大したスクリプトを作っていたわけでもなかったけど結構変更があったのでほぼ書き直しって感じだった

これに限らずAlgoliaはどのライブラリも破壊的変更ガンガン入れてくるからつらいなーっていう気持ちがある…