标签:SQL SERVER/MSSQL SERVER/数据库/DBA/全文索引

概述

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

最近遇到一个需求,需要在一个100万的表中通过关键字对一个大型字符字段进行检索,类似于百度搜索引擎的搜索,查询出所有包含关键字的数据并进行分页处理,并且将匹配度最高的数据排在第一位,要求查询响应时间控制在1秒左右。

测试环境:SQL Server 2008 r2

目录

  • 概述
  • 全文索引概念
  • 创建全文索引
    • 启动服务
    • 创建全文目录
    • 创建全文索引
    • 全文谓词
  • 需求
  • 总结

全文索引概念

  • 全文索引是针对数据表,只能对表创建全文索引,不能对数据库创建全文索引。
  • 每个数据库可以不包含全文目录或包含多个全文目录,一个全文目录可以包含多个全文索引,但一个全文索引只能用于构成一个全文目录。
  • 一个数据表只能创建一个全文索引,一个全文索引可以包含多个字段。
  • 创建全文索引的表必须要有一个唯一的非空索引,并且这个唯一的非空的索引只能是一个字段,不能是组合字段。
  • 每个表只允许有一个全文索引。若要对某个表创建全文索引,该表必须具有一个唯一且非 Null 的列。您可以对以下类型的列创建全文索引:charvarcharncharnvarchartextntextimagexmlvarbinaryvarbinary(max),从而可对这些列进行全文搜索。对数据类型为 varbinaryvarbinary(max)imagexml 的列创建全文索引需要您指定类型列。类型列是用来存储每行中文档的文件扩展名(.doc、.pdf、xls 等)的表列。

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

全文搜索体系结构:

从 SQL Server 2008 开始,全文搜索体系结构包括以下进程:

  • SQL Server 进程 (sqlservr.exe)
  • 筛选器后台程序宿主进程 (fdhost.exe)。

SQL Server 进程组件:

  • 用户表
    这些表包含要进行全文索引的数据。
  • 全文收集器
    全文收集器使用全文爬网线程。它负责计划和驱动对全文索引的填充,并负责监视全文目录。
  • 同义词库文件
    这些文件包含搜索项的同义词。
  • 非索引字表对象
    非索引字表对象包含对搜索无用的常见词列表。
  • SQL Server 查询处理器
    查询处理器编译并执行 SQL 查询。如果 SQL 查询包含全文搜索查询,则在编译和执行期间该查询都会发送到全文引擎。查询结果将与全文索引相匹配。
  • 全文引擎
    SQL Server 中的全文引擎现已与查询处理器完全集成。全文引擎编译和执行全文查询。作为查询执行的一部分,全文引擎可能会接收来自同义词库和非索引字表的输入。在 SQL Server 2008 和更高版本中,SQL Server 的全文引擎在 SQL Server 查询处理器内部运行。
  • 索引编写器(索引器)
    索引编写器生成用于存储索引标记的结构。
  • 筛选器后台程序管理器
    筛选器后台程序管理器负责监视全文引擎筛选器后台程序宿主的状态。

筛选器后台程序宿主组件:

筛选器后台程序宿主是一个由全文引擎启动的进程。它运行下列全文搜索组件,这些组件负责对表中的数据进行访问、筛选和断字,同时还负责对查询输入进行断字和提取词干:

筛选器后台程序宿主的组件如下:

  • 协议处理程序
    此组件从内存中取出数据,以进行进一步的处理,并访问指定数据库的用户表中的数据。其职责之一是从全文索引列中收集数据,并将所收集的数据传递给筛选器后台程序宿主,从而由该宿主根据需要应用筛选和断字符。
  • 筛选器
    某些数据类型需要筛选,然后才能为文档中的数据(包括 varbinaryvarbinary(max)imagexml 列中的数据)创建全文索引。给定文档采用何种筛选器取决于文档类型。例如,Microsoft Word (.doc) 文档、Microsoft Excel (.xls) 文档和 XML (.xml) 文档分别使用不同的筛选器。然后,筛选器从文档中提取文本块区,删除嵌入的格式并保留文本,如有可能的话也会保留有关文本位置的信息。结果将以文本化信息流的形式出现。
  • 断字符和词干分析器
    断字符是特定于语言的组件,它根据给定语言的词汇规则查找词边界(“断字”)。每个断字符都与用于组合动词及执行变形扩展的特定于语言的词干分析器组件相关联。在创建索引时,筛选器后台程序宿主使用断字符和词干分析器来对给定表列中的文本数据执行语言分析。与全文索引中的表列相关的语言将决定为列创建索引时要使用的断字符和词干分析器。

创建全文索引

启动服务

在SQL Server配置管理工具中,找到'SQL Full-text Filter Daemon Launcher'服务用本地用户启动。

创建全文目录

打开需要创建全文目录的数据库-存储-全文目录-右键新建全文目录

用语句创建全文目录 

