SQL Server实现全文搜索查询详解

目录
  • 一、概述
  • 二、全文搜索查询
  • 三、将全文搜索查询与 LIKE 谓词进行比较
  • 四、全文搜索体系结构
    • 4.1、SQL Server 进程
    • 4.2、过滤器守护程序主机进程
  • 五、全文搜索处理
    • 5.1、全文索引过程
    • 5.2、全文查询流程
  • 六、全文索引体系结构
    • 6.1、全文索引结构
    • 6.2、全文索引片段
    • 6.3、全文索引和常规 SQL Server 索引之间的差异
  • 总结

一、概述

全文索引在表中包括一个或多个基于字符的列。这些列可以具有以下任何数据类型:char、varchar、nchar、nvarchar、text、ntext、image、xml 或 varbinary(max) 和 FILESTREAM。每个全文索引为表中的一列或多列编制索引,并且每列可以使用特定的语言。

全文查询通过基于特定语言(如英语或中文)的规则对单词和短语进行操作,对全文索引中的文本数据执行语言搜索。全文查询可以包括简单的字词和短语,也可以包括字词或短语的多种形式。全文查询返回至少包含一个匹配项(也称为匹配项)的任何文档。当目标文档包含全文查询中指定的所有术语,并满足任何其他搜索条件(如匹配术语之间的距离)时,将发生匹配。

二、全文搜索查询

将列添加到全文索引后,用户和应用程序可以对列中的文本运行全文查询。这些查询可以搜索以下任何内容:

  • 一个或多个特定单词或短语(简单术语)。
  • 单词或短语,其中单词以指定文本(前缀术语)开头)。
  • 特定单词的屈折形式(世代术语))。
  • 接近另一个单词或短语的单词或短语(邻近术语))。
  • 特定单词的同义词形式(同义词库)。
  • 使用加权值的字词或短语(加权术语)。

全文查询不区分大小写。例如,搜索"Aluminum" 或 "aluminum"将返回相同的结果。

全文查询使用一小组 Transact-SQL 谓词 ( and ) 和函数 ( and ) 。但是,给定业务方案的搜索目标会影响全文查询的结构。例如:CONTAINS FREETEXT CONTAINSTABLE FREETEXTTABLE

(1)电子商务-在网站上搜索产品:

SELECT product_id FROM products
WHERE CONTAINS(product_description, '"Snap Happy 100EZ"' OR FORMSOF(THESAURUS,'"Snap Happy"') OR '100EZ')
AND product_cost < 200 ;

(2)招聘方案 - 搜索具有使用 SQL Server 经验的求职者:

SELECT candidate_name,SSN FROM candidates
WHERE CONTAINS(candidate_resume, '"SQL Server"') AND candidate_division = 'DBA';

三、将全文搜索查询与 LIKE 谓词进行比较

与全文搜索相比,LIKE Transact-SQL 谓词仅适用于字符模式。此外,不能使用 LIKE 谓词查询格式化的二进制数据。此外,针对大量非结构化文本数据的 LIKE 查询比针对相同数据的等效全文查询慢得多。针对数百万行文本数据的 LIKE 查询可能需要几分钟才能返回;而全文查询对相同数据可能只需要几秒钟或更短的时间,具体取决于返回的行数。

四、全文搜索体系结构

全文搜索体系结构由以下过程组成:

  • SQL Server 进程 (sqlservr.exe)。
  • 筛选器守护程序主机进程 (fdhost.exe)。

出于安全原因,过滤器由称为过滤器守护程序主机的单独进程加载。fdhost.exe进程由 FDHOST 启动器服务 (MSSQLFDLauncher) 创建,它们在 FDHOST 启动器服务帐户的安全凭据下运行。因此,FDHOST 启动器服务必须运行才能使全文索引和全文查询正常工作。

这两个过程包含全文搜索体系结构的组件。下图总结了这些组件及其关系。这些组件在图示后进行了描述。

4.1、SQL Server 进程

