☺️

【全文検索】Firebaseで全文検索ができるようになったよ!!

2024/04/10に公開

前提事項

今回紹介するベクトル検索ですが、正式なリリースまだされておらず、
プレビュー版のようです。

料金について

Cloude Function、Firestore、Vertex AIの利用には料金が発生します。
詳しくはGoogle Cloudを参照ください。

Vertex AIについては以下を参照ください。
今回利用しているAIは「テキスト用エンベディング」に該当します。
https://cloud.google.com/vertex-ai/generative-ai/pricing?hl=ja

記事の内容

この記事は、「Firestoreで全文検索ができそう」ということと、
実際にどのようにやったか、やってみた結果をご紹介するものです。

より詳しいコードや手順はこちらに掲載していますのでご参考ください。
https://flutterdevelop.blog/vector-search/

大まかな手順

ベクトル検索についての説明は割愛します。
ベクトル検索に使用するベクトル値の計算には「Vertex AI」を使用しました。

また、現在はPython又はJavaScript(Node.js)でしかベクトル検索行えません。
そのためアプリ等からGoogle Cloud Functionをキックして検索を行う必要があります。

以下手順を実施し、ベクトル検索を行いました。

  1. Google Cloud Functionの作成
  2. Vertex AIの設定
  3. ベクトルの取得
  4. インデックスの作成
  5. Firestoreでのベクトル検索の実施コード

ベクトル値の算出

以下のようにデータとそのデータのベクトル値をFirestoreへ登録します。

インデックスの作成

次にインデックスを作成します。
手順は以下公式ページに掲載されています。
https://firebase.google.com/docs/firestore/vector-search

以下のようにインデックスが作成されます。

ベクトル検索につかうテストデータの準備

今回は私のブログ記事の要約内容をデータとして準備しました。
全文表示すると多いので一部省略しています。

No データ
1 freezed.dartが作成されない時の対処方法 freezedを使用してイミュータブルなクラスを設計する際に、 ターミナルで「…
2 Flutterのpubspec.yamlとは?意味や書き方をご紹介!! YAMLはYAML Ain't Markup Languageの略で、 データを簡潔に表…
3 アプリ開発でよく聞くMVVMとは何か? MVVM(Model-View-ViewModel)とは、 アプリのロジックとUI(ユーザーインターフ…
4 Flutterとは??Flutterの概要を説明 「Flutter」について、"モバイルアプリを開発する場合に便利!"という認識は あ…
5 Riverpodとは?Flutterの一番メジャーな状態管理を紹介!! 以前紹介した「StatefulWidget」も状態管理を行う機能の1…

ベクトル検索の実行

以下公式ページに記載の手順に沿って、ベクトル検索を実施します。
https://firebase.google.com/docs/firestore/vector-search

#ベクトル検索のコード例
docs = collection.find_nearest(
  vector_field="embedding_field",
  query_vector=embedding_vector,
  distance_measure=DistanceMeasure.COSINE,
  limit=3
).get()

今回は「Riverpodについて」という検索ワードで検索してみたところ、
以下の順でドキュメントから値を取得することができました!!

No データ
1 Riverpodとは?Flutterの一番メジャーな状態管理を紹介!! 以前紹介した「StatefulWidget」も状態管理を行う機能の1…
2 Flutterとは??Flutterの概要を説明 「Flutter」について、"モバイルアプリを開発する場合に便利!"という認識は あ…
3 アプリ開発でよく聞くMVVMとは何か? MVVM(Model-View-ViewModel)とは、 アプリのロジックとUI(ユーザーインターフ…

最後に

サードパーティ製のツールを使うしかなかったFirestoreの全文検索でしたが、
ついにその悩みが解消されそうです!!

取得されるドキュメントの順序は類似度の近いものから順に取得されていそうです。
ただ今回はデータ数が少なかったため、検索精度を確かめることはできませんでした。

作成されるベクトルのデータサイズは試算で約3KB(768次元×float(4byte))でした。
1ドキュメントあたりのサイズは最大1MBのため少し大きくも感じます。

Discussion