问题记录:
1. 全文索引和普通索引的区别?
答:差别很大全文索引是一种特殊类型的基于标记的功能性索引,由全文引擎(MSFTESQL)服务创建和维护,首先在索引创建方面,全文索引不是针对表中某一特定行数据值来构造B树结构,而是基于要索引的文本中的各个标记来创建倒排、堆积且压缩索引结构。
2. 全文索引的作用?
答:解决海量数据模糊查询
3. 全文索引的存储方式?
答:索引的数据结构基本采用倒排序索引结构。
4. 全文索引为什么一定要有普通唯一索引做支持?
答:就目前知道的来看,他是用来作为查询和处理的链接。
5. 全文索引、全文目录、表、表索引之间的关系?
答:一个数据库可以有一个或多个全文目录,一个全文目录可以包含一个或多个全文索引,一个表只能有一个全文索引,并且只能属于一个全文目录。
6. 全文索引的速度到底有多快?数据测试一下
答:见下文中性能测试。
概念:
【全文目录】:位置在 数据库→存储→全文目录,作用是用于保存和管理全文索引。
【全文索引】:只针对nvarchar,char,text类型字段作匹配查询,要比普通的Sql中的like快至少10倍以上(待测)的速度,在查询匹配上提供了模糊匹配的高级搜索性能,并能够返回查询的命中率。主要用到以下谓词:FREETEXT,CONTAINS,FREETEXTTABLE,CONTAINSTABLE(后两个返回的结果更加详细,有匹配度等)
创建:
准备工作:
1. 先开启自己电脑或者服务器的这个服务,如下图:
我们可以看到这个服务后面的描述,是专门用来做全文搜索功能的
完后我开始建表
CREATE TABLE [dbo].[Test1]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NULL, [Description] [nvarchar](200) NULL ) ON [PRIMARY]
完后在该表的ID上,创建一个唯一索引,为全文索引使用,具体为什么需要,等下讲解
CREATE UNIQUE CLUSTERED INDEX [Test1_Index_ID] ON [dbo].[Test1] ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO
完后要创建全文目录
CREATE FULLTEXT CATALOG Catalog_Test1 AS DEFAULT
*注意:在建全文目录的时候报了这个错,“消息7609,级别17,状态100,第1 行 未安装全文搜索或无法加载某一全文组件。”,开启了全文筛选的服务(这个服务主要是对文本做分词的作用),还是不行,在SQL 管理配置里打开 服务,居然显示“远程过程调用失败0x800706be”,这真是一个问题接一个问题啊,好吧,挨个儿解决,网上各种找资料,说要卸载一个.....SQL DBLocal2012 ,卸载了果然好了,接着解决第二个,又查到说是可能登陆账号的问题,我看了下,我是用Windows模式登陆的,后又改为SQL混合模式 sa账号登陆,果然也可以了,在这里Mark一下,防止以后遇到类似的问题。
接下来再添加全文索引
CREATE FULLTEXT INDEX ON TEST1(Description) KEY INDEX Test1_Index_ID ON Catalog_Test1
接下来就可以使用 FREETEXT 、CONTAINS 查询数据了。如下图
性能测试:
向数据库插入20万条数据(不算多),第一次查询使用LIKE花费了4秒,而使用FREETEXT或者CONTAINS基本是毫秒级完成的,如果数据再多些,差异可能更加显著,由此看来,全文索引的确是为了解决海量数据模糊查询的好办法,但是查询的时候得到数据不太准确(可能是由于太模糊了,开玩笑,这里涉及到全文索引的原理),和LIKE关键字查到的数据总差一些。
注意事项:
1. 全文索引可对char,nvarchar,nchar,text,ntext,image,xml,varbinary或varbinary类型字段使用。
2. 每个表只能建一个全文索引,但是可以针对多个字段
3. 与LIKE区别,LIKE只对字符模式有效,而对二级制无效,对于大量非结构化数据Like查询可能会消耗几分钟,而同样的数据使用全文搜索可能只需要几秒甚至更少,还有一点LIKE对表制作简单模式扫描,而全文搜索会先将所查内容分词,对有用的词添加索引,再去做查询。
基本原理:
全文检索的全部工作就是建立索引和索引中搜索定位,所有的工作都围绕这两个来进行;建立索引中又有两项非常重要,一个是对文本进行分词,一个是建立索引的数据结构,分词的方法主要采用:二元分词法、最大匹配法和统计方法,索引的数据结构基本上采用倒排序索引结构,再详细原理,参看下面文字。
全文索引局限:
上面也测试过了,相比较LIKE关键字,全文所以查询到的数据略有偏差,这是什么原因造成的呢,其实全文索引一直是微软的一块心病,因为SQL Server 分词只是正序分词和索引,而没有对字符串再进行反方向分词和索引,所以只能查询到词或短语的前缀符合的记录。
参考资料:MSDN全文索引说明:https://msdn.microsoft.com/zh-cn/library/ms142575(SQL.90).aspx