SQL Server 进程使用以下组件进行全文搜索:

  • 用户表。这些表包含要进行全文索引的数据。
  • 全文收集器。全文收集器使用全文爬网线程。它负责计划和驱动全文索引的填充,还负责监视全文目录。
  • 同义词库文件。这些文件包含搜索词的同义词。有关详细信息,请参阅配置和管理全文搜索的同义词库文件。
  • 非索引字表对象。非索引字表对象包含对搜索无用的常用词的列表。有关详细信息,请参阅配置和管理全文搜索的非索引字和非索引字表。
  • SQL Server 查询处理器。查询处理器编译并执行 SQL 查询。如果 SQL 查询包含全文搜索查询,则在编译和执行期间,该查询将发送到全文引擎。查询结果与全文索引匹配。
  • 全文引擎。SQL Server 中的全文引擎与查询处理器完全集成。全文引擎编译并执行全文查询。作为查询执行的一部分,全文引擎可能会从同义词库和非索引字表接收输入。
  • 索引编写器(索引器)。索引编写器生成用于存储索引令牌的结构。
  • 筛选器守护程序管理器。筛选器守护程序管理器负责监视全文引擎筛选器守护程序主机的状态。

4.2、过滤器守护程序主机进程

筛选器守护程序主机是由全文引擎启动的进程。它运行以下全文搜索组件,这些组件负责访问、筛选和分词表数据,以及分词和对查询输入进行词干提取。

筛选器守护程序主机的组件如下所示:

  • 协议处理程序。此组件从内存中提取数据以进行进一步处理,并从指定数据库中的用户表中访问数据。它的职责之一是从全文索引的列中收集数据,并将其传递给筛选器守护程序主机,该主机将根据需要应用筛选和分词系统。
  • 过滤器。某些数据类型需要筛选,然后才能对文档中的数据进行全文索引,包括变量、变量二元(最大值)、图像或 xml 列中的数据。用于给定文档的筛选器取决于其文档类型。例如,不同的筛选器用于 Microsoft Word (.doc) 文档、Microsoft Excel (.xls) 文档和 XML (.xml) 文档。然后,筛选器从文档中提取文本块,删除嵌入的格式并保留文本,并可能保留有关文本位置的信息。结果是文本信息流。有关详细信息,请参阅配置和管理搜索筛选器。
  • 分词系统和词干分析器。分词系统是特定于语言的组件,它根据给定语言的词法规则(断词)查找单词边界。每个分词系统都与特定于语言的词干分析器组件相关联,该组件共轭动词并执行屈折扩展。在编制索引时,筛选器守护程序宿主使用分词系统和词干分析器对给定表列中的文本数据执行语言分析。与全文索引中的表列关联的语言确定用于为列编制索引的分词系统和词干分析器。

五、全文搜索处理

全文搜索由全文引擎提供支持。全文引擎有两个角色:索引支持和查询支持。

5.1、全文索引过程

启动全文填充(也称为爬网)时,全文引擎会将大量数据推送到内存中,并通知筛选器守护程序主机。主机过滤和单词分解数据,并将转换后的数据转换为倒置单词列表。然后,全文搜索从单词列表中提取转换后的数据,处理数据以删除非索引字,并将批处理的单词列表保存到一个或多个倒排索引中。

对存储在 varbinary(max) 或图像列中的数据编制索引时,实现 IFilter 接口的筛选器会根据该数据的指定文件格式(例如 Microsoft Word)提取文本。在某些情况下,过滤器组件需要将变量(max)或图像数据写出到filterdata文件夹,而不是推送到内存中。

作为处理的一部分,收集的文本数据通过分词系统传递,以将文本分隔为单独的标记或关键字。用于标记化的语言在列级别指定,也可以通过过滤器组件在 varbinary(max)、图像或 xml 数据中标识。

可以执行其他处理以删除非索引字,并在标记存储在全文索引或索引片段中之前对其进行规范化。

填充完成后,将触发最终合并过程,将索引片段合并到一个主全文索引中。这提高了查询性能,因为只需要查询主索引而不是多个索引片段,并且可以使用更好的评分统计信息进行相关性排名。

5.2、全文查询流程

查询处理器将查询的全文部分传递给全文引擎进行处理。全文引擎执行断词和(可选)同义词库扩展、词干提取和非索引字(干扰词)处理。然后,查询的全文部分以 SQL 运算符的形式表示,主要表示为流式表值函数 (STVF)。在查询执行期间,这些 STVF 访问倒排索引以检索正确的结果。此时,结果要么返回到客户端,要么在返回到客户端之前进一步处理。

六、全文索引体系结构

