全文索引和查询过程

全文搜索的索引组件负责对全文索引进行初始填充,并在以后修改全文索引表中的数据后对该索引进行更新。

全文索引过程

全文填充(也称为爬网)开始后,全文引擎会将大批数据存入内存并通知筛选器后台程序宿主。宿主对数据进行筛选和断字,并将转换的数据转换为倒排词列表。然后,全文搜索从词列表中提取转换的数据,对其进行处理以删除非索引字,然后将某一批次的词列表永久保存到一个或多个倒排索引中。

对存储在 varbinary(max) 或 image 列中的数据编制索引时,筛选器(实现 IFilter 接口)将基于为该数据指定的文件格式(例如,Microsoft Word)来提取文本。在某些情况下,筛选器组件要求将 varbinary(max) 或 image 数据写入 filterdata 文件夹中,而不是将其存入内存。

在处理过程中,通过断字符将收集到的文本数据分隔成各个单独的标记或关键字。用于词汇切分的语言将在列级指定,或者也可以通过筛选器组件在 varbinary(max)、image 或 xml 数据内标识。

还可能会进行其他处理以删除非索引字,并在将标记存储到全文索引或索引片断之前对其进行规范化。

填充完成后,将触发最终的合并过程,以便将索引片断合并为一个主全文索引。由于只需要查询主索引而不需要查询大量索引片断,因此这将提高查询性能,并且可以使用更好的计分统计信息来得出相关性排名。

注意注意

由于合并索引片断时必须读取和写入大量的数据,所以主合并可能会耗费大量 I/O,但它不会阻塞传入的查询。并且,对大量数据进行主合并会创建一个长时间运行的事务,在检查点期间延迟事务日志的截断。在这种情况下,事务日志可能会在完整恢复模式下显著增长。作为最佳实践,在使用完整恢复模式的数据库中重新组织较大的全文索引之前,应确保事务日志中包含足够的空间用于长时间运行的事务。有关详细信息,请参阅管理事务日志文件的大小

全文查询过程

查询处理器将查询的全文部分传递到全文引擎以进行处理。全文引擎执行断字,此外,它还可以执行同义词库扩展、词干分析以及非索引字(干扰词)处理。然后,查询的全文部分以 SQL 运算符的形式表示,主要作为流式表值函数 (STVF)。在查询执行过程中,这些 STVF 访问倒排索引以检索正确结果。此时会将结果返回给客户端,或者先将它们进一步处理,再将它们返回给客户端。