Data Connect で全文検索を実行する

Firebase Data Connect は、PostgreSQL を利用した全文検索をサポートしています。全文検索を使用すると、複数の列でキーワードやフレーズを一度に検索して、大規模なデータセット内の情報を迅速かつ効率的に見つけることができます。

サービスに全文検索を追加できます。まず、検索対象にするスキーマの String@searchable ディレクティブを追加します。次に例を示します。

type Movie
  @table {

  # The fields you want to search over
  title: String! @searchable
  genre: String @searchable
  description: String @searchable
  tags: [String]

  # Some other fields that we won't search over
  rating: Float
  imageUrl: String!
  releaseYear: Int
}

このディレクティブを追加すると、クエリに <pluralType>_search フィールドを追加して全文検索を実行できます。この場合、movies_search になります。

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    imageUrl
    releaseYear
    genre
    rating
    tags
    description
  }
}

全文検索結果を調整する

@searchable ディレクティブと _search フィールドに引数を追加して、全文検索結果を調整できます。

共有引数

検索結果は、基本的なリスト フィールド <pluralType> で使用される引数の多くを使用して制御できます。

  • order を使用すると、結果の順序を変更できます。省略すると、結果は関連性の高い順に並べ替えられます。
  • where を使用すると、検索にフィルタを追加できます(特定のジャンルの映画のみを検索するなど)。
  • limit を使用すると、クエリは上位 X 件の結果のみを返します。
  • offset を使用すると、クエリは最初の X 件の結果をスキップします。
  • distinct は、生成された SQL に DISTINCT 演算子を追加します。

言語の選択

デフォルトでは、全文検索はドキュメントを英語で解析します。これは、@searchable ディレクティブの言語引数で変更できます。

type Movie
  @table {
  title: String! @searchable(language: "french")
  ...
}

適切な言語を指定すると、PostgreSQL が正確な語幹抽出を実行し、検索で関連性の高い結果が漏れないようにすることができます。複数の列を検索する場合は、すべての列を同じ言語に設定する必要があります。

言語
  • クリックします。
  • arabic
  • アルメニア人
  • バスク人
  • カタロニア人
  • デンマーク人
  • オランダ人
  • japanese
  • フィンランド人
  • フランス語
  • ドイツ語
  • ギリシャ語
  • ヒンディー語
  • ハンガリー人
  • インドネシア人
  • アイルランド人
  • イタリア語
  • リトアニア人
  • ネパール人
  • ノルウェー語

psql を使用すると、次のクエリで完全なリストを取得できます。

SELECT cfgname FROM pg_ts_config;

クエリ形式

デフォルトでは、全文検索ではクエリにウェブ セマンティクスが使用されます(Google 検索と同様)。この動作は、<pluralType>_search フィールドの queryFormat 引数で変更できます。

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, queryFormat: PHRASE) {
    ...
  }
}

クエリ形式には次の 4 つのオプションがあります。

  • QUERY は、ウェブ検索エンジン(引用符で囲まれた文字列、AND、OR など)に使い慣れたセマンティクスを提供します。これがデフォルトです。
  • PLAIN はすべての単語に一致しますが、必ずしも連続している必要はありません(「茶色の犬」は「茶色と白の犬」または「白と茶色の犬」に一致します)。
  • PHRASE は、フレーズと完全に一致します(「茶色の犬」は「白と茶色の犬」と一致しますが、「茶色と白の犬」とは一致しません)。
  • [詳細] では、tsquery 演算子の完全なセットを使用して複雑なクエリを作成できます。

関連性のしきい値

関連性のしきい値を設定すると、検索で特定の関連性の値を超える結果のみが返されます。多くの場合、この設定は必要ありません。関連性が 0 より大きい結果はすべて関連性の高い結果になります。

ただし、検索結果が関連性の低いものばかりである場合は、関連性しきい値でフィルタできます。

関連性しきい値の適切な値を判断するには、いくつかのテスト検索を実行して _metadata.relevance を確認する必要があります。

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    _metadata {
      relevance
    }
    ...
  }
}

関連性がないと思われる結果を除外するしきい値を選択します。手順は次のとおりです。

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, relevanceThreshold: 0.05) {
    id
    title
    ...
  }
}

全文検索、ベクトル類似性検索、文字列パターン フィルタの選択

Data Connect には、データベースを検索するさまざまな方法が用意されています。

この表は、ユースケースに適したものを選択するのに役立ちます。

全文検索 ベクトル類似性検索 文字列パターン フィルタ
一般的な検索機能の実装に適しています 意味的に類似した行(おすすめや「こちらもおすすめ」など)を見つけるのに適しています。 テキストの完全一致や正規表現検索に適している
同じ単語の異なる形や時制を照合するのに役立つ語彙的なステミングを実行します。 Vertex AI が必要 インデックスや生成された列が不要なため、メモリとディスク容量の使用量が最小限に抑えられます。
テーブル内の複数の列に対して実行できる 一度に 1 つの列に対してのみ機能する OR フィルタを使用して、テーブル内の複数の列に対して実行できます
大きなドキュメントでもパフォーマンスが高い 大規模なドキュメントでもパフォーマンスを発揮 大きなドキュメントを検索する際のパフォーマンスが低下する
生成された列と検索ごとのインデックスを保存するために、メモリとストレージのオーバーヘッドを追加します