全文引擎使用全文索引中的信息来编译全文查询,这些查询可以快速在表中搜索特定单词或单词组合。全文索引存储有关重要单词及其在数据库表的一列或多列中的位置的信息。全文索引是一种特殊类型的基于令牌的功能索引,由 SQL Server 全文引擎生成和维护。构建全文索引的过程不同于构建其他类型的索引。全文引擎不是基于存储在特定行中的值构造 B 树结构,而是基于要编制索引的文本中的单个标记构建倒置、堆叠、压缩的索引结构。全文索引的大小仅受运行 SQL Server 实例的计算机的可用内存资源的限制。

从 SQL Server 2008 (10.0.x) 开始,全文索引与数据库引擎集成,而不是像以前版本的 SQL Server 那样驻留在文件系统中。对于新数据库,全文目录现在是不属于任何文件组的虚拟对象;它只是一个逻辑概念,指的是一组全文索引。

每个表只允许有一个全文索引。若要在表上创建全文索引,该表必须具有单个唯一的非空列。可以在 char、varchar、nchar、nvarchar、nvarchar、text、ntext、image、xml、varbinary 和 varbinary(max) 类型的列上构建全文索引,以便为全文搜索编制索引。 在数据类型为变量、变量二进制(max)、图像或 xml 的列上创建全文索引需要指定类型列。类型列是表格列,您可以在其中将文档的文件扩展名(.doc、.pdf、.xls等)存储在每行中。

6.1、全文索引结构

充分了解全文索引的结构将有助于您了解全文引擎的工作原理。例如:

标识 标题
1 曲柄臂和轮胎保养
2 前反射器支架和反射器组件 3
3 前反射器支架安装

下表显示了片段 1,描述了在“文档”表的“标题”列上创建的全文索引的内容。全文索引包含的信息比此表中显示的信息要多。该表是全文索引的逻辑表示形式,仅用于演示目的。这些行以压缩格式存储,以优化磁盘使用情况。

请注意,数据已从原始文档反转。发生反转是因为关键字映射到文档 ID。因此,全文索引通常称为倒排索引。

另请注意,关键字“and”已从全文索引中删除。这样做是因为“and”是非索引字,从全文索引中删除非索引字可以节省大量磁盘空间,从而提高查询性能。

片段一:

“关键字”列包含在编制索引时提取的单个标记的表示形式。分词系统确定令牌的组成。

6.2、全文索引片段

逻辑全文索引通常拆分为多个内部表。每个内部表称为全文索引片段。其中一些片段可能包含比其他片段更新的数据。例如,如果用户更新 标识为 3 的以下行,并且表是自动更改跟踪的,则会创建一个新片段。

文档标识 标题
3 后反射器

一下的片段 2,与片段 3 相比,片段包含有关 标识 1 的更新数据。因此,当用户查询“后反射器”时,片段 2 中的数据将用于 标识3。每个片段都标有创建时间戳,可以使用sys.fulltext_index_fragments目录视图查询该时间戳。

片段 2:

关键词 结肠 标识 交流
1 3 1
反射镜 1 3 2

从片段 2 可以看出,全文查询需要在内部查询每个片段并丢弃较旧的条目。因此,全文索引中的全文索引片段过多可能会导致查询性能大幅下降。若要减少片段数,请使用“更改全文目录 Transact-SQL”语句的“重新组织”选项重新组织全文目录。此语句执行主合并,这会将片段合并为一个较大的片段,并从全文索引中删除所有过时的条目。

重新组织后,示例索引将包含以下行:

6.3、全文索引和常规 SQL Server 索引之间的差异

全文索引 常规 SQL Server 索引
每个表只允许有一个全文索引。 每个表允许多个常规索引。
可以通过计划或特定请求向全文索引添加数据(称为填充),也可以通过添加新数据自动进行。 在插入、更新或删除它们所基于的数据时自动更新。
在同一数据库中分组到一个或多个全文目录中。 未分组。

总结

SQL Server的全文引擎驻留在 SQL Server 进程中,而不是驻留在单独的服务中。将全文引擎集成到数据库引擎中提高了全文可管理性、混合查询的优化和整体性能。

全文搜索支持近 50 种不同的语言,例如英语、西班牙语、中文、日语、阿拉伯语、孟加拉语和印地语。

