MSSQL系列之十五 全文索引

举报
tea_year 发表于 2021/12/29 22:50:29 2021/12/29
【摘要】 (前端理论为摘抄)大家都知道LIKE查询很慢,全文索引就是事先做好相关的索引,表示哪个主题词可以在哪些记录里找到,甚至事先计算好,检索时可以把相关度高的先列出来,这可以大大提高检索的速度。 打个比方,你有很多的小抽屉,每个抽屉里面放一些杂物,假如你要找东西,最原始的方法就是一个个抽屉翻,这就是没有索引的情况。 假如聪明一点,给抽屉编...

(前端理论为摘抄)大家都知道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(仅供参考)


  
  1. Create table QQBlog
  2. (
  3. id char(10) Constraint PK_Id primary key,--注意:蓝色为关键字,Primary key为主键约束;PK_ID为主键约束名
  4. topic varchar(30)not null,--标题一般不允许空,所以设置不为"空"
  5. QQcontent varchar(8000),--内容
  6. kind char(8)Constraint DF_Kind default '个人日志',--原创、转载,个人日志
  7. begintime datetime Constraint DF_BeginTime default getdate(),--getdate():获得当前日期和时间
  8. visitCount int,--访问量
  9. replyCount int --回复量
  10. )
  11. insert qqblog(topic,QQcontent,kind) values('白雪公主','在丹麦的一个小农村,里面发生了一起感人的事件,一个青蛙','日志')
  12. insert qqblog(id,topic,QQcontent,kind) values('blog07','软件','安阿饿是NIIT有个人马化腾,开发了一款软件,会讲故事,java c#,右微软买了该软件','日志')
  13. insert qqblog(topic,QQcontent,kind) values('QQ之父','1998年,马化腾和几个同学成立了自己的软件公司,当时公司很小,主营业务是为其他公司做软件外包.据马化腾回忆说,当时跟他很熟的丁磊正在做邮箱系 统,之后也卖了很多版本,“我也做过邮件,也给寻呼台做过互动系统,比如短信查邮件什么的,即时通信是其中一个项目.”
  14. 做好了软件系统,接下来就是销售,“当时并不止我一家在做这种通信产品,有一次投标,为了抢先,我甚至在产品成型前就先写好了投标书.”结果当然是投标失败,“但现在想想还真的是幸运,那个拿到项目的公司没有再维护产品,只有我们的QQ被砸在手上,才会持续做下去.”
  15. 连马化腾自己都没有想到,到了2000年的时候,随便走进一个网吧,聊天工具QQ跳动的企鹅已经成了流行,“我没想到那么多人在网上争着和认识不认识的人聊天,好多人为此刻苦学习打字,真疯狂.”
  16. ','日志')
  17. insert qqblog(topic,QQcontent,kind) values('QQ之父2',' “要说煎熬,我创业最煎熬的就是这段时间,我不喜欢这样的拖延,那时候纳斯达克已经快崩盘了.”
  18. 产品有人用,离公司上市还有一大段距离,无论如何,2000年的腾讯还是个小公司,而且它的驻地在深圳,“深圳没有北京的海归圈子,当时的风险投资也不懂,全靠高交会帮了忙.”马化腾回忆说,看在国外的前辈ICQ的成功经验上,盈科数码和IDG投资了腾讯,“两家一起进,壮着胆子.”
  19. 但马化腾的融资过程并不顺利,随着互联网冬天的临近,IDG投资完之后一直忙着为马化腾的公司找下家,“找过搜狐、新浪,他们都没看得上眼.”马化腾记 得,当时任职搜狐的古永锵和冯珏都到腾讯看过一眼,2001年春天,马化腾自己又去新浪见了王志东和汪延,但后来都没了消息.
  20. 最后进场的买家是传媒集团MIH,而最令马化腾心焦的一段创业经历也自此开始,“我愿意找更有实力的投资人,IDG也愿意出售股权,但盈科不答应.”当时的盈科,小超人李泽楷的数码港计划如日中天,“他甚至还找过王晶这样的导演来我们公司参观,探讨前景.”
  21. ','日志')
  22. insert qqblog(topic,QQcontent,kind) values('QQ之父3','“要说煎熬,我创业最煎熬的就是这段时间,我不喜欢这样的拖延,可当时盈科不说买也不说卖,把我们晾在一边,等到最后终于定下来出售已经是2001年6月,那时候纳斯达克已经快崩盘了.”
  23. 资本市场的幸运与否也许真的很难判断,到了2008年6月,因为股价增长强劲和稳定,腾讯成为恒生指数的成分股,它顶替的正是盈科.马化腾 王志东和汪延
  24.   受惠母亲一本清晰的财务账“她很负责任地帮我整理财务报表,后来公司搬家,搬那些桌椅板凳都是家里人帮忙,因为公司要减轻负担.”
  25. 现在看起来,马化腾的创业途径很符合年轻人对所谓“知识英雄”的想象,写代码出身,几个同学合伙创业,一起加班吃盒饭,熬夜改产品,凭借创意和勤奋取得成功,慢慢地公司上市,简陋的办公室换成宏伟的大楼,创始人进入富豪榜.
  26. 但实际的情形要艰苦得多,以至于马化腾需要给自己最感谢的人列一个长长的名单,“要感谢家里人,最开始我妈不同意,我爸挺支持我的,可最早的董事长却是我母亲.”马化腾回忆说,一开始,几个年轻人是拿着母亲的退休证去注册的公司,但这位法人母亲几乎都没来过公司,“可是她很负责任地帮我整理财务报表,后来 公司搬家,搬那些桌椅板凳都是家里人帮忙,因为公司要减轻负担.”马化腾的感谢名单里还有当时深圳电脑协会的秘书长“丁阿姨”,还有现在深圳电信局的一个朋友,“是他们帮我们找了办公场地,免我们的租金,联系托管服务器,现在看好像这些事情很小,但没有这些,当时真不敢往下走.”
  27. 也许是对创业过程中这些帮助难以忘却,马化腾在招聘时定下一个标准——“人品好”,“我几乎是有点偏执地超级强调这一点,我们几个创始人都喜欢简单,不喜欢搞政治化,哪怕你说我不懂也好,我就是强调简单,人品第一,这样的毕业生进入我的公司培养三年,我让他成为业务骨干.”
  28. ','日志')
  29. Declare @i int --定义@i变量为int型
  30. set @i=152792 --变量的初始化
  31. while @i<=1000000
  32. begin
  33. set @i=@i+1 --每次加1
  34. insert QQBlog(id,topic,QQcontent,kind) values('blog'+convert(char(7),@i),'QQ历史','要说煎熬,我创业最煎熬的就是这段时间,我不喜欢这样的拖延,可当时盈科不说买也不说卖,把我们晾在一边,等到最后终于定下来出售已经是2001年6月,那时候纳斯达克已经快崩盘了.”
  35. 资本市场的幸运与否也许真的很难判断,到了2008年6月,因为股价增长强劲和稳定,腾讯成为恒生指数的成分股,它顶替的正是盈科.马化腾 王志东和汪延
  36.   受惠母亲一本清晰的财务账“她很负责任地帮我整理财务报表,后来公司搬家,搬那些桌椅板凳都是家里人帮忙,因为公司要减轻负担.”
  37. 现在看起来,马化腾的创业途径很符合年轻人对所谓“知识英雄”的想象,写代码出身,几个同学合伙创业,一起加班吃盒饭,熬夜改产品,凭借创意和勤奋取得成功,慢慢地公司上市,简陋的办公室换成宏伟的大楼,创始人进入富豪榜.
  38. 但实际的情形要艰苦得多,以至于马化腾需要给自己最感谢的人列一个长长的名单,“要感谢家里人,最开始我妈不同意,我爸挺支持我的,可最早的董事长却是我母亲.”马化腾回忆说,一开始,几个年轻人是拿着母亲的退休证去注册的公司,但这位法人母亲几乎都没来过公司,“可是她很负责任地帮我整理财务报表,后来 公司搬家,搬那些桌椅板凳都是家里人帮忙,因为公司要减轻负担.”马化腾的感谢名单里还有当时深圳电脑协会的秘书长“丁阿姨”,还有现在深圳电信局的一个朋友,“是他们帮我们找了办公场地,免我们的租金,联系托管服务器,现在看好像这些事情很小,但没有这些,当时真不敢往下走.”
  39. 也许是对创业过程中这些帮助难以忘却,马化腾在招聘时定下一个标准——“人品好”,“我几乎是有点偏执地超级强调这一点,我们几个创始人都喜欢简单,不喜欢搞政治化,哪怕你说我不懂也好,我就是强调简单,人品第一,这样的毕业生进入我的公司培养三年,我让他成为业务骨干.”
  40. ','日志')
  41. end
  42. select * from qqblog
  43. sp_fulltext_database enable --1.激活数据使能全文索引
  44. go
  45. create fulltext catalog cat1 as default --2.建立全文目录:建好在FTData下面.指定该目录为默认目录
  46. create fulltext index on QQBlog(QQcontent) key index PK_Id --3.建立全文索引 on cat1 with NO POPULATION ,创建之后不填充
  47. --
  48. alter fulltext index on QQBlog start full population--4.起用填充
  49. --只有在用户使用 START FULL、INCREMENTAL 或 UPDATE POPULATION 子句执行 ALTER FULLTEXT INDEX 命令后,才会填充索引。
  50. --开始/增长/更新
  51. --5.使用全文索引
  52. --在qqblog表中查找包含马化腾或盈科 的所有记录
  53. select * from qqblog where qqContent like '%马化腾%' or qqContent like '%盈科%' --51秒
  54. select count(*) from qqblog --161012
  55. select * from qqblog where freetext(QQcontent,'马化腾 在 王志东')--freetext(列名,'要查找内容')--23秒--161010
  56. --马化腾 王志东 是马化腾或王志东
  57. select * from qqblog where contains(QQContent,'"马化腾" or "王志东"')--161007
  58. --contains:"马化腾 王志东",这是一个短语
  59. --有点区别???
  60. select * from qqblog where QQContent like '%马化腾%'
  61. --要注意查找的时候不要包含噪音词:在FTData下面的noise...文件下
  62. /*记录的比较凌乱,请大家原谅,希望能从中找到适合自己的东东*/
  63. -- contains谓词主要是针对单字或句子做查询。
  64. -- freetext谓词则会将指定的句子分解为一个个的单字,然后查询这些单字。
  65. ----------------------------------contains-----------------------------------------
  66. --搜寻书籍名称字段中有 windows computer print 这个单词的记录
  67. select * from 书籍 where
  68. contains(书籍名称,'"windows or computer or print"')
  69. select * from 书籍 where contains(书籍名称,'"windows"')
  70. --搜寻书籍字段中包含短语的记录
  71. select * from 书籍 where contains(书籍名称,'"a computer failure"')
  72. --例:this is a computer,failure to work 此句子也将被搜寻出来。
  73. --带有通配符的查询
  74. select * from 书籍 where contains(书籍名称,'"sea*" OR "bread*"')
  75. --下面的示例返回包含短语 "sasquatch ale" 或 "steeleye stout" 的所有产品。
  76. use northwind
  77. go
  78. select productname
  79. from products
  80. where contains(productname, ' "sasquatch ale" or "steeleye stout" ')
  81. go
  82. --------------------------------freetext----------------------------
  83. select * from 书籍 where freetext(地址,' "I like windows 2000 and photoshop 5" ')
  84. select * from 书籍 where freetext(地址,' "北京市大兴区林校北路" ')
  85. -- a. 使用 freetext 搜索包含指定字符值的单词
  86. -- 下例搜索产品描述中含有与 sweetest bread、candy、dry 和 meat 相关的词语的
  87. -- 所有产品类别,如 breads、candies、dried 和 meats 等。
  88. use northwind
  89. go
  90. select categoryname
  91. from categories
  92. where freetext (description, 'sweetest candy bread and dry meat' )
  93. go
  94. --b. 在全文检索中使用变量
  95. -- 下例使用变量而不是特定的搜索术语。
  96. use pubs
  97. go
  98. declare @searchword varchar(30)
  99. set @searchword ='moon'
  100. select pr_info from pub_info where freetext(pr_info, @searchword)

 

 

 

文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。

原文链接:aaaedu.blog.csdn.net/article/details/5900430

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。