個人開発しているアプリにFirestoreを採用して失敗した
フリーランスでエンジニアをしている者です。今回は個人開発しているアプリでの失敗談について書きます。
結論
結論から言うと、開発中のアプリは検索機能を搭載していますが、全文検索機能をFirestoreがサポートしていませんでした。(下調べしていなかった。。。)
何が問題なのか
そもそも検索機能を搭載する際に、想定されていえるだろう挙動は東京と入力されたら、東京を含む文字列が返ってくることだが、Firestoreはその機能をサポートしていないため、工夫を凝らしての実装になってしまいます。
Firestoreの通常のクエリ方法は完全一致だと認識している。なので東京
と検索をかけたら返ってくるものは東京
と言うデータのみになります。
SQLで言うLIKE句的な動作が理想的でした。
SELECT * FROM WHERE name LIKE %東京%
完全一致の状態ですと、検索機能として利便性がかなり乏しいものになってしまうのでこちらの問題を解決する必要が出てきました。
対処方法
現状調べてわかったことでの対策方法をいくつか紹介していきます。
1. 外部サービスの使用
Firestoreの公式ドキュメントを見ると全文検索はサポートされておらず、外部サービスの使用が推奨されています。
こちらの使用方法等は、色んな方々がまとめてくれているのでそちらを参照するのがいいでしょう。
ただ、使用するのに相応の金銭的なコスト、学習コストがかかってしまうため自分のアプリにどのサービスが良いのかを比較して検討するのが良いかと思われます。
2. 辞書データの作成
n-gramというアルゴリズムを用いて、文字を分解したものをFirestoreに保存することです。ただ、1ドキュメントにつき1MBの制限がある、ソートができないためそこまで大きなデータを保存できないことに注意する必要があります。
また、array-contains
は1回しか動作しないと言うことなので、Map型でフィールドを作りクエリを行うようにしたほうが良さそうです。
Firestoreをノーコストで使い続ける尚且つNoSQLの早いクエリを欲するのであればこちらの手法を試すのが良さそうです。
3. RDBにDBを変更する
よほど自分みたいに、無料枠、DBパフォーマンスにこだわりがなければ、MySQL構成のDBを構築しても良いかもしれません。
AWSは登録後最初の一年以内であればRDSの無料枠があるのでそちらを活用するというもの良いかと思います。APIサーバーを建てるなどのコストがかかってしまいますが、Cloud FunctionsやLambdaなどのクラウドコンピューティングサービスを使ってAPIを作るのも良いでしょう。
まとめ
技術として採用する前に下調べが足りなかったため、Firestoreが全文検索を対応していないということに気付かなかったことではありますが無料枠を活用したい気持ちが大きく、しばらくはFirestoreとn-gramを組み合わせた実装で進めていこうと考えています。(次作はおそらくRDSを使う)
間違い、追加情報等があればご指摘・ご共有いただけると助かります!
Discussion