SQLSERVER 建立全文检索


  1.  
     在CODE上查看代码片
    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. --  创建聚集索引  
    10. ALTER TABLE FullTextIndexing ADD CONSTRAINT PK_FullTextIndexing PRIMARY KEY CLUSTERED(ID ASC)  
    11. GO  
    12.   
    13. --  将"全文搜索概述"页面的文字全部拷贝到txt,然后倒入到表FullTextIndexing中  
    14. --  https://msdn.microsoft.com/zh-cn/library/ms142547(v=sql.105).aspx  
    15.   
    16.   
    17. --  重复15次,从47行变为154万行  
    18. INSERT INTO FullTextIndexing(Sentence)  
    19. SELECT Sentence FROM FullTextIndexing  
    20. GO 15  
    21.   
    22.   
    23. SELECT COUNT(*) FROM FullTextIndexing  


     
     在CODE上查看代码片
    1. --  【注】删除的语句不要执行!  


     
     在CODE上查看代码片
    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.   
    11. --  更改全文目录的属性  
    12. --  https://msdn.microsoft.com/zh-cn/LIBRARY/ms176095(v=sql.105).aspx  
    13. ALTER FULLTEXT CATALOG [Catalog_Test]   
    14. REBUILD WITH ACCENT_SENSITIVITY = ON;   --重新生成整个目录并区分重音  
    15. --REORGANIZE;   --重新组织全文目录  
    16. --AS DEFAULT;   --指定此目录为默认目录  
    17. GO  
    18.   
    19. --  从数据库中删除全文目录(先删除全文索引)  
    20. --  https://msdn.microsoft.com/zh-cn/LIBRARY/ms188403(v=sql.105).aspx  
    21. DROP FULLTEXT CATALOG [Catalog_Test];  
    22. GO  
    23.   
    24.   
    25. --  创建干扰字表  
    26. --  https://msdn.microsoft.com/zh-cn/library/cc280405(v=sql.105).aspx  
    27. CREATE FULLTEXT STOPLIST [Stoplist_Test]   
    28. FROM SYSTEM STOPLIST   
    29. AUTHORIZATION [dbo];  
    30. GO    
    31.   
    32. --  添加删除干扰字  
    33. --  https://msdn.microsoft.com/zh-cn/library/cc280871(v=sql.105).aspx  
    34. ALTER FULLTEXT STOPLIST [Stoplist_Test]  
    35. ADD N'乎' LANGUAGE 2052;  
    36. GO   
    37.   
    38. ALTER FULLTEXT STOPLIST [Stoplist_Test]  
    39. DROP N'乎' language 2052;     
    40. --ALL LANGUAGE 'English'   
    41. --ALL  
    42. GO   
    43.   
    44. --  从数据库中删除全文本非索引字表  
    45. --  https://msdn.microsoft.com/zh-cn/library/cc280482(v=sql.105).aspx  
    46. DROP FULLTEXT STOPLIST [Stoplist_Test];  
    47. GO   
    48.   
    49.   
    50. --  创建全文索引  
    51. --  https://msdn.microsoft.com/zh-cn/library/ms187317(v=sql.105).aspx  
    52. CREATE FULLTEXT INDEX ON [dbo].[FullTextIndexing]  
    53. (Sentence LANGUAGE 2052)        --索引列,明确列中存储的语言,方便过滤  
    54. KEY INDEX PK_FullTextIndexing   --全文键:当前表中唯一索引名称  
    55. ON [Catalog_Test]               --指定全文目录  
    56. WITH (  
    57.     STOPLIST [Stoplist_Test],   --指定全文非索引字表  
    58.     CHANGE_TRACKING AUTO        --自动填充  
    59.     );  
    60. GO  
    61.   
    62. --  更改全文索引的属性  
    63. --  https://msdn.microsoft.com/zh-cn/library/ms188359(v=sql.105).aspx  
    64. --  激活全文索引  
    65. ALTER FULLTEXT INDEX ON [dbo].[FullTextIndexing] ENABLE;  
    66. GO  
    67.   
    68. --  删除全文索引  
    69. --  https://msdn.microsoft.com/zh-cn/library/ms184393(v=sql.105).aspx  
    70. DROP FULLTEXT INDEX ON [dbo].[FullTextIndexing];  
    71. GO  

     

     

     


     
     在CODE上查看代码片
    1. --  测试常规查询方法(先查询全部数据,放到内存:154万行31秒)  
    2. SELECT * FROM FullTextIndexing  
    3.   
    4. SET STATISTICS IO ON  
    5. SET STATISTICS TIME ON  
    6.   
    7. SELECT * FROM FullTextIndexing WHERE Sentence LIKE '%全文索引%'  
    8. /*执行了几遍,耗时13440 毫秒  
    9.   
    10. SQL Server 分析和编译时间:   
    11.    CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。  
    12.   
    13. (229376 行受影响)  
    14. 表 'FullTextIndexing'。扫描计数 1,逻辑读取 15633 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。  
    15.   
    16.  SQL Server 执行时间:  
    17.    CPU 时间 = 11591 毫秒,占用时间 = 13440 毫秒。  
    18. */  
    19.   
    20. SELECT * FROM FullTextIndexing WHERE CHARINDEX('全文索引',Sentence)<>0  
    21. /*执行了几遍,耗时15338 毫秒  
    22.   
    23. SQL Server 分析和编译时间:   
    24.    CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。  
    25.   
    26. (229376 行受影响)  
    27. 表 'FullTextIndexing'。扫描计数 1,逻辑读取 15633 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。  
    28.   
    29.  SQL Server 执行时间:  
    30.    CPU 时间 = 12714 毫秒,占用时间 = 15338 毫秒。  
    31. */  


     

     


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


     

     


     
     在CODE上查看代码片
    1. --  执行了17秒,不降反而上升了!!~  


     
     在CODE上查看代码片
    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.   
    9. /*这时快多了!~不到1秒就查询完成!~但是返回的行数才1000多行  
    10.   
    11. SQL Server 分析和编译时间:   
    12.    CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。  
    13.   
    14. (8853 行受影响)  
    15. 表 'FullTextIndexing'。扫描计数 0,逻辑读取 27121 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。  
    16.   
    17.  SQL Server 执行时间:  
    18.    CPU 时间 = 78 毫秒,占用时间 = 944 毫秒。  
    19. */  
    20. SET STATISTICS IO OFF  
    21. SET STATISTICS TIME OFF  

    [sql] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. 不断地执行就会找出规律:  
    2. 表扫描次数为0。  
    3. 逻辑读也越来越多,耗时越来越多,查询返回的行数也越来越多,性能越来越差!~比"like"还差  
    4. 最后还得重建重组(REBUILD/REORGANIZE)全文索引目录  
    5.   
    6. 逻辑读取 27121 次  
    7. 逻辑读取 945268 次  
    8. 逻辑读取 1212885 次  
    9. 逻辑读取 1407846 次  
    10. 逻辑读取 1736686 次  
    11. 逻辑读取 1953265 次  


     
     在CODE上查看代码片
    1. --  查询句词拆分结果.可以看到按什么词语进行匹配查询  
    2. select * from sys.dm_fts_parser('全文索引',2052,5,0)  
    3.   
    4.   
    5. --  如果只需要全文键或排名的信息,可使用表值函数  
    6. --  使用表值函数的方法可以使用联接提示或查询提示(LOOP/MERGE/HASH)  
    7. ALTER FULLTEXT CATALOG [Catalog_Test] REBUILD;  
    8. GO  
    9. ALTER FULLTEXT CATALOG [Catalog_Test] REORGANIZE;  
    10. GO  
    11.   
    12. SELECT * FROM [dbo].[FullTextIndexing] t1   
    13. INNER JOIN CONTAINSTABLE([FullTextIndexing],Sentence,'概述') AS t2  
    14. ON t1.ID = t2.[KEY]  
    15. GO  
    16.   
    17. SELECT * FROM [dbo].[FullTextIndexing] t1   
    18. INNER JOIN FREETEXTTABLE([FullTextIndexing],Sentence,'概述',LANGUAGE 2052,1000) AS t2  
    19. ON t1.ID = t2.[KEY]  
    20. ORDER BY t2.RANK DESC;  
    21. GO  


     

     


     
     在CODE上查看代码片
    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)  
     

     

 
posted @ 2017-04-17 09:47  雨姗  阅读(742)  评论(0编辑  收藏  举报