问题记录:

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 分词只是正序分词和索引,而没有对字符串再进行反方向分词和索引,所以只能查询到词或短语的前缀符合的记录。
 
 
 
 
参考资料:写得好的博客文:http://blog.csdn.net/yellowegg/article/details/9635463
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

html, .wiz-editor-body { font-size: 12pt }
.wiz-editor-body { font-family: Helvetica, “Hiragino Sans GB”, “寰蒋闆呴粦”, “Microsoft YaHei UI”, SimSun, SimHei, arial, sans-serif; line-height: 1.7; margin: 0 auto; padding: 1.25rem 1rem }
.wiz-editor-body h1, .wiz-editor-body h2, .wiz-editor-body h3, .wiz-editor-body h4, .wiz-editor-body h5, .wiz-editor-body h6 { margin: 1.25rem 0 0.625rem; padding: 0; font-weight: bold }
.wiz-editor-body h1 { font-size: 1.67rem }
.wiz-editor-body h2 { font-size: 1.5rem }
.wiz-editor-body h3 { font-size: 1.25rem }
.wiz-editor-body h4 { font-size: 1.17rem }
.wiz-editor-body h5 { font-size: 1rem }
.wiz-editor-body h6 { font-size: 1rem; color: rgba(119, 119, 119, 1); margin: 1rem 0 }
.wiz-editor-body div, .wiz-editor-body p, .wiz-editor-body ul, .wiz-editor-body ol, .wiz-editor-body dl, .wiz-editor-body li { margin: 8px 0 }
.wiz-editor-body blockquote, .wiz-editor-body table, .wiz-editor-body pre, .wiz-editor-body code { margin: 8px 0 }
.wiz-editor-body .CodeMirror pre { margin: 0 }
.wiz-editor-body ul, .wiz-editor-body ol { padding-left: 2rem }
.wiz-editor-body ol.wiz-list-level1>li { list-style-type: decimal }
.wiz-editor-body ol.wiz-list-level2>li { list-style-type: lower-latin }
.wiz-editor-body ol.wiz-list-level3>li { list-style-type: lower-roman }
.wiz-editor-body blockquote { padding: 0 12px }
.wiz-editor-body blockquote>:first-child { margin-top: 0 }
.wiz-editor-body blockquote>:last-child { margin-bottom: 0 }
.wiz-editor-body img { border: 0; max-width: 100%; height: auto !important; margin: 2px 0 }
.wiz-editor-body table { border-collapse: collapse; border: 1px solid rgba(187, 187, 187, 1) }
.wiz-editor-body td, .wiz-editor-body th { padding: 4px 8px; border-collapse: collapse; border: 1px solid rgba(187, 187, 187, 1); min-height: 28px; box-sizing: border-box }
.wiz-hide { display: none !important }

版权声明:本文为nigthcat原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/nigthcat/articles/10796097.html