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)
相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
目录
相关文章
|
10月前
|
SQL XML Go
MSSQL之八 实现视图与索引
MSSQL之八 实现视图与索引
37 0
|
10月前
|
存储 SQL XML
MSSQL之四 简单查询
MSSQL之四 简单查询
40 0
|
10月前
|
SQL Oracle 关系型数据库
MSSQL系列之十六 架构(Schema)
MSSQL系列之十六 架构(Schema)
45 0
|
存储 SQL JSON
索引与PostgreSQL新手
索引是优化数据库工作负载和减少查询时间的关键。PostgreSQL现在支持多种类型的索引,了解基础知识是使用PostgreSQL的关键部分。
174 1
索引与PostgreSQL新手
|
存储 算法 关系型数据库
MySQL的索引(二十三)上
MySQL的索引(二十三)上
113 0
MySQL的索引(二十三)上
|
关系型数据库 MySQL 索引
MySQL的索引(二十三)下
MySQL的索引(二十三)下
MySQL的索引(二十三)下
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 11 章 索引_11.10. 索引和排序规则
11.10. 索引和排序规则 一个索引在每一个索引列上只能支持一种排序规则。如果需要多种排序规则,你可能需要多个索引。 考虑这些语句: CREATE TABLE test1c ( id integer, content varchar COLLATE "x" ); CREATE INDEX test1c_content_index ON test1c (content); 该索引自动使用下层列的排序规则。
1178 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.2. 表和索引
12.2. 表和索引 12.2.1. 搜索一个表 12.2.2. 创建索引 在前一节中的例子演示了使用简单常数字符串进行全文匹配。本节展示如何搜索表数据,以及可选择地使用索引。 12.2.1. 搜索一个表 可以在没有一个索引的情况下做一次全文搜索。
1111 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 11 章 索引_11.3. 多列索引
11.3. 多列索引 一个索引可以定义在表的多个列上。例如,我们有这样一个表: CREATE TABLE test2 ( major int, minor int, name varchar ); (即将我们的/dev目录保存在数据库中)而且我们经常会做如下形式的查询: SELE.
1157 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 11 章 索引_11.8. 部分索引
11.8. 部分索引 一个部分索引是建立在表的一个子集上,而该子集则由一个条件表达式(被称为部分索引的谓词)定义。而索引中只包含那些符合该谓词的表行的项。部分索引是一种专门的特性,但在很多种情况下它们也很有用。
1313 0