MSSQL系列之十五 全文索引

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: MSSQL系列之十五 全文索引

(前端理论为摘抄)大家都知道LIKE查询很慢,全文索引就是事先做好相关的索引,表示哪个主题词可以在哪些记录里找到,甚至事先计算好,检索时可以把相关度高的先列出来,这可以大大提高检索的速度

打个比方,你有很多的小抽屉,每个抽屉里面放一些杂物,假如你要找东西,最原始的方法就是一个个抽屉翻,这就是没有索引的情况。

假如聪明一点,给抽屉编号(唯一键),把哪个号码的抽屉有什么东西记录在纸上,找东西先看看这张纸,这就是普通索引,假如你要知道哪个抽屉有什么,你可以在纸上迅速找到抽屉号码(大家知道这是使用查找树),然后得到相关的信息,这种情况普通索引是很快的;但是要找到一个特定的东西哪些抽屉有,你就要把整张纸遍历一次,这就是LIKE查询,假如你要找哪些抽屉同时有2种甚至更多种物品,LIKE就更加繁琐了。假如一个表有上千万的纪录,大家可以想象查询的代价。

可以换一个思路,另外找张纸,记录一样东西存在于哪些抽屉:

夹子:1,3,4,5,6,9,12...

钱币:2,3,4,7,12...


药丸:1,3,5,6...


这样找到某样东西或者某几样东西都很容易。


全文索引和普通的SQL索引有很多的区别:


普通 SQL 索引全文索引 存储时受定义它们所在的数据库的控制。存储在文件系统中,但通过数据库管理。 每个表允许有若干个普通索引。每个表只允许有一个全文索引。当对作为其基础的数据进行插入、更新或删除时,它们自动更新。将数据添加到全文索引称为填充,全文索引可通过调度或特定请求来请求,也可以在添加新数据时自动发生。 不分组。在同一个数据库内分组为一个或多个全文目录。使用 SQL Server 企业管理器、向导或 Transact-SQL 语句创建和除去。使用 SQL Server 企业管理器、向导或存储过程创建、管理和除去。

--参考表QQblog(仅供参考)

