Firebase Data Connect 支持由 PostgreSQL 提供支持的全文搜索。 借助全文搜索,您可以同时在多个列中搜索关键字和短语,从而快速高效地在大型数据集中找到所需信息。
您可以为服务添加全文搜索功能。首先,将 @searchable
指令添加到您要搜索的架构中的 String
。例如:
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
会将 DISTINCT 运算符添加到生成的 SQL 中。
语言选择
默认情况下,全文搜索会解析英文文档。您可以使用 @searchable
指令中的 language 实参来更改此设置:
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) {
...
}
}
查询格式有四种选项:
- QUERY 为网络搜索引擎提供熟悉的语义(例如带引号的字符串、AND 和 OR)。这是默认设置。
- PLAIN 会匹配所有字词,但不一定按顺序匹配(“棕色狗”会匹配“棕色和白色狗”或“白色和棕色狗”)。
- 词组匹配确切的词组(“棕色狗”将匹配“白色和棕色狗”,但不会匹配“棕色和白色狗”)。
- 高级可让您使用全套 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 | 使用最少的内存和磁盘空间,因为它不需要任何索引或生成的列 |
可对表中的多个列执行 | 一次只能处理一列 | 可以使用 OR 过滤条件对表中的多个列执行 |
在处理大型文档时性能出色 | 可高效处理大型文档 | 搜索较大文档时性能较低 |
为存储生成的列和每次搜索的索引添加了内存和存储空间开销 |