• 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)  
       

       

     
  • 相关阅读:
    Java Comparator字符排序(数字、字母、中文混合排序)
    java获取文件列表,并按照目录的深度及文件名的拼音的升序排列
    dwz Esc关闭dialog 窗口
    java实现在线浏览zip文件及文件下载
    慎用ArrayList的contains方法,使用HashSet的contains方法代替
    java监控指定路径下文件及文件夹变化
    java实现八种排序算法并测试速度
    java collection.frequency方法
    Java基础知识
    java List转换为字符串并加入分隔符的一些方法总结
  • 原文地址:https://www.cnblogs.com/shanshanlaichi/p/6721446.html
Copyright © 2020-2023  润新知