Create table QQBlog  
(
 id char(10) Constraint PK_Id primary key,--注意:蓝色为关键字,Primary key为主键约束;PK_ID为主键约束名
 topic varchar(30)not null,--标题一般不允许空,所以设置不为"空"
 QQcontent varchar(8000),--内容
 kind char(8)Constraint DF_Kind default '个人日志',--原创、转载,个人日志
 begintime datetime Constraint DF_BeginTime default getdate(),--getdate():获得当前日期和时间
 visitCount int,--访问量
 replyCount int --回复量
)
insert qqblog(topic,QQcontent,kind) values('白雪公主','在丹麦的一个小农村,里面发生了一起感人的事件,一个青蛙','日志')
insert qqblog(id,topic,QQcontent,kind) values('blog07','软件','安阿饿是NIIT有个人马化腾,开发了一款软件,会讲故事,java c#,右微软买了该软件','日志')
insert qqblog(topic,QQcontent,kind) values('QQ之父','1998年,马化腾和几个同学成立了自己的软件公司,当时公司很小,主营业务是为其他公司做软件外包.据马化腾回忆说,当时跟他很熟的丁磊正在做邮箱系 统,之后也卖了很多版本,“我也做过邮件,也给寻呼台做过互动系统,比如短信查邮件什么的,即时通信是其中一个项目.”
    做好了软件系统,接下来就是销售,“当时并不止我一家在做这种通信产品,有一次投标,为了抢先,我甚至在产品成型前就先写好了投标书.”结果当然是投标失败,“但现在想想还真的是幸运,那个拿到项目的公司没有再维护产品,只有我们的QQ被砸在手上,才会持续做下去.”
    连马化腾自己都没有想到,到了2000年的时候,随便走进一个网吧,聊天工具QQ跳动的企鹅已经成了流行,“我没想到那么多人在网上争着和认识不认识的人聊天,好多人为此刻苦学习打字,真疯狂.”
','日志')
insert qqblog(topic,QQcontent,kind) values('QQ之父2',' “要说煎熬,我创业最煎熬的就是这段时间,我不喜欢这样的拖延,那时候纳斯达克已经快崩盘了.”
     产品有人用,离公司上市还有一大段距离,无论如何,2000年的腾讯还是个小公司,而且它的驻地在深圳,“深圳没有北京的海归圈子,当时的风险投资也不懂,全靠高交会帮了忙.”马化腾回忆说,看在国外的前辈ICQ的成功经验上,盈科数码和IDG投资了腾讯,“两家一起进,壮着胆子.”
    但马化腾的融资过程并不顺利,随着互联网冬天的临近,IDG投资完之后一直忙着为马化腾的公司找下家,“找过搜狐、新浪,他们都没看得上眼.”马化腾记 得,当时任职搜狐的古永锵和冯珏都到腾讯看过一眼,2001年春天,马化腾自己又去新浪见了王志东和汪延,但后来都没了消息.
    最后进场的买家是传媒集团MIH,而最令马化腾心焦的一段创业经历也自此开始,“我愿意找更有实力的投资人,IDG也愿意出售股权,但盈科不答应.”当时的盈科,小超人李泽楷的数码港计划如日中天,“他甚至还找过王晶这样的导演来我们公司参观,探讨前景.”
','日志')
insert qqblog(topic,QQcontent,kind) values('QQ之父3','“要说煎熬,我创业最煎熬的就是这段时间,我不喜欢这样的拖延,可当时盈科不说买也不说卖,把我们晾在一边,等到最后终于定下来出售已经是2001年6月,那时候纳斯达克已经快崩盘了.”
    资本市场的幸运与否也许真的很难判断,到了2008年6月,因为股价增长强劲和稳定,腾讯成为恒生指数的成分股,它顶替的正是盈科.马化腾 王志东和汪延
  受惠母亲一本清晰的财务账“她很负责任地帮我整理财务报表,后来公司搬家,搬那些桌椅板凳都是家里人帮忙,因为公司要减轻负担.”
    现在看起来,马化腾的创业途径很符合年轻人对所谓“知识英雄”的想象,写代码出身,几个同学合伙创业,一起加班吃盒饭,熬夜改产品,凭借创意和勤奋取得成功,慢慢地公司上市,简陋的办公室换成宏伟的大楼,创始人进入富豪榜.
    但实际的情形要艰苦得多,以至于马化腾需要给自己最感谢的人列一个长长的名单,“要感谢家里人,最开始我妈不同意,我爸挺支持我的,可最早的董事长却是我母亲.”马化腾回忆说,一开始,几个年轻人是拿着母亲的退休证去注册的公司,但这位法人母亲几乎都没来过公司,“可是她很负责任地帮我整理财务报表,后来 公司搬家,搬那些桌椅板凳都是家里人帮忙,因为公司要减轻负担.”马化腾的感谢名单里还有当时深圳电脑协会的秘书长“丁阿姨”,还有现在深圳电信局的一个朋友,“是他们帮我们找了办公场地,免我们的租金,联系托管服务器,现在看好像这些事情很小,但没有这些,当时真不敢往下走.”
    也许是对创业过程中这些帮助难以忘却,马化腾在招聘时定下一个标准——“人品好”,“我几乎是有点偏执地超级强调这一点,我们几个创始人都喜欢简单,不喜欢搞政治化,哪怕你说我不懂也好,我就是强调简单,人品第一,这样的毕业生进入我的公司培养三年,我让他成为业务骨干.”
','日志')
Declare @i int --定义@i变量为int型
set @i=152792  --变量的初始化
while @i<=1000000
begin
 set @i=@i+1    --每次加1
 insert QQBlog(id,topic,QQcontent,kind) values('blog'+convert(char(7),@i),'QQ历史','要说煎熬,我创业最煎熬的就是这段时间,我不喜欢这样的拖延,可当时盈科不说买也不说卖,把我们晾在一边,等到最后终于定下来出售已经是2001年6月,那时候纳斯达克已经快崩盘了.”
    资本市场的幸运与否也许真的很难判断,到了2008年6月,因为股价增长强劲和稳定,腾讯成为恒生指数的成分股,它顶替的正是盈科.马化腾 王志东和汪延
  受惠母亲一本清晰的财务账“她很负责任地帮我整理财务报表,后来公司搬家,搬那些桌椅板凳都是家里人帮忙,因为公司要减轻负担.”
    现在看起来,马化腾的创业途径很符合年轻人对所谓“知识英雄”的想象,写代码出身,几个同学合伙创业,一起加班吃盒饭,熬夜改产品,凭借创意和勤奋取得成功,慢慢地公司上市,简陋的办公室换成宏伟的大楼,创始人进入富豪榜.
    但实际的情形要艰苦得多,以至于马化腾需要给自己最感谢的人列一个长长的名单,“要感谢家里人,最开始我妈不同意,我爸挺支持我的,可最早的董事长却是我母亲.”马化腾回忆说,一开始,几个年轻人是拿着母亲的退休证去注册的公司,但这位法人母亲几乎都没来过公司,“可是她很负责任地帮我整理财务报表,后来 公司搬家,搬那些桌椅板凳都是家里人帮忙,因为公司要减轻负担.”马化腾的感谢名单里还有当时深圳电脑协会的秘书长“丁阿姨”,还有现在深圳电信局的一个朋友,“是他们帮我们找了办公场地,免我们的租金,联系托管服务器,现在看好像这些事情很小,但没有这些,当时真不敢往下走.”
    也许是对创业过程中这些帮助难以忘却,马化腾在招聘时定下一个标准——“人品好”,“我几乎是有点偏执地超级强调这一点,我们几个创始人都喜欢简单,不喜欢搞政治化,哪怕你说我不懂也好,我就是强调简单,人品第一,这样的毕业生进入我的公司培养三年,我让他成为业务骨干.”
','日志')
end
select * from qqblog
sp_fulltext_database enable   --1.激活数据使能全文索引
go
create fulltext catalog cat1 as default  --2.建立全文目录:建好在FTData下面.指定该目录为默认目录
create fulltext index on QQBlog(QQcontent) key index PK_Id  --3.建立全文索引 on cat1 with  NO POPULATION ,创建之后不填充
--
alter fulltext index on QQBlog start full population--4.起用填充
--只有在用户使用 START FULL、INCREMENTAL 或 UPDATE POPULATION 子句执行 ALTER FULLTEXT INDEX 命令后,才会填充索引。
--开始/增长/更新
--5.使用全文索引
--在qqblog表中查找包含马化腾或盈科  的所有记录
select * from qqblog where qqContent like '%马化腾%' or qqContent like '%盈科%' --51秒
select count(*) from qqblog --161012
select * from qqblog where freetext(QQcontent,'马化腾 在 王志东')--freetext(列名,'要查找内容')--23秒--161010
--马化腾 王志东 是马化腾或王志东
select * from qqblog where contains(QQContent,'"马化腾" or "王志东"')--161007
--contains:"马化腾 王志东",这是一个短语
--有点区别???
select * from qqblog where QQContent like '%马化腾%'
--要注意查找的时候不要包含噪音词:在FTData下面的noise...文件下
/*记录的比较凌乱,请大家原谅,希望能从中找到适合自己的东东*/
-- contains谓词主要是针对单字或句子做查询。
-- freetext谓词则会将指定的句子分解为一个个的单字,然后查询这些单字。
----------------------------------contains-----------------------------------------
--搜寻书籍名称字段中有 windows  computer print 这个单词的记录
select * from 书籍 where
contains(书籍名称,'"windows or computer or print"')
select * from 书籍 where contains(书籍名称,'"windows"')
--搜寻书籍字段中包含短语的记录
select * from 书籍 where contains(书籍名称,'"a computer failure"')
--例:this is a computer,failure to work 此句子也将被搜寻出来。
--带有通配符的查询
select * from 书籍 where contains(书籍名称,'"sea*" OR "bread*"')
--下面的示例返回包含短语 "sasquatch ale" 或 "steeleye stout" 的所有产品。
use northwind
go
select productname
from products
where contains(productname, ' "sasquatch ale" or "steeleye stout" ')
go
--------------------------------freetext----------------------------
select * from 书籍 where freetext(地址,' "I like windows 2000 and photoshop 5" ')
select * from 书籍 where freetext(地址,' "北京市大兴区林校北路" ')
-- a. 使用 freetext 搜索包含指定字符值的单词
--    下例搜索产品描述中含有与 sweetest bread、candy、dry 和 meat 相关的词语的
--    所有产品类别,如 breads、candies、dried 和 meats 等。
use northwind
go
select categoryname
from categories
where freetext (description, 'sweetest candy bread and dry meat' )
go
--b. 在全文检索中使用变量
--   下例使用变量而不是特定的搜索术语。
use pubs
go
declare @searchword varchar(30)
set @searchword ='moon'
select pr_info from pub_info where freetext(pr_info, @searchword)
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
JavaScript
实现 Vue 框架用户短时间内多次点击同一按钮仅触发一次
使用 Vue 框架开发项目中,遇到个问题,就是在用户提交数据时,如果连续多次点击按钮,会触发多次,导致数据异常,因此需要限制用户短时间内多次点击同一按钮,只触发一次。
1275 0
实现 Vue 框架用户短时间内多次点击同一按钮仅触发一次
|
3月前
|
机器学习/深度学习 存储 算法
如何判断两张图片的相似度?原来图片对比也可以如此简单!
本文介绍了图片对比技术在多个场景中的应用,如图片去重、内容审核、版权维权及相似图片搜索,并详细解析了两种主流的图片对比方法。第一种是**MD5指纹对比**,适合精确匹配完全相同的图片,具有速度快、简单易用的特点,但对稍作修改的图片无能为力。第二种是**图像哈希对比**,包括平均哈希、感知哈希等算法,能够判断图片的相似程度,适用于处理缩放、旋转或亮度调整后的图片,但在语义相似性上仍有局限。最后提到,随着机器学习和深度神经网络的发展,图片相似度判断技术将有更多可能性,值得进一步探索。
1243 6
如何判断两张图片的相似度?原来图片对比也可以如此简单!
|
SQL 运维 监控
MSSQL性能调优实战:索引优化、SQL查询效率提升与并发控制策略
在Microsoft SQL Server(MSSQL)的日常运维与性能优化中,精准的策略与技巧是实现高效数据库管理的关键
|
12月前
|
消息中间件 NoSQL C#
WPF下使用FreeRedis操作RedisStream实现简单的消息队列
【9月更文挑战第28天】在WPF应用中使用FreeRedis操作Redis Stream实现消息队列的步骤包括:安装FreeRedis库,引入命名空间,创建Redis客户端连接,发送与接收消息,最后关闭连接。示例代码展示了如何创建流、添加消息及读取确认处理。实际应用需考虑错误处理和并发访问。
159 2
|
SQL 监控 数据库
MSSQL性能调优秘籍:索引深度优化、SQL重构技巧与高效锁策略
在Microsoft SQL Server(MSSQL)环境中,性能调优是确保数据库高效运行、满足业务快速增长需求的关键
|
11月前
|
JavaScript 前端开发 UED
Vue 组件设计:构建生动多彩的树形结构组件
本文介绍了如何使用 Vue 构建一个功能强大的树形结构组件。该组件支持递归渲染节点及其子节点,提供了自定义节点颜色、文本和布局的功能。通过独特的样式处理不同层级的节点,展示出丰富的视觉效果。组件还支持动态布局和缩放,确保灵活的界面展示和用户体验。文章提供了详细的代码实现,包括 HTML、JavaScript 和 SCSS,帮助开发者快速集成和定制自己的树形结构组件。
905 0
Vue 组件设计:构建生动多彩的树形结构组件
|
缓存 开发框架 .NET
看看 Asp.net core Webapi 项目如何优雅地使用内存缓存
看看 Asp.net core Webapi 项目如何优雅地使用内存缓存
246 1
|
数据库 数据安全/隐私保护
|
存储 C# 索引
C# | 比较IEnumerable、List、数组
IEnumerable`定义了一组用于枚举集合的方法,包括`GetEnumerator`方法,该方法返回一个实现了`IEnumerator`接口的对象,用于枚举集合中的每个元素。`List`和数组都可以使用`foreach`循环来遍历其中的元素,这是因为它们都实现了`IEnumerable`接口。 由于数组在内存中开辟了一段连续的空间,因此可以直接通过索引访问元素,访问速度很快。而 List 则需要通过指针或引用来访问元素,速度相对较慢。 由于数组的大小是固定的,当需要添加或删除元素时,需要重新创建一个新数组,将原数组中的元素复制到新数组中,并添加或删除元素。
432 0
C# | 比较IEnumerable、List、数组
【每日一道智力题】之猴子搬香蕉
【每日一道智力题】之猴子搬香蕉
1099 0