到此这篇关于SQL Server实现全文搜索查询详解的文章就介绍到这了,更多相关SQL Server全文搜索内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql 全文搜索 技巧

    << Back to man.ChinaUnix.net MySQL Reference Manual for version 4.1.0-alpha. -------------------------------------------------------------------------------- 6.8 MySQL 全文搜索 到 3.23.23 时,MySQL 开始支持全文索引和搜索.全文索引在 MySQL 中是一个 FULLTEXT 类型索引.FULLTEXT 索引用于 M

  • php利用scws实现mysql全文搜索功能的方法

    本文实例讲述了php利用scws实现mysql全文搜索功能的方法.分享给大家供大家参考.具体方法如下: scws这样的中文分词插件比较不错,简单的学习了一下,它包涵一些专有名称.人名.地名.数字年代等规则集合,可以直接将语句按这些规则分开成一个一个关键词,准确率在90%-95%之间,按照安装说明把scws的扩展放入php的扩展目录里,下载规则文件和词典文件,并在php配置文件中引用它们,就可以用scws进行分词了. 1) 修改 php 扩展代码以兼容支持 php 5.4.x 2) 修正 php

  • SQL Server的全文搜索功能

    目录 一.使用SQL Server全文搜索配置 1.开启全文搜索服务: 2.开启数据库的全文索引功能: 3.创建全文索引目录: 4.创建唯一索引: 5.创建全文索引: 二.使用全文搜索 CONTAINS搜索方式 1.简单词搜索 2.前缀词搜索的方式 3.加权词搜索的方式 4.邻近词搜索的方式 FREETEXT搜索方式 CONTAINSTABLE搜索方式 1.CONTAINSTABLE基本搜索: 2.CONTAINSTABLE返回所需列: 3.CONSTAINSTABLE按符合条件排序 4.CON

  • SQL Server 全文搜索功能介绍

    SQL Server 的全文搜索(Full-Text Search)是基于分词的文本检索功能,依赖于全文索引.全文索引不同于传统的平衡树(B-Tree)索引和列存储索引,它是由数据表构成的,称作倒转索引(Invert Index),存储分词和行的唯一键的映射关系.倒转索引是在创建全文索引或更新全文索引时,由SQL Server自动创建和维护的.全文索引主要包含三种分析器:分词器(Word Breaker).词干分析器(stemmer)和同义词分析器.全文索引中存储的数据是分词及其位置等信息,分词

  • Mysql全文搜索match against的用法

    对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE   (或 CREATE INDEX) 创建索引,这将是非常快的.将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的.1.使用Mysql全文检索fulltext的先决条件    表的类型必须是MyISAM建立全文检索的字段类型必须是char,varchar,text 2.建立全文检索先期配置由于Mysql的默认配置是索引的词的长度是4,所以要支持中文单字的话,首先更改这个.*Un

  • 详细讲解PostgreSQL中的全文搜索的用法

    开发Web应用时,你经常要加上搜索功能.甚至还不知能要搜什么,就在草图上画了一个放大镜. 搜索是项非常重要的功能,所以像elasticsearch和SOLR这样的基于lucene的工具变得很流行.它们都很棒.但使用这些大规模"杀伤性"的搜索武器前,你可能需要来点轻量级的,但又足够好的搜索工具. 所谓"足够好",我是指一个搜索引擎拥有下列的功能: 词根(Stemming) 排名/提升(Ranking / Boost) 支持多种语言 对拼写错误模糊搜索 方言的支持 幸运

  • mysql全文搜索 sql命令的写法

    mysql全文搜索,sql的写法: MATCH (col1,col2,-) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION]) 比如: SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database'); MATCH()函数对于一个字符串执行资料库内的自然语言搜索.一个资料库就是1套1个或2个包含在FULLTEXT内的列.搜索字符串作为对 AGAINST()的参数而被

  • mysql+mybatis下全文搜索的使用方法

    第一步在你的需要全文搜索的列上点击 全文搜索full text类型索引,注意我的例子是该列是个longText类型的列 第一步建立fulltext类型索引如下图 索引类型选择full text 第二步: 验证 全文搜索sql好不好使 第三步: 我用的是mybatis框架,改自动生成的example条件设置和mapper.xml文件内容 Page<TLog> page = (Page<TLog>) logMapper.selectByExample(tLogExample); 最后m

  • SQL Server实现全文搜索查询详解

    目录 一.概述 二.全文搜索查询 三.将全文搜索查询与 LIKE 谓词进行比较 四.全文搜索体系结构 4.1.SQL Server 进程 4.2.过滤器守护程序主机进程 五.全文搜索处理 5.1.全文索引过程 5.2.全文查询流程 六.全文索引体系结构 6.1.全文索引结构 6.2.全文索引片段 6.3.全文索引和常规 SQL Server 索引之间的差异 总结 一.概述 全文索引在表中包括一个或多个基于字符的列.这些列可以具有以下任何数据类型:char.varchar.nchar.nvarch

  • SQL Server 的T-SQL高级查询详解

    目录 基本常用查询 嵌套子查询 from (select … table)示例 示例 in, not in子句查询示例 exists和not exists子句查询示例 some.any.all子句查询示例 聚合查询 1. distinct去掉重复数据 2. compute和compute by汇总查询 3. cube汇总 排序函数 基本语法 row_number函数 rank函数函数 dense_rank函数 partition by分组子句 ntile平均排序函数 集合运算 1. union和

  • SQL Server中的连接查询详解

    在查询多个表时,我们经常会用"连接查询".连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据. 目的:实现多个表查询操作. 知道了连接查询的概念之后,什么时候用连接查询呢? 一般是用作关联两张或两张以上的数据表时用的.看起来有点抽象,我们举个例子,做两张表:学生表(T_student)和班级表(T_class). T_student T_class 连接标准语法格式: SQL-9

  • SQL Server的行级安全性详解

    目录 一.前言 二.描述 三.权限 四.安全说明:侧信道攻击 五.跨功能兼容性 六.示例 一.前言 行级别安全性使您能够使用组成员身份或执行上下文来控制对数据库表中行的访问. 行级别安全性 (RLS) 简化了应用程序中的安全性设计和编码.RLS 可帮助您对数据行访问实施限制.例如,您可以确保工作人员仅访问与其部门相关的数据行.另一个示例是将客户的数据访问限制为仅与其公司相关的数据. 访问限制逻辑位于数据库层中,而不是远离另一个应用程序层中的数据.每次尝试从任何层访问数据时,数据库系统都会应用访问

  • SQL Server 2012 FileTable 新特性详解

    FileTable是基于FILESTREAM的一个特性.有以下一些功能: •一行表示一个文件或者目录. •每行包含以下信息: • •file_Stream流数据,stream_id标示符(GUID). •用户表示和维护文件及目录层次关系的path_locator和parent_path_locator •有10个文件属性 •支持对文件和文档的全文搜索和语义搜索的类型列. •filetable强制执行某些系统定义的约束和触发器来维护命名空间的语义 •针对非事务访问时,SQL Server配置FIL

  • sql server 交集,差集的用法详解

    概述 为什么使用集合运算: 在集合运算中比联接查询和EXISTS/NOT EXISTS更方便. 并集运算(UNION) 并集:两个集合的并集是一个包含集合A和B中所有元素的集合. 在T-SQL中.UNION集合运算可以将两个输入查询的结果组合成一个结果集.需要注意的是:如果一个行在任何一个输入集合中出现,它也会在UNION运算的结果中出现.T-SQL支持以下两种选项: (1)UNION ALL:不会删除重复行 -- union allselect country, region, city fr

  • SQL Server批量插入数据案例详解

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters),高效插入数据. 新建数据库: --Create DataBase create database BulkTestDB; go use BulkTestDB; go --Create Table Create tab

  • sql server 自定义分割月功能详解及实现代码

    在最近的项目开发过程中,遇到了Sql server自动分割月的功能需求,这里在网上整理下资料. 1.为何出现自定义分割月的需求 今天梳理一个平台的所有函数时,发现了一个自定义分割月函数,也就是指定分割月的开始日索引值(可以从1-31闭区间内的任何一个值)来获取指定日期所对应的分割月数值.这个函数当时是为了解决业务部门获取非标准月(标准月就是从每个月的第一天到最后一天组成一个完成的标准月份)的统计汇总数据的.例如:如果指定分割月的开始日索引值为5则表示某个月的5号到下个月的4号之间作为一个完整的分

  • SQL Server中索引的用法详解

    目录 一.索引的介绍 什么是索引? 1.聚集索引和非聚集索引 2.索引的利弊 3.索引的存储机制 二.设置索引的权衡 1.什么情况下设置索引 2.什么情况下不要设置索引 三.聚集索引 1.使用SSMS创建聚集索引 2.使用T-SQL创建聚集索引 四.非聚集索引 1.SSMS创建方法同上,T-SQL创建方法如下: 2.添加索引选项 五.示例 六.管理索引 一.索引的介绍 什么是索引? 索引是一种磁盘上的数据结构,建立在表或视图的基础上.使用索引可以使数据的获取更快更高校,也会影响其他的一些性能,如

随机推荐