使用 SQL Connect 执行全文搜索

Firebase SQL 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;

查询格式

默认情况下,全文搜索对查询使用 Web 语义(类似于 Google 搜索)。您可以使用 queryFormat 实参更改此行为。在 <pluralType>_search 字段中。

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

查询格式有四种选项:

  • QUERY 为 Web 搜索引擎提供熟悉的语义(例如,带引号的字符串、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
    ...
  }
}

在全文搜索、向量相似性搜索和字符串模式过滤条件之间进行选择

SQL Connect 提供了几种不同的方式来搜索数据库。

使用此表格可帮助您为自己的用例选择合适的方式。

全文搜索 向量相似性搜索 字符串模式过滤条件
适合实现通用搜索功能 适合查找语义相似的行(例如, 推荐或“更多类似内容”) 适合完全匹配文本或正则表达式搜索
执行词汇词干提取,有助于匹配同一字词的不同形式或时态 需要 Vertex AI 使用的内存和磁盘空间最少,因为它不需要任何 索引或生成的列
可以在表中的多个列上执行 一次只能用于单个列 可以使用 OR 过滤条件在表中的多个列上执行
在较长的文档中表现良好 在较长的文档中表现良好 在搜索较长的文档时表现较差
为每个搜索存储生成的列和索引,从而增加内存和存储开销