1. --  创建测试表
    2. --  DROP TABLE FullTextIndexing
    3. CREATE TABLE FullTextIndexing
    4. (
    5. ID INT IDENTITY(1,1) NOT NULL,
    6. Sentence VARCHAR(MAX)
    7. )
    8. --  创建聚集索引
    9. ALTER TABLE FullTextIndexing ADD CONSTRAINT PK_FullTextIndexing PRIMARY KEY CLUSTERED(ID ASC)
    10. GO
    11. --  将"全文搜索概述"页面的文字全部拷贝到txt,然后倒入到表FullTextIndexing中
    12. --  https://msdn.microsoft.com/zh-cn/library/ms142547(v=sql.105).aspx
    13. --  重复15次,从47行变为154万行
    14. INSERT INTO FullTextIndexing(Sentence)
    15. SELECT Sentence FROM FullTextIndexing
    16. GO 15
    17. SELECT COUNT(*) FROM FullTextIndexing
    1. --  【注】删除的语句不要执行!
    1. --  创建全文目录
    2. --  https://msdn.microsoft.com/zh-cn/LIBRARY/ms189520(v=sql.105).aspx
    3. CREATE FULLTEXT CATALOG [Catalog_Test]
    4. WITH
    5. ACCENT_SENSITIVITY = ON --区分重音
    6. AS DEFAULT              --默认目录
    7. AUTHORIZATION [dbo];--全文目录的所有者
    8. GO
    9. --  更改全文目录的属性
    10. --  https://msdn.microsoft.com/zh-cn/LIBRARY/ms176095(v=sql.105).aspx
    11. ALTER FULLTEXT CATALOG [Catalog_Test]
    12. REBUILD WITH ACCENT_SENSITIVITY = ON;   --重新生成整个目录并区分重音
    13. --REORGANIZE;   --重新组织全文目录
    14. --AS DEFAULT;   --指定此目录为默认目录
    15. GO
    16. --  从数据库中删除全文目录(先删除全文索引)
    17. --  https://msdn.microsoft.com/zh-cn/LIBRARY/ms188403(v=sql.105).aspx
    18. DROP FULLTEXT CATALOG [Catalog_Test];
    19. GO
    20. --  创建干扰字表
    21. --  https://msdn.microsoft.com/zh-cn/library/cc280405(v=sql.105).aspx
    22. CREATE FULLTEXT STOPLIST [Stoplist_Test]
    23. FROM SYSTEM STOPLIST
    24. AUTHORIZATION [dbo];
    25. GO
    26. --  添加删除干扰字
    27. --  https://msdn.microsoft.com/zh-cn/library/cc280871(v=sql.105).aspx
    28. ALTER FULLTEXT STOPLIST [Stoplist_Test]
    29. ADD N'乎' LANGUAGE 2052;
    30. GO
    31. ALTER FULLTEXT STOPLIST [Stoplist_Test]
    32. DROP N'乎' language 2052;
    33. --ALL LANGUAGE 'English'
    34. --ALL
    35. GO
    36. --  从数据库中删除全文本非索引字表
    37. --  https://msdn.microsoft.com/zh-cn/library/cc280482(v=sql.105).aspx
    38. DROP FULLTEXT STOPLIST [Stoplist_Test];
    39. GO
    40. --  创建全文索引
    41. --  https://msdn.microsoft.com/zh-cn/library/ms187317(v=sql.105).aspx
    42. CREATE FULLTEXT INDEX ON [dbo].[FullTextIndexing]
    43. (Sentence LANGUAGE 2052)        --索引列,明确列中存储的语言,方便过滤
    44. KEY INDEX PK_FullTextIndexing   --全文键:当前表中唯一索引名称
    45. ON [Catalog_Test]               --指定全文目录
    46. WITH (
    47. STOPLIST [Stoplist_Test],   --指定全文非索引字表
    48. CHANGE_TRACKING AUTO        --自动填充
    49. );
    50. GO
    51. --  更改全文索引的属性
    52. --  https://msdn.microsoft.com/zh-cn/library/ms188359(v=sql.105).aspx
    53. --  激活全文索引
    54. ALTER FULLTEXT INDEX ON [dbo].[FullTextIndexing] ENABLE;
    55. GO
    56. --  删除全文索引
    57. --  https://msdn.microsoft.com/zh-cn/library/ms184393(v=sql.105).aspx
    58. DROP FULLTEXT INDEX ON [dbo].[FullTextIndexing];
    59. GO
    1. --  测试常规查询方法(先查询全部数据,放到内存:154万行31秒)
    2. SELECT * FROM FullTextIndexing
    3. SET STATISTICS IO ON
    4. SET STATISTICS TIME ON
    5. SELECT * FROM FullTextIndexing WHERE Sentence LIKE '%全文索引%'
    6. /*执行了几遍,耗时13440 毫秒
    7. SQL Server 分析和编译时间:
    8. CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
    9. (229376 行受影响)
    10. 表 'FullTextIndexing'。扫描计数 1,逻辑读取 15633 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    11. SQL Server 执行时间:
    12. CPU 时间 = 11591 毫秒,占用时间 = 13440 毫秒。
    13. */
    14. SELECT * FROM FullTextIndexing WHERE CHARINDEX('全文索引',Sentence)<>0
    15. /*执行了几遍,耗时15338 毫秒
    16. SQL Server 分析和编译时间:
    17. CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
    18. (229376 行受影响)
    19. 表 'FullTextIndexing'。扫描计数 1,逻辑读取 15633 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    20. SQL Server 执行时间:
    21. CPU 时间 = 12714 毫秒,占用时间 = 15338 毫秒。
    22. */

    1. --  使用全文索引的方法:
    2. SELECT * FROM [dbo].[FullTextIndexing] WHERE FREETEXT(Sentence,'全文索引');
    3. /*执行了几遍,耗时17402 毫秒
    4. SQL Server 分析和编译时间:
    5. CPU 时间 = 16 毫秒,占用时间 = 21 毫秒。
    6. (851968 行受影响)
    7. 表 'FullTextIndexing'。扫描计数 1,逻辑读取 15633 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    8. SQL Server 执行时间:
    9. CPU 时间 = 2230 毫秒,占用时间 = 17402 毫秒。
    10. */

    1. --  执行了17秒,不降反而上升了!!~
    1. --  重新生成全文目录!~再执行(更多方法有待参考:使用全文搜索查询 SQL Server)
    2. --  https://msdn.microsoft.com/zh-cn/library/ms142559(v=sql.105).aspx
    3. ALTER FULLTEXT CATALOG [Catalog_Test] REBUILD;
    4. GO
    5. SELECT * FROM [dbo].[FullTextIndexing] WHERE FREETEXT(Sentence,'全文索引');
    6. SELECT * FROM [dbo].[FullTextIndexing] WHERE CONTAINS(Sentence,'全文索引');
    7. SELECT * FROM [dbo].[FullTextIndexing] WHERE CONTAINS(Sentence,'全文 AND 索引');
    8. /*这时快多了!~不到1秒就查询完成!~但是返回的行数才1000多行
    9. SQL Server 分析和编译时间:
    10. CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
    11. (8853 行受影响)
    12. 表 'FullTextIndexing'。扫描计数 0,逻辑读取 27121 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    13. SQL Server 执行时间:
    14. CPU 时间 = 78 毫秒,占用时间 = 944 毫秒。
    15. */
    16. SET STATISTICS IO OFF
    17. SET STATISTICS TIME OFF
    1. 不断地执行就会找出规律:
    2. 表扫描次数为0。
    3. 逻辑读也越来越多,耗时越来越多,查询返回的行数也越来越多,性能越来越差!~比"like"还差
    4. 最后还得重建重组(REBUILD/REORGANIZE)全文索引目录
    5. 逻辑读取 27121 次
    6. 逻辑读取 945268 次
    7. 逻辑读取 1212885 次
    8. 逻辑读取 1407846 次
    9. 逻辑读取 1736686 次
    10. 逻辑读取 1953265 次
    1. --  查询句词拆分结果.可以看到按什么词语进行匹配查询
    2. select * from sys.dm_fts_parser('全文索引',2052,5,0)
    3. --  如果只需要全文键或排名的信息,可使用表值函数
    4. --  使用表值函数的方法可以使用联接提示或查询提示(LOOP/MERGE/HASH)
    5. ALTER FULLTEXT CATALOG [Catalog_Test] REBUILD;
    6. GO
    7. ALTER FULLTEXT CATALOG [Catalog_Test] REORGANIZE;
    8. GO
    9. SELECT * FROM [dbo].[FullTextIndexing] t1
    10. INNER JOIN CONTAINSTABLE([FullTextIndexing],Sentence,'概述') AS t2
    11. ON t1.ID = t2.[KEY]
    12. GO
    13. SELECT * FROM [dbo].[FullTextIndexing] t1
    14. INNER JOIN FREETEXTTABLE([FullTextIndexing],Sentence,'概述',LANGUAGE 2052,1000) AS t2
    15. ON t1.ID = t2.[KEY]
    16. ORDER BY t2.RANK DESC;
    17. GO
    1. --  相关视图:
    2. select * from sys.syslanguages
    3. select * from sys.fulltext_indexes
    4. select * from sys.fulltext_catalogs where name = 'Catalog_Test'
    5. select * from sys.dm_fts_active_catalogs where name = 'Catalog_Test'
    6. select * from sys.fulltext_stoplists where name = 'Stoplist_Test'
    7. select * from sys.fulltext_stopwords where stoplist_id = 5 --and language_id = 2052
    8. select * from sys.dm_fts_parser('全文索引',2052,5,0)
     
 

