利用 SQL Server 和 Azure SQL 数据库中的全文搜索,用户和应用程序可以对 SQL Server 表中基于字符的数据运行全文查询。 在对表运行全文查询之前,数据库管理员必须对表创建全文索引。 全文索引包括表中的一个或多个基于字符的列。 这些列可以具有以下任何数据类型:char、、varchar、、nchar、、textnvarchar、ntext、image、xml或 varbinary(max) FILESTREAM。 每个全文索引为表中的一个或多个列编制索引,每个列都可以使用特定语言。
全文查询基于特定语言的规则(如英语或日语)对文本数据执行语言搜索,从而对全文索引中的文本数据执行语言搜索。 全文查询可以包括简单的字词和短语或多个形式的单词或短语。 全文查询返回包含至少一个匹配项(也称为 命中)的任何文档。 当目标文档包含全文查询中指定的所有术语并且满足任何其他搜索条件(例如匹配词之间的距离)时,会发生匹配。
注释
全文搜索是 SQL Server 数据库引擎的可选组件。 有关详细信息,请参阅 安装 SQL Server 2014。
Full-Text 搜索可以做什么?
全文搜索适用于多种业务场景,例如电子商务公司在网站上搜索商品;律师事务所在法律数据存储库中查找历史案例;或人力资源部门将职位描述与存储的简历进行匹配。 无论业务方案如何,全文搜索的基本管理和开发任务都是等效的。 但是,在给定的业务方案中,可以磨练全文索引和查询以满足业务目标。 例如,对于电子商务而言,最大化性能可能比结果排名、召回准确性(即全文查询实际返回现有匹配项的数量)以及支持多种语言更为重要。 对于一家律师事务所来说,返回每一个可能的命中(总召回 信息)可能是最重要的考虑因素。
Full-Text 搜索查询
将列添加到全文索引后,用户和应用程序可以针对列中的文本运行全文查询。 这些查询可以搜索以下任一项:
一个或多个特定字词或短语(简单术语)
单词或短语,其中单词以指定文本开头(前缀词)
特定单词的变形(生成术语)
与另一单词或短语接近的单词或短语(邻近词)
特定单词的同义词形式(同义词库)
使用加权值的字词或短语(加权词)
全文查询不区分大小写。 例如,搜索“铝”或“铝”返回相同的结果。
全文查询使用一小部分 Transact-SQL 谓词(CONTAINS 和 FREETEXT)和函数(CONTAINSTABLE 和 FREETEXTTABLE)。 但是,给定业务方案的搜索目标会影响全文查询的结构。 例如:
在网站上搜索产品的电子商务:
SELECT product_id FROM products WHERE CONTAINS(product_description, "Snap Happy 100EZ" OR FORMSOF(THESAURUS,'Snap Happy') OR '100EZ') AND product_cost < 200 ;招聘方案搜索具有使用 SQL Server 经验的应聘者:
SELECT candidate_name,SSN FROM candidates WHERE CONTAINS(candidate_resume,"SQL Server") AND candidate_division = 'DBA';
有关详细信息,请参阅 使用 Full-Text 搜索进行查询。
比较 LIKE 与 Full-Text 搜索
与全文搜索不同,LIKE Transact-SQL 谓词仅对字符模式有效。 另外,不能使用 LIKE 谓词来查询格式化的二进制数据。 此外,对大量非结构化的文本数据执行 LIKE 查询要比对相同数据执行同样的全文查询慢得多。 对数百万行文本数据进行的 LIKE 查询可能需要几分钟的时间才能返回结果;而对于同样的数据,全文查询只需要几秒甚至更少的时间,具体取决于返回的行数。
Full-Text 搜索的组件和体系结构
全文搜索体系结构包括以下过程:
SQL Server 进程(sqlservr.exe)。
筛选器守护程序主机进程(fdhost.exe)。
出于安全原因,筛选器由称为筛选器守护程序主机的单独进程加载。 fdhost.exe 进程由 FDHOST 启动器服务(MSSQLFDLauncher)创建,这些进程在 FDHOST 启动器服务帐户的安全凭据下运行。 因此,FDHOST 启动器服务必须运行,以确保全文索引和全文查询正常工作。 有关为此服务设置服务帐户的信息,请参阅 为全文筛选器后台程序启动器设置服务帐户。
这两个进程包含全文搜索体系结构的组件。 下图汇总了这些组件及其关系。 图后将介绍这些组件。
SQL Server 进程
SQL Server 进程使用以下组件进行全文搜索:
用户表。 这些表包含要编制全文索引的数据。
全文收集器。 全文收集器与全文爬虫线程一起工作。 它负责安排和推动全文索引的填充,并监控全文目录。
同义词库文件。 这些文件包含搜索词的同义词。 有关详细信息,请参阅 配置和管理 Full-Text 搜索的同义词库文件。
过滤对象。 停用词列表对象包含一个对搜索无用的常见词汇列表。 有关详细信息,请参阅 为全文搜索配置和管理非索引字和非索引字表。
SQL Server 查询处理器。 查询处理器编译和执行 SQL 查询。 如果 SQL 查询包含全文搜索查询,则会在编译期间和执行期间将查询发送到 Full-Text 引擎。 查询结果与全文索引匹配。
Full-Text 引擎。 SQL Server 中的 Full-Text 引擎与查询处理器完全集成。 Full-Text 引擎编译和执行全文查询。 作为查询执行的一部分,Full-Text 引擎可能会接收来自同义词库和停用词列表的输入。
索引编写器(索引器)。 索引编写器生成用于存储索引令牌的结构。
过滤器守护程序管理器。 筛选器守护程序管理器负责监视 Full-Text 引擎筛选器守护程序主机的状态。
筛选器守护程序主机进程
筛选器守护程序主机是由 Full-Text 引擎启动的进程。 它运行以下全文搜索组件,这些组件负责从表中访问、筛选和分词数据,并对查询输入进行分词和词干提取。
筛选器守护程序主机的组件如下所示:
协议处理程序。 此组件从内存中提取数据,以便进一步处理和访问指定数据库中用户表中的数据。 其职责之一是从全文索引的列收集数据,并将其传递给筛选器守护程序主机,该主机将根据需要应用筛选和断字符。
过滤 器。 某些数据类型需要在进行全文索引之前进行筛选,这些数据存在于文档中的
varbinary、varbinary(max)、image列或xml列。 用于给定文档的筛选器取决于其文档类型。 例如,不同的筛选器用于 Microsoft Word (.doc) 文档、Microsoft Excel(.xls) 文档和 XML (.xml) 文档。 然后,筛选器从文档中提取文本区块,删除嵌入的格式并保留文本,并可能提供有关文本位置的信息。 结果是一个文本信息流。 有关详细信息,请参阅 “配置和管理搜索筛选器”。分词器和词干分析器。 断字符是一个特定于语言的组件,它根据给定语言的词法规则(断字)来查找单词边界。 每个分词器都与一个特定于语言的词干分析器组件相关联,该组件对动词进行变位并执行词形变化扩展。 在索引过程中,筛选守护进程主机使用分词器和词干分析器对指定表列中的文本数据进行语言分析。 与全文索引中的表列关联的语言确定用于为列编制索引的断字符和词干分析器。 有关详细信息,请参阅 配置和管理断词器和词干提取器进行搜索。
Full-Text 搜索处理
全文搜索由 Full-Text 引擎提供支持。 Full-Text 引擎有两个角色:索引支持和查询支持。
Full-Text 索引过程
当启动全文数据采集(也称为爬网)时,Full-Text 引擎会将大量数据推送到内存中,并通知筛选守护进程主机。 主机对数据进行筛选和分词,并将转换后的数据转化为倒排单词列表。 然后,全文搜索将转换后的数据从单词列表中提取,处理数据并移除停用词,然后将批次的单词列表存储到一个或多个倒排索引中。
为存储在某个 varbinary(max) 或 image 列中的数据编制索引时,实现 IFilter 接口的筛选器会基于该数据的指定文件格式(例如,Microsoft Word)提取文本。 在某些情况下,筛选器组件需要varbinary(max)image将数据写入 filterdata 文件夹,而不是被推送到内存中。
作为处理的一部分,收集的文本数据通过断字符传递,以将文本分隔成单个标记或关键字。 用于标记化的语言是在列级别指定的,也可以由筛选器组件在varbinary(max)、image或xml数据中标识。
可以执行额外的处理来删除停用词,并在将令牌存储在全文索引或索引片段中之前对其进行规范化。
填充完成后,将触发最终合并过程,将索引片段合并到一个主全文索引中。 这可以提高查询性能,因为只需要查询主索引而不是多个索引片段,并且更好的评分统计信息可用于相关性排名。
Full-Text 查询过程
查询处理器将查询的全文部分传递给 Full-Text 引擎进行处理。 Full-Text 引擎执行分词,以及(可选)同义词扩展、词干分析和非索引字(干扰字)处理。 然后,查询的全文部分以 SQL 运算符的形式表示,主要是流式处理表值函数(STDF)。 在查询执行期间,这些 STDF 访问倒排索引以检索正确的结果。 结果此时会返回到客户端,或者在返回到客户端之前对其进行进一步处理。
Full-Text 搜索中的语言组件和语言支持
全文搜索支持近 50 种语言,如英语、西班牙语、中文、日语、阿拉伯语、孟加拉语和印地语。 有关支持的全文语言的完整列表,请参阅sys.fulltext_languages(Transact-SQL)。 全文索引中包含的每一列都与Microsoft Windows 区域设置标识符(LCID)相关联,该标识符等同于全文搜索支持的语言。 例如,LCID 1033 相当于美国英语,LCID 2057 相当于英国英语。 对于每个受支持的全文语言,SQL Server 提供了支持索引和查询存储在该语言中的全文数据的语言组件。
特定于语言的组件包括:
字符分隔器和词干分析器。 分词器根据给定语言的词法规则(分词)查找单词边界。 每个分词器都与一个词干分析器相关联,该词干分析器用于对同一语言的动词进行变形。 有关详细信息,请参阅 配置和管理分词器和词干分析器以进行搜索。
停用词表。 系统非索引字表提供,其中包含基本集非索引字(也称为干扰词)。 停用词是指在搜索中无助且通常在全文搜索中被忽略的单词。 例如,对于英语中的单词,例如“a”、“and”、“is”和“the”被视为停用词。 通常,您需要配置一个或多个同义词库文件和停用词表。 有关详细信息,请参阅 为全文搜索配置和管理非索引字和非索引字表。
同义词库文件。 SQL Server 还会为每种全文语言安装一个同义词库文件,并安装一个全局同义词库文件。 已安装的同义词库文件实质上为空,但你可以编辑这些文件来定义特定语言或业务方案的同义词。 通过开发专为全文数据定制的同义词库,可以有效地扩大针对该数据的全文查询的范围。 有关详细信息,请参阅 配置和管理 Full-Text 搜索的同义词库文件。
筛选器(iFilters)。 在
varbinary(max)、image或xml数据类型列中对文档进行编制索引时,需要使用过滤器来进行额外处理。 筛选器必须特定于文档类型(.doc、.pdf、.xls、.xml等)。 有关详细信息,请参阅 “配置和管理搜索筛选器”。
分词器和词干分析器以及筛选器在筛选器守护程序主机进程中运行(fdhost.exe)。
相关任务
编写 Full-Text 查询
管理目录和索引
管理语言组件
管理 Full-Text 搜索