CREATE FULLTEXT CATALOG [FD_HouseSearch]WITH ACCENT_SENSITIVITY = ON
AS DEFAULT
AUTHORIZATION [dbo]

创建全文索引

右键需要创建全文索引的表-全文索引-定义全文索引

1.全文索引必须要有一个唯一非空索引,这里选择主键。

2.选择需要全文搜索的列,并且选择断字符语言,因为该字段主要用来存储中文,所以这里也选择了简体中文。

断字符:断字符用来对全文搜索数据进行语言分析,查找单词的边界,也就是怎样将一段很长的内容拆分成日常的词语或字。例如“全文搜索”,可能会断字成“全文”、‘搜索’、‘全’、‘文’、‘搜’、‘索’等符合中国人正常的习惯的词或字。

3.选择跟踪方式,这里选择自动跟踪,就是表发生更改时自动填充索引。

4.选择全文目录、索引文件、非索引字表

非索引字表:在刚才的断字中讲了怎样断字,这里就是将断的字保存在一张表中,该处选择系统默认的非索引字表.

----查询断字表
SELECT TOP 1000 * FROM sys.dm_fts_index_keywords(db_id(''), object_id(''))

5.填充计划

可以新建填充计划来填充全文索引,填充计划可以是完全填充、增量填充、更新填充。

用语句创建全文索引

--语句少了很多默认参数,其它就按系统默认即可
CREATE FULLTEXT INDEX ON dbo.Housetest
(Description
)
KEY INDEX PK_Housetest
ON FD_HouseSearch

全文谓词

全文查询使用全文谓词(CONTAINS 和 FREETEXT)以及全文函数(CONTAINSTABLE 和 FREETEXTTABLE)。它们支持复杂的 Transact-SQL 语法,这种语法支持各种形式的查询词。若要编写全文查询,必须了解何时以及如何使用这些谓词和函数。

CONTAINS 谓词可以搜索:

  • 词或短语。
  • 词或短语的前缀。
  • 与另一个词相邻的词。
  • 由另一个词的词形变化而生成的词(例如,drive 一词是 drives、drove、driving 和 driven 词形变化的词干)。
  • 使用同义词库确定的另一个词的同义词(例如,metal 一词可能有 aluminum 和 steel 等同义词)。
---下面的示例将查找包含 "Mountain"
USE AdventureWorks2008R2;
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE CONTAINS(Name, 'Mountain');
GO
--下面的示例将查找包含 "Mountain"或 "Road"
USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Mountain" OR "Road" ')
GO
---下面的示例返回的所有产品名称中,其 Name 列中至少有一个词以前辍 chain 开头
USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');
GO

FREETEXT谓词的用法这里就不做解释了!

需求

现在来说一下我最近的需求,表数据100万条,数据这里就不弄出来了,只把方案说一下,title类似于文章的标题,Description是内容也是全文索引字段

方案1:like,测试后果断排除

方案2:直接使用全文搜索进行,排序消耗大。

方案3:由于查询需要对Title进行排序,建Title字段的倒序索引包含其它字段,最后选择该方案(创建Title字段的倒序索引很重要)。