SQLSERVER 建立全文检索的更多相关文章

  1. 利用whoosh对mongoDB的中文文档建立全文检索

    1.建立索引 #coding=utf-8 from __future__ import unicode_literals __author__ = 'zh' import sys,os from wh ...

  2. 如何在sqlserver建立新用户并关联相应的数据库

    我们经常需要在数据库上建立有权限的用户,该用户只能去操作某个特定的数据库(比如该用户只能去读,去写等等),那么我们应该怎么在sqlserver上设置呢?下面的步骤有点长,只要一步一步跟着设置就行 方法 ...

  3. 如何解决无法通过SSL加密与SQLServer建立连接

    在部署项目时,经常会遇到驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接,错误:Java.lang.RuntimeException: Could not gene ...

  4. SQLSERVER建立MYSQL连接服务器

    1. 在SQL SERVER端安装MYSQL的ODBC驱动 2. 在ODBC数据源添加MYSQL(控制面板\所有控制面板项\管理工具) 在用户DSN 和系统DSN添加配置驱动程序 注:字符集一定要和M ...

  5. 在与SQLServer建立连接时出现与网络相关的或特定于实例的错误

    标题: 连接到服务器 ------------------------------ 无法连接到 (local). ------------------------------ 其他信息: 在与 SQL ...

  6. Sqlserver建立Oracle的鏈接服務器

    --建立数据库链接服务器 EXEC sp_addlinkedserver @server =N'TestOracle', --要创建的链接服务器别名 @srvproduct=N'Oracle', -- ...

  7. SQL Server 之 在与SQLServer建立连接时出现与网络相关的或特定于实例的错误

    背景:在用数据库时,打开SQL Server 2008 R2 的 SQL Server Management Studio,输入sa的密码发现,无法登陆数据库,提示信息如上: 解决方案: 1.打开Sq ...

  8. SqlServer建立存储过程,方便.NET插入自增字段

    首先,需要在数据库中创建一个表,以在test数据库创建tableNo表为例: create table tablesNo ( tableName ) not null, --表名 num int no ...

  9. sqlserver建立远程查询

    开始远程查询前: ----open:Ad Hoc Distributed QueriesEXEC sp_configure 'show advanced options',1reconfigureex ...

