本页介绍了全文搜索是什么以及其工作原理。
借助全文搜索,您可以构建一个应用,该应用可以搜索表以查找字词、短语或数字,而不仅仅是在结构化字段中搜索完全匹配的内容。全文搜索会将最新的事务一致性提交数据返回给您的应用。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
。应用可以直接将最终用户在搜索框中输入的内容传送到 SQLSEARCH
函数中(使用 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 中,全文搜索需要执行以下步骤:
- 使用 Spanner 词元化器函数(例如
TOKENIZE_SUBSTRING
)对文档进行词元化处理。如需了解详情,请参阅词元化。 - 使用
CREATE SEARCH INDEX
DDL 语句创建搜索索引以存储 token。如需了解详情,请参阅搜索索引。 - 使用 Spanner
SEARCH
函数查询搜索索引中的文档。如需了解详情,请参阅查询概览。 - 使用 Spanner
SCORE
函数对查询结果进行排名。如需了解详情,请参阅对搜索结果进行排名。
限制
- 全文搜索不支持Assured Workloads。
价格
使用全文搜索时,Spanner 不会产生额外费用,但由于需要额外的计算和存储资源,因此实现全文搜索会增加费用。
如需了解详情,请参阅 Spanner 价格。
后续步骤
- 了解词元化和 Spanner 词元化器。
- 了解搜索索引。
- 了解全文搜索查询。