--给出部分字段
CREATE TABLE [dbo].[Housetest]([ID] [int] IDENTITY(1,1) NOT NULL,[Title] [varchar](200) NULL,[Description] [nvarchar](max) NOT NULL,[IsOnline] [tinyint] NOT NULL,CONSTRAINT [PK_Housetest] PRIMARY KEY CLUSTERED
([ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

创建索引

CREATE INDEX IX_Housetest ON Housetest
(Title DESC
)
INCLUDE
(ID,
Description,
IsOnline
)

查询Description包含“美园”,并且如果Title是“美园”则排在第一位,并且以分页的形式显示,每页20条记录。

select  * from (SELECT  ROW_NUMBER() OVER(Order by (case when Title='美园' Then 1 Else 0 End) desc ) as RowsNumber,ID,Title,DescriptionFrom HousetestWhere  contains(Description,'美园') and IsOnline=1) tab1 where RowsNumber between 1 and 20

总结

大家不要拿这个与搜索引擎做对比,肯定是没法比的,因为我这里只需要解决需求就好,所以方案适合我目前的需求。

全文索引功能类似于百度的搜索引擎,但是百度这类搜索引擎有自己的数据字典,在关键字表中对关键字进行排序,保存关键字对应的 文档id,一个文档只会保留很少的关键字,就跟平时写文章要添加标签一样,一般一篇文章就几个标签,当搜索的时候匹配的速度就会非常快,这就需要一个很完善的数据字典表。

全文搜索还有另外的一个功能就是FileStream,需要添加文件流,在服务中启用该功能可以在字段中将文档以二进制的形式保存在字段当中,这样大型文档也可以随数据库一起备份,很多网站存储图片都是存储图片的路径,这样备份数据库的时候图片不会一起备份。

全文索引带来好处的同时也会对性能有一定的影响,特别是在进行筛选操作的时候对服务器性能会带来影响,所以选择一个功能的同时需要考虑对性能带来的影响。

本文转自pursuer.chen(陈敏华)博客园博客,原文链接:http://www.cnblogs.com/chenmh/p/4434890.html,如需转载请自行联系原作者

SQL Server 使用全文索引进行页面搜索相关推荐

  1. 公司招聘软件研发程序员的一道考题--MS SQL Server数据库数据文件页面头部结构...

    有一次在招聘C++程序员时,出的一道考题,内容其实就是MS SQL Server数据库数据文件页面头部结构,如下: 有个file.a文件,这个文件以16sec[sec是扇区,每个sec包含512个By ...

  2. sql server的搜索_在SQL Server中进行全文本搜索

    sql server的搜索 介绍 (Introduction) In most cases, we will use clustered and non-clustered indexes to he ...

  3. 【转】sql server开启全文索引方法

    利用系统存储过程创建全文索引的具体步骤: 1) 启动数据库的全文处理功能 (sp_fulltext_database) 2) 建立全文目录 (sp_fulltext_catalog) 3) 在全文目录 ...

  4. 一个以pubs数据库为例的SQL SERVER数据库全文索引

    首先,介绍利用系统存储过程创建全文索引的具体步骤: 1) 启动数据库的全文处理功能 (sp_fulltext_database) 2) 建立全文目录 (sp_fulltext_catalog) 3) ...

  5. 在SQL Server 2005中用存储过程实现搜索功能

    现在很多网站都提供了站内的搜索功能,有的很简单在SQL语句里加一个条件如:where names like '%words%'就可以实现最基本的搜索了. 我们来看看功能强大一点,复杂一点的搜索是如何实 ...

  6. SQL Server 数据文件的页面分部情况

    ---------------------------------------------------------------------------------------------------- ...

  7. SQL Server 如何判断PLE (页面的预期寿命)

    你是不是听过PLE (Page Life Expectancy, 页面的预期寿命),但又不太确定PLE 指的是什么意思?通常当资料库遇到效能问题的时候,PLE 的数值往往可以提供一些调校的方向.PLE ...

  8. 第十二周《支持SQl Server内部,第二版》CHAR1数据页面和数据行 作者Dmitri Korotkevitch

    数据页面和数据行 数据库中的空间分为逻辑8KB页面. 这些页面从零开始连续编号,可以通过指定文件ID和页码来引用它们. 页面编号始终是连续的,这样当SQL Server增长数据库文件时,新页面将从文件 ...

  9. SQL Server 2005全文检索技术在网站上的应用实录

    SQL Server 2005全文检索技术在网站上的应用实录 一.前言 "人类失去搜索,世界将会怎样?",同样,很难想象一个拥有极大信息量的行业网站门户没有站内全文搜索将会出现怎样 ...

最新文章

  1. 想知道spring boot+cloud+docker的微服务体系架构如何使用吗?
  2. 解决linux 系统中Mysql 进程占用CPU 300%故障
  3. [WinError 10038] 在一个非套接字上尝试了一个操作
  4. C语言语法之运算符及优先级
  5. 配置DispatcherServlet应该写/还是/*
  6. 20150110--魔术方法魔术常量+面向对象-02
  7. 浅析x86架构中cache的组织结构
  8. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期下跌2.98%
  9. HDU1754 —— I Hate It 线段树 单点修改及区间最大值
  10. spring cloud微服务分布式云架构-Spring Cloud 分布式的五大重点
  11. java sctp_[编织消息框架][传输协议]sctp简单开发
  12. python能制作ppt动画效果吗_你听说过Python可以做动画吗
  13. python进程之间修改数据[Manager]与进程池[Pool]
  14. cr2格式缩略图不显示,怎么把raw格式显示出缩略图
  15. android 修改图片的宽高
  16. 约束满足问题(CSPs)和规划问题(Planning)区别
  17. Mysql 笔记(二)
  18. 2015年的最后一天后
  19. 雅西高速交警列16处危险路段 司机需小心行驶
  20. 复制知乎专栏文章的方法

热门文章

  1. hal库串口dma卡死_STM32 HAL库 串口DMA发送完成中断
  2. CV之FR:基于cv2和dlib库自带frontal_face_detector(人脸征检测器)利用landmarks.dat文件实现人脸检测与人脸标记之《极限男人帮》和《NBA全明星球员》案例应用
  3. 谈网站域名,备案到上线
  4. 惠斯登电桥传感器电路设计技巧
  5. 点评阿里云盛大云代表的云计算IaaS产业
  6. HDMI接口类型种类区分图(高清图)
  7. 用Unity制作isometric风格游戏的模型与插件精选
  8. 使用MOD13A1产品NDVI数据计算植被覆盖度
  9. 快来直播:互联网内容运营人员的文案写作技巧
  10. 判断质数和合数python代码_「质数和合数」C语言:质数和合数的判断 - 金橙教程网...