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 が正確な語幹抽出を実行し、検索で関連性の高い結果が漏れないようにすることができます。複数の列を検索する場合は、すべての列を同じ言語に設定する必要があります。
言語 | ||
---|---|---|
|
|
|
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 フィルタを使用して、テーブル内の複数の列に対して実行できます |
大きなドキュメントでもパフォーマンスが高い | 大規模なドキュメントでもパフォーマンスを発揮 | 大きなドキュメントを検索する際のパフォーマンスが低下する |
生成された列と検索ごとのインデックスを保存するために、メモリとストレージのオーバーヘッドを追加します |