SQLSERVER 建立全文检索
- -- 创建测试表
- -- DROP TABLE FullTextIndexing
- CREATE TABLE FullTextIndexing
- (
- ID INT IDENTITY(1,1) NOT NULL,
- Sentence VARCHAR(MAX)
- )
- -- 创建聚集索引
- ALTER TABLE FullTextIndexing ADD CONSTRAINT PK_FullTextIndexing PRIMARY KEY CLUSTERED(ID ASC)
- GO
- -- 将"全文搜索概述"页面的文字全部拷贝到txt,然后倒入到表FullTextIndexing中
- -- https://msdn.microsoft.com/zh-cn/library/ms142547(v=sql.105).aspx
- -- 重复15次,从47行变为154万行
- INSERT INTO FullTextIndexing(Sentence)
- SELECT Sentence FROM FullTextIndexing
- GO 15
- SELECT COUNT(*) FROM FullTextIndexing
- -- 【注】删除的语句不要执行!
- -- 创建全文目录
- -- https://msdn.microsoft.com/zh-cn/LIBRARY/ms189520(v=sql.105).aspx
- CREATE FULLTEXT CATALOG [Catalog_Test]
- WITH
- ACCENT_SENSITIVITY = ON --区分重音
- AS DEFAULT --默认目录
- AUTHORIZATION [dbo];--全文目录的所有者
- GO
- -- 更改全文目录的属性
- -- https://msdn.microsoft.com/zh-cn/LIBRARY/ms176095(v=sql.105).aspx
- ALTER FULLTEXT CATALOG [Catalog_Test]
- REBUILD WITH ACCENT_SENSITIVITY = ON; --重新生成整个目录并区分重音
- --REORGANIZE; --重新组织全文目录
- --AS DEFAULT; --指定此目录为默认目录
- GO
- -- 从数据库中删除全文目录(先删除全文索引)
- -- https://msdn.microsoft.com/zh-cn/LIBRARY/ms188403(v=sql.105).aspx
- DROP FULLTEXT CATALOG [Catalog_Test];
- GO
- -- 创建干扰字表
- -- https://msdn.microsoft.com/zh-cn/library/cc280405(v=sql.105).aspx
- CREATE FULLTEXT STOPLIST [Stoplist_Test]
- FROM SYSTEM STOPLIST
- AUTHORIZATION [dbo];
- GO
- -- 添加删除干扰字
- -- https://msdn.microsoft.com/zh-cn/library/cc280871(v=sql.105).aspx
- ALTER FULLTEXT STOPLIST [Stoplist_Test]
- ADD N'乎' LANGUAGE 2052;
- GO
- ALTER FULLTEXT STOPLIST [Stoplist_Test]
- DROP N'乎' language 2052;
- --ALL LANGUAGE 'English'
- --ALL
- GO
- -- 从数据库中删除全文本非索引字表
- -- https://msdn.microsoft.com/zh-cn/library/cc280482(v=sql.105).aspx
- DROP FULLTEXT STOPLIST [Stoplist_Test];
- GO
- -- 创建全文索引
- -- https://msdn.microsoft.com/zh-cn/library/ms187317(v=sql.105).aspx
- CREATE FULLTEXT INDEX ON [dbo].[FullTextIndexing]
- (Sentence LANGUAGE 2052) --索引列,明确列中存储的语言,方便过滤
- KEY INDEX PK_FullTextIndexing --全文键:当前表中唯一索引名称
- ON [Catalog_Test] --指定全文目录
- WITH (
- STOPLIST [Stoplist_Test], --指定全文非索引字表
- CHANGE_TRACKING AUTO --自动填充
- );
- GO
- -- 更改全文索引的属性
- -- https://msdn.microsoft.com/zh-cn/library/ms188359(v=sql.105).aspx
- -- 激活全文索引
- ALTER FULLTEXT INDEX ON [dbo].[FullTextIndexing] ENABLE;
- GO
- -- 删除全文索引
- -- https://msdn.microsoft.com/zh-cn/library/ms184393(v=sql.105).aspx
- DROP FULLTEXT INDEX ON [dbo].[FullTextIndexing];
- GO
- -- 测试常规查询方法(先查询全部数据,放到内存:154万行31秒)
- SELECT * FROM FullTextIndexing
- SET STATISTICS IO ON
- SET STATISTICS TIME ON
- SELECT * FROM FullTextIndexing WHERE Sentence LIKE '%全文索引%'
- /*执行了几遍,耗时13440 毫秒
- SQL Server 分析和编译时间:
- CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
- (229376 行受影响)
- 表 'FullTextIndexing'。扫描计数 1,逻辑读取 15633 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
- SQL Server 执行时间:
- CPU 时间 = 11591 毫秒,占用时间 = 13440 毫秒。
- */
- SELECT * FROM FullTextIndexing WHERE CHARINDEX('全文索引',Sentence)<>0
- /*执行了几遍,耗时15338 毫秒
- SQL Server 分析和编译时间:
- CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
- (229376 行受影响)
- 表 'FullTextIndexing'。扫描计数 1,逻辑读取 15633 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
- SQL Server 执行时间:
- CPU 时间 = 12714 毫秒,占用时间 = 15338 毫秒。
- */
- -- 使用全文索引的方法:
- SELECT * FROM [dbo].[FullTextIndexing] WHERE FREETEXT(Sentence,'全文索引');
- /*执行了几遍,耗时17402 毫秒
- SQL Server 分析和编译时间:
- CPU 时间 = 16 毫秒,占用时间 = 21 毫秒。
- (851968 行受影响)
- 表 'FullTextIndexing'。扫描计数 1,逻辑读取 15633 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
- SQL Server 执行时间:
- CPU 时间 = 2230 毫秒,占用时间 = 17402 毫秒。
- */
- -- 执行了17秒,不降反而上升了!!~
- -- 重新生成全文目录!~再执行(更多方法有待参考:使用全文搜索查询 SQL Server)
- -- https://msdn.microsoft.com/zh-cn/library/ms142559(v=sql.105).aspx
- ALTER FULLTEXT CATALOG [Catalog_Test] REBUILD;
- GO
- SELECT * FROM [dbo].[FullTextIndexing] WHERE FREETEXT(Sentence,'全文索引');
- SELECT * FROM [dbo].[FullTextIndexing] WHERE CONTAINS(Sentence,'全文索引');
- SELECT * FROM [dbo].[FullTextIndexing] WHERE CONTAINS(Sentence,'全文 AND 索引');
- /*这时快多了!~不到1秒就查询完成!~但是返回的行数才1000多行
- SQL Server 分析和编译时间:
- CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
- (8853 行受影响)
- 表 'FullTextIndexing'。扫描计数 0,逻辑读取 27121 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
- SQL Server 执行时间:
- CPU 时间 = 78 毫秒,占用时间 = 944 毫秒。
- */
- SET STATISTICS IO OFF
- SET STATISTICS TIME OFF
- 不断地执行就会找出规律:
- 表扫描次数为0。
- 逻辑读也越来越多,耗时越来越多,查询返回的行数也越来越多,性能越来越差!~比"like"还差
- 最后还得重建重组(REBUILD/REORGANIZE)全文索引目录
- 逻辑读取 27121 次
- 逻辑读取 945268 次
- 逻辑读取 1212885 次
- 逻辑读取 1407846 次
- 逻辑读取 1736686 次
- 逻辑读取 1953265 次
- -- 查询句词拆分结果.可以看到按什么词语进行匹配查询
- select * from sys.dm_fts_parser('全文索引',2052,5,0)
- -- 如果只需要全文键或排名的信息,可使用表值函数
- -- 使用表值函数的方法可以使用联接提示或查询提示(LOOP/MERGE/HASH)
- ALTER FULLTEXT CATALOG [Catalog_Test] REBUILD;
- GO
- ALTER FULLTEXT CATALOG [Catalog_Test] REORGANIZE;
- GO
- SELECT * FROM [dbo].[FullTextIndexing] t1
- INNER JOIN CONTAINSTABLE([FullTextIndexing],Sentence,'概述') AS t2
- ON t1.ID = t2.[KEY]
- GO
- SELECT * FROM [dbo].[FullTextIndexing] t1
- INNER JOIN FREETEXTTABLE([FullTextIndexing],Sentence,'概述',LANGUAGE 2052,1000) AS t2
- ON t1.ID = t2.[KEY]
- ORDER BY t2.RANK DESC;
- GO
- -- 相关视图:
- select * from sys.syslanguages
- select * from sys.fulltext_indexes
- select * from sys.fulltext_catalogs where name = 'Catalog_Test'
- select * from sys.dm_fts_active_catalogs where name = 'Catalog_Test'
- select * from sys.fulltext_stoplists where name = 'Stoplist_Test'
- select * from sys.fulltext_stopwords where stoplist_id = 5 --and language_id = 2052
- select * from sys.dm_fts_parser('全文索引',2052,5,0)
SQLSERVER 建立全文检索的更多相关文章
- 利用whoosh对mongoDB的中文文档建立全文检索
1.建立索引 #coding=utf-8 from __future__ import unicode_literals __author__ = 'zh' import sys,os from wh ...
- 如何在sqlserver建立新用户并关联相应的数据库
我们经常需要在数据库上建立有权限的用户,该用户只能去操作某个特定的数据库(比如该用户只能去读,去写等等),那么我们应该怎么在sqlserver上设置呢?下面的步骤有点长,只要一步一步跟着设置就行 方法 ...
- 如何解决无法通过SSL加密与SQLServer建立连接
在部署项目时,经常会遇到驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接,错误:Java.lang.RuntimeException: Could not gene ...
- SQLSERVER建立MYSQL连接服务器
1. 在SQL SERVER端安装MYSQL的ODBC驱动 2. 在ODBC数据源添加MYSQL(控制面板\所有控制面板项\管理工具) 在用户DSN 和系统DSN添加配置驱动程序 注:字符集一定要和M ...
- 在与SQLServer建立连接时出现与网络相关的或特定于实例的错误
标题: 连接到服务器 ------------------------------ 无法连接到 (local). ------------------------------ 其他信息: 在与 SQL ...
- Sqlserver建立Oracle的鏈接服務器
--建立数据库链接服务器 EXEC sp_addlinkedserver @server =N'TestOracle', --要创建的链接服务器别名 @srvproduct=N'Oracle', -- ...
- SQL Server 之 在与SQLServer建立连接时出现与网络相关的或特定于实例的错误
背景:在用数据库时,打开SQL Server 2008 R2 的 SQL Server Management Studio,输入sa的密码发现,无法登陆数据库,提示信息如上: 解决方案: 1.打开Sq ...
- SqlServer建立存储过程,方便.NET插入自增字段
首先,需要在数据库中创建一个表,以在test数据库创建tableNo表为例: create table tablesNo ( tableName ) not null, --表名 num int no ...
- sqlserver建立远程查询
开始远程查询前: ----open:Ad Hoc Distributed QueriesEXEC sp_configure 'show advanced options',1reconfigureex ...
随机推荐
- Træfɪk 服务发现解决方案
Træfɪk is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease. It s ...
- [深度学习]实现一个博弈型的AI,从五子棋开始
好久没有写过博客了,多久,大概8年???最近重新把写作这事儿捡起来……最近在折腾AI,写个AI相关的给团队的小伙伴们看吧. 搞了这么多年的机器学习,从分类到聚类,从朴素贝叶斯到SVM,从神经网络到深度 ...
- 队列模拟题——pat1026. Table Tennis
题意自己理解了,主要是两个队列维护,一个VIP队列,一个普通队列 搜集了一些坑(有些坑转自别的网站用于广大同学的测试之用) 普通人也有VIP的权益!!! 屌丝逆袭有木有!!! 920:52:00 10 ...
- 杂项: Memcached
ylbtech-杂项: Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动 ...
- JSch基本使用
JSch基本使用 JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等.你可以将它的功能集成到你自己的 程序中.同时该项目也提供一个J2 ...
- UUID是如何保证全局唯一的
UUID由以下几部分的组合: (1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同. 据说时间粒度很 ...
- Linux下干净卸载mysql详解
转自:http://blog.csdn.net/tjcyjd/article/details/52189182 1.使用以下命令查看当前安装mysql情况 rpm -qa|grep -i mysql ...
- python 绘图库 Matplotlib
matplotlib官方文档 使用Matplotlib,能够轻易生成各种图像,例如:直方图.波谱图.条形图.散点图等. 入门代码实例 import matplotlib.pyplot as plt i ...
- Centos如何设置IP地址,LINUX怎么修改IP地址
对于很多刚刚接触linux的朋友来说,如何设置linux系统的IP地址,作为第一步,下面小编以centos系统为例,给大家演示如何给centos设置IP地址,如何修改linux 系统IP地址? 步骤阅 ...
- Fiddler监控面板显示Server栏(Fiddler v5.0)
1.点击Rules下的Customize Rules.js,会打开Fiddler ScriptEditor 2.去掉 UI.lvSessions.AddBoundColumn("Server ...