0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Firestoreでテキスト検索がプレビュー公開

2026/4/20のアップデートでFirestoreにテキスト検索が追加されました。

個人的には、かなり便利なアップデートだと思います。
下記記事で作成したベビー用品レビューサイトを改造して試してみました。
なお、ベビー用品レビューサイトは公開していないので、データはすべて私が適当に作ったものです。

Firestoreのテキスト検索は、記事投稿日(2026/6/7)時点でプレビューです。
GAまで仕様が変わる可能性があるのでご了承ください。

作成した機能

ヘッダーの検索用テキストボックスにプルダウンを追加し、検索対象として商品名レビューを選択できるようにしました。

image.png

レビューを選択した状態で検索をするとFirestoreに保存されたレビューコメントに対して部分一致で検索を行い、合致したレビューコメントを含む商品が表示されます。

例えば、哺乳瓶で検索した結果は以下の通りです。

image.png

複数キーワードによるAND検索をしたいときは単語間をスペースで区切ります。

image.png

一部のキーワードは「含まない」という意味で使用したいとき、対象の検索キーワードの前に-をつけます。

image.png

-付きの検索では、-の前の文字が全角スペースだとうまく検索できませんでした。
この挙動はGAすることにはもしかしたら変更されているかもしれませんね。
なお、普通の「含む」によるAND検索では、スペースは全角でも半角でも同じ動きでした。

Firestoreのテキスト検索を用いた実装

テキスト検索可能なFirestore DBを作成

テキスト検索はEnterprise Editionのみで提供されています。

StandardからEnterpriseには昇格できません。
Standardで作成済みのDBは新たに作成したEnterpriseのDBにデータ移行が必要になります。
また、StandardとEnterpriseでは課金体系が異なるためご注意ください。

以下のように作成しました。

image.png

検索インデックスの作成

テキスト検索対象のコレクションに対して検索インデックスを作成しておく必要があります。
今回はtitle,pros,consの三つの項目によるインデックスを作成します。

検索インデックスはインデックスとは別物なので注意が必要です。
image.png

image.png

「クエリの範囲」は「コレクション」にする必要があります。

レビューコメントに対するテキスト検索の実装

@google-cloud/firestorePipelinesを使って実装します。
search関数のqueryに検索文字列を引数として与えたdocumentMatchesを指定することで利用可能です。
また、sort: score().descending(),を指定することで一致度順に表示できます。

    searchText: async (searchQuery: string): Promise<DbReview[]> => {
      console.log(`[DEBUG] review.searchText called with query: ${searchQuery}`);
      try {
        // ★テキスト検索の実行はここから★
        const { documentMatches, score } = Pipelines;
        const snapshot = await firestore.pipeline().collection("reviews").search({
          query: documentMatches(searchQuery),
          sort: score().descending(),
        }).execute();
        // ★ここまで★

        // 以下、検索結果の取得
        const docs = snapshot.results;
        const result = docs.map((doc) => ({ id: doc.id, ...doc.data() })) as DbReview[];

        console.log(`[DEBUG] review.searchText native search succeeded. Found ${result.length} reviews.`);
        return convertTimestamps(result);
      } catch (error) {
        // 割愛
      }
    },

Google CloudコンソールのFirestore Studioでもクエリを試すことができます。
手っ取り早くお試しするならこちらが便利です。
image.png

以上で完成です。お手軽ですね!

Firestoreにテキスト検索がない場合にどう実装するか

従来のFirestoreにはテキスト検索がなかったため、外部の全文検索サービスを利用するのが一般的だったと思います。
例えば、ElasticSearchを利用する場合の構成は以下のようになります。

using-elasticsearch.drawio.png

Firestoreにドキュメント書き込みを行った際に、イベントトリガーでCloud Run Functionsを起動し、ElasticSearchにも検索対象項目を書き込みます。
これでも十分に機能しますが、Cloud Run Functionsによる書き込みが失敗したケースや遅延したケースの考慮が必要な場合は難しくなります。
また、利用するサービスが増えるのでコストがかかります。

Firestoreでテキスト検索ができるようになることで、作り物を減らせるだけでなく、異常系に関する考慮事項を減らせる点がうれしいですね。

Firestoreのテキスト検索がGAしたら外部の全文検索サービスは不要になるのか

簡単な要件では不要になると思います。
一方で、複雑な検索条件のケースでは必要なままだと考えています。
たとえば、ANDとORが組み合わされた検索条件や同音異義語による検索、意味的検索等をしたいケースではFirestoreのテキスト検索では対応できません。
実現したい機能に応じて外部の全文検索サービス要否を見分けていくことになると思います。

まとめ

今回はFirestoreのテキスト検索を利用してみました。
とても手軽にテキスト検索を実装できました。
少量のデータでしか試していないので、大量のデータで低コスト・低レイテンシに動作するのかは気になるところです。
ただ、現時点ではプレビューなので機能面・非機能面共にこれからまだ修正が行われるかもしれません。
利用シーンはとても多いと思うのでGAが待ち遠しいですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?