使用 Data Connect 执行全文搜索

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 执行准确的词汇词干提取,并有助于确保您的搜索不会遗漏相关结果。如果您要搜索多个列,则这些列必须全部设置为相同的语言。

语言
  • 简单
  • arabic
  • 亚美尼亚的/亚美尼亚人
  • 巴斯克衫/巴斯克人/巴斯克语
  • 加泰罗尼亚人/加泰罗尼亚语
  • 丹麦的/丹麦人的/丹麦语的/丹麦人/丹麦语
  • 荷兰的/荷兰人的/荷兰人/荷兰语
  • english
  • 芬兰的/芬兰人/芬兰语
  • 法国的/法语/法国人
  • 德国的/德国人/德语
  • 希腊人/希腊语/希腊的
  • 印地语
  • 匈牙利的/匈牙利人/匈牙利语
  • 印度尼西亚的/印度尼西亚人/印度尼西亚语
  • 爱尔兰的/爱尔兰人/爱尔兰语
  • 意大利的/意大利人/意大利语
  • 立陶宛的/立陶宛人/立陶宛语
  • 尼泊尔人/尼泊尔语
  • 挪威的/挪威人/挪威语

使用 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 过滤条件对表中的多个列执行
在处理大型文档时性能出色 可高效处理大型文档 搜索较大文档时性能较低
为存储生成的列和每次搜索的索引添加了内存和存储空间开销