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