概要
全文検索のSaasであるAlgoliaを使ってみました。
本記事では使用にあたり調べたことを記載します。
Algoliaを触り始めるにあたっての参考になれば
用語
- Application
- 最も大きな管理単位
- indexの集まり
- index
- 検索対象となるデータベース
- Object
- index内の1件のデータ。JSON形式
- Record
- オブジェクトとほぼ同義
- attributes
- オブジェクト内の各フィールド(title, priceとか)
料金
主な料金は「検索回数」「(DBの)レコード数」で決まる。
- 検索回数
- 検索1000回毎に0.5$
- 月間1万回まで無料
- レコード数
- 1000件毎に0.4$
- 10万件まで無料
使い方
index(検索DB)を作りたい
管理画面からCSVやJSONをアップロードするだけ、更新する時も同じ方法
検索APIを作りたい
indexを作ると自動的にAPIも作られる
検索対象を指定したい
- デフォルトではindex内の全てのattributesが検索対象になっている
- 例えば、画像URLなどを検索対象から外したい場合などに検索対象を特定attributesに指定する
- 「Configuration > Searchable attributes」から設定する
ソートを設定したい
「Configuration > Ranking and sorting」から設定する
設定できるソート項目には以下の種類がある(画像赤枠)
- SORT-BY
- 厳密なソート
- 任意のattributesを設定可能
- TEXTUAL、CUSTOM RANKINGより優先して並べ替えられる
- TEXTUAL
- 入力ワードにどれだけ検索対象のObjectがマッチしたかの関連度
- 高いほど検索上位に表示される
- 任意の項目を追加することはできない
- CUSTOM RANKING
- TEXTUALの次に適応されるソート順
- 任意のattributesを設定可能
- TEXTUALのスコアが同じだった場合、CUSTOM RANKINGが適応される
検索結果の並び替えロジック
Algoliaはタイブレーキングという並び替え方式を使っている
イメージとしては、よくある「第1ソート」「第2ソート」と同じ考え方で合っていると思う
例えば、下記の設定だった場合、日付が同じレコードのみ価格で並べ替えられる動きになる
- 第1ソート: 日付
- 第2ソート: 価格
これは、前述のTEXTUAL(関連度)も同じで、以下設定だった場合、typo→word→exactの順で並び替えが行われる
- typo (誤字が少ない順)
- word (マッチしている文字が多い順)
- exact(完全一致した単語が多い順)
参考
https://blog.tatsuroh.com/2020-12-02/algolia-ranking-explained
絞り込み項目を設定したい
- 検索APIのfiltersパラメータを使う
- 特に事前設定は必要ない
件数付きのフィルターを作りたい
以下赤枠のように件数付きのフィルターを作成したいニーズがあると思う
こういったフィルターを作りやすくするために、AlgoliaにはFacetsという機能がある。
- 「Configuration > Facet > Attributes for faceting」からfacets登録するattributesを追加する
- Facetsに登録されたattributesは、値と件数をAPIから取得できるようになる
例
indexに以下のオブジェクトを登録し
このうちのtagsをfacetsに設定したとする
[
{
"title": "ファイナルファンタジーX",
"tags": ["スクエニ", ”RPG”, "PS2", ]
},
{
"title": "ドラゴンクエスト7",
"tags": ["スクエニ", ”RPG”, "PS" ]
}
{
"title": "キングダム ハーツ",
"tags": ["スクエニ", ”アクション”, "PS2", ]
}
]
facetに登録したattributesは、以下のように検索APIレスポンスのfacetsに含まれるようになり
indexに存在する値とその件数が返ってくる
{
"facets": {
"tags": {
"スクエニ": 3,
"RPG": 2,
"アクション": 1,
"PS2": 2,
"PS": 1,
}
},
"hits": {...},
}
感想
良いところ
- 導入・運用がとても簡単
- 検索速度が速い
微妙なところ
- インクリメンタルサーチの場合、料金が高くなる可能性あり
- 厳密な仕様を把握するのが大変
- 検索のコアとなる仕様は変更不可
向いている使い方
- サクッと検索機能を作りたい
- 細かい仕様は気にしない
検討が必要な使い方
- インクリメンタルサーチ形式にしたい => コストの問題
- 検索ロジックを正確に把握したい => ドキュメントはあるが把握が大変
- 検索ロジックを変更したい => Saasなのでコア機能は変えられない