随机推荐

  1. [MEF] 学习之一 入门级的简单Demo(转)

    MEF 的精髓在于插件式开发,方便扩展. 我学东西,习惯性的先搞的最简单的Demo出来,看看有没有好玩的东东,然后继续深入.这个博文,不谈大道理,看demo说事儿. 至于概念,请google ,大把大 ...

  2. UML中的几种关系(UML Relationships)

    依赖(Dependency) 依赖可以理解为一个类A使用到了另一个类B,而这种使用关系是具有偶然性的.临时性的.非常弱的,但是B类的变化会影响到A:比如某人要过河,需要借用一条船,此时人与船之间的关系 ...

  3. kong k8s 安装 以及可视化管理界面

    1. git  clone $ git clone git@github.com:Mashape/kong-dist-kubernetes.git $ cd kong-dist-kubernetes ...

  4. 关于1024:堆栈下溢的错误(1024. Stack Underflow Occurred)

    http://blog.163.com/sylar_lin/blog/static/192332093201111242412487/ 今天碰到个很奇怪的问题,注释掉下面的trace,realse版本 ...

  5. FastAdmin 如何升级?

    FastAdmin 如何升级? 官方推荐使用 git 升级 FastAdmin. 升级 FastAdmin 核心代码 git stash git pull git stash pop 更新前端组件 比 ...

  6. 解决EditPlus的默认编码方式有关问题(转)

    http://blog.csdn.net/hzhsan/article/details/7911660 最近在使用英文版的Editplus写代码的时候,发现中文字符在调试过程中都变成了乱码, 发现是E ...

  7. (四)、Fiddler打断点

    一.打断点是Fiddler一个比较好用的功能,它可以做一些手工操作很难做的事情. 那为什么要打断点? 看下图,Fiddler打开后,Client(客户端)发送的请求会先经过Fiddler,然后Fidd ...

  8. Asp.net Mvc 过滤器执行顺序

    Asp.net Mvc 过滤器执行顺序: IAuthorizationFilter(OnAuthorization)----->IActionFilter(OnActionExecuting)- ...

  9. laravel的model例子

    5里面直接artisan建立model ./artisan make:model MyModel 找到MyModel,改成下面这样 <?php namespace App; use Illumi ...

  10. 0基础自学php教程

    轻松搞定网页设计之html 一.HTML介绍 1. HTML概念 HTML(Hyper Text Markup Language),即超文本标记语言.是目前网络上应用最为广泛的语言,是构成网页文档的主 ...