firestoreで全文検索を実現する方法の一つとして、Algoliaの導入が考えられます。
Firestoreでは、全文検索をサポートしておりません。
公式でも、外部の検索サービスの使用が推奨されています。
全文検索|Firebase
本記事では、これだけ押さえておけば簡単に検索機能が実装できるポイントをまとめてみます。
#Search with Algoliaの導入
まずは、FirestoreとAlgoliaのデータを同期させる必要があります。
従来では、Cloud Functionsを用いて、Firestoreの変更を検知し、Algoliaにデータを渡す必要がありました。
現在は、Firebase ExtensionsにSearch with Algoliaがリリースされており、簡単にFirestoreとAlgoliaの連携が可能です。
Search with Algoliaの導入は他記事に丸投げします。下記記事で丁寧に解説されています。
超お手軽にFirestoreに全文検索を導入できるSearch with Algoliaを試してみた
Search with Algoliaはまだβ版であるのと、拡張性に疑問点があるので、開発中のアプリによってはCloud Functionsの使用を検討して下さい。
##補足
Seach with Algoliaの拡張機能の構成において、Indexable Fieldsを任意に設定することができます。任意ではあるのですが、Indexable Fieldsを設定しておかないと、「Record is too large」というエラーで弾かれる可能性があります。
どうもAlgoliaに登録できるレコードサイズはかなり少ない模様です。
そのため、検索対象のデータに限定してAlgoliaに渡す必要があります。
レコードサイズの目安としては、ドキュメントの下記部分が一つの参考になります。
Reducing Record Size|Algolia
Algoliaには、あくまで検索対象のデータを格納するのが無難です。
よって検索後の表示に必要なデータも併せてAlgoliaに格納することは難しいです。
Algoliaで検索した後、表示に必要なデータは改めてFirestoreから持ってくる必要があります。
#Algoliaの基本的な使い方
Javascriptで記述していきます。
ドキュメントの下記あたりから抜粋しています。
Algoliaドキュメント
###データの取得
Algoliaからのデータの取得
index.search('検索キーワード', {
page:0 //ページネーションのため
}).then(({ hits }) => {
console.log(hits);
});
index.search('検索キーワード',query)が基本構文です。
ページネーションについては後述します。
Algoliaドキュメント
また、処理を行うJSファイルの任意の箇所に下記コードを記述しておきます。
'YourApplicationID'、 'YourSearchOnlyAPIKey'、'indexName'は各自のAlgoliaサイトの「API Key」から入力します。
const client = algoliasearch('YourApplicationID', 'YourSearchOnlyAPIKey');
const index = client.initIndex('indexName');
またAlgoliaコンソール上で検索対象のデータを指定するのを忘れないようにしましょう。
###ページネーション
ページネーションの実装は非常に簡単です。
デフォルトでは、1ページで20件ヒットします。
index.search('検索キーワード', {
page:0 //1~20件目がヒット
//page:1なら、21~40件がヒット
}).then(({ hits }) => {
console.log(hits);
});
pageの値を変数で管理すれば、ページネーションが簡単に実装できそうです。
ヒット数は下記画面部分で任意に指定する事ができます。
##ソート機能
ソート機能は、Algoliaのコンソール上で設定することが可能で、index.serachで呼び出すと勝手にソートしたデータを取得してくれます。
##最後
データの取得、ページネーション、ソートが出来れば、最低限の検索機能が実装できるのではないでしょうか。
その他にも、ユーザーランキングや検索対象のハイライトなどの機能も簡単に実装できそうです。
私が個人開発したアプリでもAlgoliaを用いた全文検索機能を実装しておりますので、もし良ければデモ用にご利用下さい。