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 ディレクティブの language 引数で変更できます。

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

適切な言語を指定すると、PostgreSQL で正確な語彙のステミングを実行し、検索で関連する結果が見つからないようにすることができます。複数の列を検索する場合は、すべて同じ言語に設定する必要があります。

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

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

SELECT cfgname FROM pg_ts_config;

クエリ形式

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

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

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

  • QUERY は、ウェブ検索エンジンに使い慣れたセマンティクスを提供します(引用符で囲まれた文字列、AND、OR など)。これがデフォルトです。
  • PLAIN はすべての単語に一致しますが、必ずしも一緒に一致するとは限りません(「brown dog」は「the brown and white dog」または「the white and brown dog」に一致します)。
  • PHRASE は完全なフレーズに一致します(「brown dog」は「the white and brown dog」に一致しますが、「brown and white dog」には一致しません)。
  • ADVANCED を使用すると、 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 フィルタを使用すると、テーブル内の複数の列に対して実行できます
大きなドキュメントでもパフォーマンスが向上します 大きなドキュメントでもパフォーマンスが向上します 大きなドキュメントを検索する場合、パフォーマンスが低下します
生成された列と 各検索のインデックスを保存するために、メモリとストレージのオーバーヘッドが追加されます