• sql server 全文索引


    以牺牲空间来换取时间的 sql full-text 具体的实现方案如下所示:

    1:在Sql脚本中完成full-text的创建【假设我将Users表中的LoginName字段(nvarchar)与DisplayName字段(nvarchar),Sites表中的Properties字段(xml)加入到full-text文件中】

    --检查数据库MyDB是否支持全文索引,如果不支持
    
    --则使用sp_fulltext_database 打开该功能
    
    if(select databaseproperty('MyDB','isfulltextenabled'))=0
    
      execute sp_fulltext_database 'enable'
    
     
    --建立全文目录FT_MyDB(最后的参数e:/fulltext是自定义的存储目录,要是去掉将会在系统默认的地方创建相应的存储文件)
    
    execute sp_fulltext_catalog 'FT_MyDB','create','e:/fulltext'
    
    
    --创建唯一索引(这里一定要先将系统默认为主键创建的聚簇索引删除掉,因为一个表中只能有一个聚簇索引)
    create unique clustered index UsersId on dbo.Users(Id)
    
    create unique clustered index SitesId on dbo.Sites(Id)
    
     
    --为Users表和Sites表建立全文索引数据元
    
    execute sp_fulltext_table 'Users','create','FT_MyDB','UsersId'
    
    execute sp_fulltext_table 'Sites','create','FT_MyDB','SitesId'
    
    --设置全文索引列名,(Users表的LoginName和DisplayName,Sites表的Properties) execute sp_fulltext_column 'Users','LoginName','add' execute sp_fulltext_column 'Users','DisplayName','add' execute sp_fulltext_column 'Sites','Properties','add' --建立全文索引 --activate,是激活表的全文检索能力,也就是在全文目录中注册该表 execute sp_fulltext_table 'Users','activate' execute sp_fulltext_table 'Sites','activate' --填充全文索引目录 execute sp_fulltext_catalog 'FT_MyDB','start_full' go --检查全文目录填充情况 While fulltextcatalogproperty('FT_MyDB','populateStatus')<>0 begin --如果全文目录正处于填充状态,则等待30秒后再检测一次 waitfor delay '0:0:30' end

    2:用相应的语句就可以对设置了全文索引的列进行filter,具体语句如下所示:

    SELECT * FROM [MyDB].[dbo].[Users] WHERE CONTAINS(LoginName,'"ad*"') -–获取nvarchar字段LoginName中包含ad的记录
    
    SELECT * FROM [MyDB].[dbo].[Sites] WHERE CONTAINS(Properties,'"haha"') –获取xml字段Properties中包含haha的记录

    3:由于sql full-text不能实时与数据库的数据保持一致,因此要为数据表中的Full-Text Index运行相应的Incremental Population 或者 Full Population,这里我们可以通过手动创建一个Schedule机制对其定期执行,使full-text中的数据与数据库中的数据保持一致。

    不过这里也可以当我们去查找数据的时候,可执行一下sql 语句来完成Incremental Population的运行,来确保每次搜素出来的数据都是最新的,sql语句如下所示:

    execute sp_fulltext_catalog 'FT_My_DB','start_incremental'

    但是上面的两种方式都是我们自己去实现数据的同步,会损失一定的效率,我们可以用更好的一种方式:让sql server自己去做数据的同步,sql脚本如下所示:

    USE DGA_DB;
    
    GO
    
    ALTER FULLTEXT INDEX ON [My_DB].[dbo].[Users] SET CHANGE_TRACKING AUTO;
    
    GO

    4:关于Sql Server的全文索引,我们可以参考MSDN来获取更多的内容: 

         http://msdn.microsoft.com/zh-cn/library/ms142571

  • 相关阅读:
    完全卸载Android Studio(卸载得干干净净)
    每日生活总结1
    求解协方差矩阵
    每天一个linux命令:ifconfig命令 临时修改重启后恢复原样
    每天一个linux命令(58):telnet命令
    每天一个linux命令:pwd命令
    每天一个linux命令(38):cal 命令
    每天一个linux命令:scp命令
    login shell与non-login shell的区别
    linux下重要的网络配置文件
  • 原文地址:https://www.cnblogs.com/mingmingruyuedlut/p/2615652.html
Copyright © 2020-2023  润新知