全文搜索概览

本页介绍了全文搜索是什么以及其工作原理。

借助全文搜索,您可以构建一个应用,该应用可以搜索表以查找字词、短语或数字,而不仅仅是在结构化字段中搜索完全匹配的内容。全文搜索会将最新的事务一致性提交数据返回给您的应用。Spanner 全文搜索功能还包括进行拼写更正、自动检测搜索输入语言,以及对搜索结果进行排名。Spanner 会自动扩展文本搜索,以包含大致的字词匹配。

您需要针对要用于全文搜索的所有列创建搜索索引。Spanner 会分析这些列中的数据,以确定要添加到搜索索引中的个别字词。在数据库中提交新数据或修改后的数据后,Spanner 会立即使用这些数据更新搜索索引。

  • 基本文本搜索:使用完整或部分字词或词组搜索内容,以可靠的方式接收结果。查询谓词示例:
    • 匹配所有字词 [tricolor rat terrier]
    • 精确的字词或词组 ["rat terrier"]
    • 任一字词 [miniature OR standard]
    • 相邻字词 [world AROUND(3) cup]
    • 子字符串 [start*]
  • 数字搜索:执行数字相等和不等搜索。相等搜索会匹配数字。范围搜索和不等搜索会匹配特定范围内的数字。
  • 基于 N 元语法的搜索:匹配拼写有变体的字词,包括专有名词和名称。此类搜索还可帮助将查询文本与拼写错误的名称、具有备选拼写的名称以及具有其他拼写变体的文本进行匹配。
  • Soundex 搜索:匹配发音相似的字词。

全文搜索功能

Spanner 全文搜索具有以下功能:

  • 排名搜索结果:计算得分以衡量查询与文档的匹配程度(例如,为 column_A 赋予更高的权重)。使用 SQL 表达式自定义排名。
  • 摘要:突出显示搜索结果中的匹配文本。
  • 全球支持:自动支持不同语言的词元化,包括 CJK 分割。通过手动指定语言,您可以执行额外的微调。
  • 治理:查找特定字词的每个出现位置。
  • 拼写更正:自动更正查询中的拼写错误,以匹配存储空间中的正确拼写字词。例如,如果用户搜索“girafe”,搜索会查找包含“giraffe”的文档。
  • 上下文同义词添加(包括停止字词):自动添加上下文相关的同义词,以提高召回率。例如,“the house”与“this house”匹配,“cat picture”与“kitty picture”匹配。
  • 将上下文数字转换为文本以及从文本转换为上下文数字:将数字的文本版本与数字表示法进行匹配,反之亦然。例如,“five cats”与“5 cats”匹配。
  • 自动转换为复数形式:将“cat”与“cats”匹配。

全文搜索概念

全文搜索包含以下关键概念:

  • 文档是指给定行中可搜索的数据。
  • token是指存储在搜索索引中的文档的每个字词。
  • 词元化流程会将文档拆分为 token。
  • 词元化器是用于词元化的 SQL 函数。
  • 反向索引用于存储 token。使用 SQL 查询搜索反向索引。

为了理解全文搜索,我们来看一个使用数据库来存储每位歌手的歌曲的应用。每行对应一首歌曲。每首歌曲都包含歌名、歌词、歌手和专辑等列。应用使用全文搜索,让用户可以使用自然语言查询搜索歌曲:

  • 搜索支持使用 OR 运算符的查询,例如 Prince OR Camille。应用可以直接将最终用户在搜索框中输入的内容传送到 SQL SEARCH 函数中(使用 rquery 语法)。如需了解详情,请参阅查询搜索索引
  • Spanner 使用搜索索引在不同字段中查找匹配的文档。例如,应用可以发出查询,以搜索歌名中包含“cry”、歌词中包含“so cold”、歌手为“Prince”的歌曲。

搜索索引的其他用途

除了全文搜索之外,搜索索引还有多种用途,例如:

  • 将数组列中的元素编入索引。假设有一个使用数组列来存储与内容相关的标记的应用。借助搜索索引,该应用可以高效地查找包含特定标记的行。如需了解详情,请参阅数组词元化

  • 查找位于一组查询条件的交集中的数据。例如,您可以使用任意一组属性(颜色、尺寸、品牌、评分等)在目录中搜索商品。

  • 使用数字搜索条件(单独使用或与全文搜索条件结合使用)。以下是一些搜索索引对数字搜索有用的情况示例:

    • 与全文搜索应用结合使用时。例如,要查找主题为照片且大小超过 1 MB 的邮件。
    • 当它是之前所述条件交集的一部分时。例如,要查找 color = "yellow" AND size = 14 AND rating >= 4.5 的商品。
    • 搜索数字列的交集时。例如,假设有一个存储事件开始时间和结束时间的表。搜索索引可以高效地实现查询,用于查找在特定时间点发生的事件:start_time <= @p AND end_time > @p

    如需了解详情,请参阅数字索引

全文搜索步骤

在 Spanner 中,全文搜索需要执行以下步骤:

  1. 使用 Spanner 词元化器函数(例如 TOKENIZE_SUBSTRING)对文档进行词元化处理。如需了解详情,请参阅词元化
  2. 使用 CREATE SEARCH INDEX DDL 语句创建搜索索引以存储 token。如需了解详情,请参阅搜索索引
  3. 使用 Spanner SEARCH 函数查询搜索索引中的文档。如需了解详情,请参阅查询概览
  4. 使用 Spanner SCORE 函数对查询结果进行排名。如需了解详情,请参阅对搜索结果进行排名

限制

价格

使用全文搜索时,Spanner 不会产生额外费用,但由于需要额外的计算和存储资源,因此实现全文搜索会增加费用。

如需了解详情,请参阅 Spanner 价格

后续步骤