SQL Server 2005的全文检索采用类似Lucece的技术, 为文本检索做index, 尤其适合大文本字段的检索, 性能比Lucece差一些. 著名的stackoverflow网站也使用过SQL server 2005 Full text search,  应该能满足多数性能要求.

==============================

安装并启用Full Text Search功能

============

完整安装了SQL Server 2005 企业版后, 在SQL server configure manager中启动全文检索(Fulltext search)服务,却报关联服务不存在. 原因是: 在注册表中, 将 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\msftesql 下的 DependOnService 的键值, 指明要依赖一个NTLMSSP服务, 而这个服务不存在, 简单地重命名这个 DependOnService 为其他名字, 然后重启机器, 就可以启动全文检索服务了.

某个DB如要开启Full Text功能, 需要在该DB的File 选项中, 选中full text复选框.

==============================

全文检索某个字段

==============================

入门文章

http://www.sql-server-performance.com/2010/full-text-search-2008/2/

进阶文章

https://www.simple-talk.com/sql/learn-sql-server/understanding-full-text-indexing-in-sql-server/

有4个全文检索的更新方式, 1个全量更新方式, 3个增量更新方式. 分别是:

1是全量更新full text 索引, 需要下SQL命令触发

2是基于时间戳字段的增量更新机制, 需要下SQL命令触发

3是SQL Server自动检查哪些记录发生变化, 并自动更新full text索引, 完全不需要下SQL命令触发.

4是SQL Server自动检查哪些记录发生变化, 但更新full text索引需要我们通过SQL命令来启动.

--全量刷新full text索引

ALTER FULLTEXT INDEX ON Production.Document START FULL POPULATION

--基于时间戳的增量刷新full text索引, 表必须有一个时间戳字段

ALTER FULLTEXT INDEX ON Production.Document START INCREMENTAL POPULATION

--自动检查基表数据的变化, 并自动更新full text索引

ALTER FULLTEXT INDEX ON Production.Document SET CHANGE_TRACKING AUTO

--手动检测基表的变化, 然后我们再通过第2个SQL来手动更新full text索引

ALTER FULLTEXT INDEX ON Production.Document SET CHANGE_TRACKING Manual

ALTER FULLTEXT INDEX ON Production.Document START UPDATE POPULATION

要注意的是, 通过SQL命令刷新full Text索引, SQL很快就执行完毕, 但并不意味着indexing过程已经结束了, 需要通过函数FULLTEXTCATALOGPROPERTY()来获取indexing的刷新状态, 另外该函数还可以查询index的age和占用空间等属性.

根据stackoverflow上的代码, 可以方便地获取更新状态, 我做了丁点改进, 修改后的代码放在文章的最后.  http://stackoverflow.com/questions/2727911/how-can-i-know-when-sql-full-text-index-population-is-finished

表的设计

表要支持全文检索, 这个表必须要有一个 "唯一的" 针对 "单列的" "非空" 索引,设为聚簇索引, (最好有一个单列的主键, 设为聚簇索引, 比如表有如下的约束语句.

CONSTRAINT [PK_ProductDocs_DocID] PRIMARY KEY CLUSTERED (DocID ASC)

另外, 推荐增加一个timestamp字段, 以支持基于时间戳的更新方式, (sqlserver中一个表只允许有一个时间戳字段,和子增量字段一样, 插入记录时该字段会被自动赋值的)

被全文检索的字段最好采用NVARCHAR或NVARCHAR(MAX), 支持长文本, 比text类型更高效.

==============================

查询

==============================

使用CONTAINS(), FREETEXT(),CONTAINSTABLE()进行全文查找.

select [productid],[Name],[Description] from Product where contains(Name,'"IBM" and "thinkpad" and "A21"')

--select c1 from ftstable where contains(*,'"apples" and "oranges"')

SQL Server 2005 全文搜索__收藏

http://blog.csdn.net/leamonjxl/article/details/7616120

==============================

性能方面的考虑

==============================

1. 全文检索是一个计算密集应用, 操作系统需要64bit, 多个CPU, 内存需要多一些

2. 使用SQL Server 企业版, 能充分发挥多CPU的计算优势

3. 数据库recovery mode采用simple, 减小数据库本身的磁盘IO

4. 如果全文检索表本身是append表, 我觉得全文检索更新机制采用基于时间戳的增量, 运行速度会更快一些, 需要实测.

5. 定期 shrink 全文检索的catalog, 方法是定期将全文检索表中冷数据挪到其他表中, 然后再用全量方式刷新缩小后的基表全文索引

6. 表设计方面: 如采用基于时间戳的增量更新方式, 为该时间戳字段设索引, 唯一主键采用bigint字段, 并设为聚集索引.

7. 全文检索表如果比较大, 采用分区表, 将访问该表的io分散在多个磁盘上. 如果表还是太大的话, 将该表作切分, 放到不同机器的SQL server上, 检索的时候, 采用linked server的方式将这些表再组合在一起.

8. 为Full text catalog设置一个专门的数据库文件组, 不是用默认的primary文件组, 分离磁盘IO.

9. 为每个全文索引分配单独的一个catalog,这样好查询每个索引占用空间和更新状态

10. 更多设置, 需要看SQL Server 2005 Full-Text Search: Internals and Enhancements 文档. 中文版http://msdn.microsoft.com/library/ms142560

SQLCat的 SQL Server 2005 full text Best Practices Article

http://technet.microsoft.com/library/Cc917695

================================

推荐使用SQL 2005 SP4

================================

经我实测, SQL 2005在全文检索方面要比SQL 2012做的好, 包括性能方面和速度稳定性方面. 未对比测试SQL 2008, 但考虑到SQL 2008 之后, 创建 catalog 不能指定 filegroup, 我觉得对于io分离很不利, 所以推荐使用SQL 2005。

实测(配置:CPU 2*8 core 33GHz, Memory 4GB), SQL 2005为400M的消息文件建full text 索引, 需要73秒, 性能还不错.  增加消息文件的大小, 耗时和消息文件大小基本按这个比例关系变化.

--获取全文检索catalog的状态

DECLARE @CatalogName VARCHAR(MAX)

SET     @CatalogName = 'your_catalog_name'

SELECT

DATEADD(ss, FULLTEXTCATALOGPROPERTY(@CatalogName,'PopulateCompletionAge'), '1/1/1990') AS LastPopulated

, FULLTEXTCATALOGPROPERTY(@CatalogName,'IndexSize') as IndexSize_MB

, FULLTEXTCATALOGPROPERTY(@CatalogName,'PopulateStatus') as PopulateStatusValue

,(SELECT CASE FULLTEXTCATALOGPROPERTY(@CatalogName,'PopulateStatus')

WHEN 0 THEN 'Idle'

WHEN 1 THEN 'Full Population In Progress'

WHEN 2 THEN 'Paused'

WHEN 3 THEN 'Throttled'

WHEN 4 THEN 'Recovering'

WHEN 5 THEN 'Shutdown'

WHEN 6 THEN 'Incremental Population In Progress'

WHEN 7 THEN 'Building Index'

WHEN 8 THEN 'Disk Full.  Paused'

WHEN 9 THEN 'Change Tracking' END) AS PopulateStatus

FROM sys.fulltext_catalogs AS cat

使用sql server2005全文检索的更多相关文章

  1. Sql server2005 优化查询速度50个方法小结

    Sql server2005 优化查询速度50个方法小结   Sql server2005优化查询速度51法查询速度慢的原因很多,常见如下几种,大家可以参考下.   I/O吞吐量小,形成了瓶颈效应.  ...

  2. 在WinCC中通过VBS操作SQL Server2005

    在项目中需要在一定条件满足时,保存一些数据到数据库中,并可根据条件查询.考虑到WinCC6.2以后采用的就是SQL Server2005数据库,所以直接利用该数据库即可,通过SQL Server Ma ...

  3. java连接sql server2005

    转自:http://blog.sina.com.cn/s/blog_889b58310100zqyz.html 一:配置 第一步:在网上下载SQLServer2005的驱动包 http://www.m ...

  4. SQL Server2005索引碎片分析和解决方法

    SQL Server2005索引碎片分析和解决方法 本文作者(郑贤娴),请您在阅读本文时尊重作者版权. 摘要: SQL Server,为了反应数据的更新,需要维护表上的索引,因而这些索引会形成碎片.根 ...

  5. sql Server2005 master损坏处理

    一.准备条件 a)         假设Master 数据库Hung:关闭SQL Server 服务(关闭MSSQLSERVER,SQL Server Agent其他的没有影响),然后剪切C:/Pro ...

  6. SQL Server2005安装配置以及测试

    SQL Server2005有2种版本,一种是集成版的, 一种是2个文件夹形式的.这里使用后者,安装文件夹名字为:SQL Server x86,该文件夹里面有Servers和Tools文件夹以及一些其 ...

  7. sql server2005主从数据库同步配置

    网站规模到了一定程度之后,该分的也分了,该优化的也做了优化,但是还是不能满足业务上对性能的要求:这时候我们可以考虑使用主从库.主从库是两台服务器上的两个数据库,主库以最快的速度做增删改操作+最新数据的 ...

  8. 安装SQL SERVER2005时,需要win7下安装IIS,记录下

    安装SQL server2005 时,需要先安装IIS,这里描述win7系统下配置IIS的方法. 虽然很多文章都有写过,这里只是重复一下 关键是IIS组件全都勾选上,如果没有全部勾选上,IIS组件没有 ...

  9. SQL Server2005使用CTE实现递归

    本文来自:http://www.cnblogs.com/wenjl520/archive/2010/01/18/1650393.html CTE递归原理: 递归CTE是由两个最小查询构建的.第一个是定 ...

随机推荐

  1. Ubuntu驱动摄像头

    之前研究Opencv的时候是安装了一个virtualbox的虚拟机,然后发现电脑自带的摄像头无法被识别. 后来买了一个罗技的C270,仍然无法识别,而且插入到虚拟机之后会导致虚拟机死机,原因未知. - ...

  2. 学习笔记——Maven超级POM

    2014-07-04:更新如何在安装程序中找到超级pom文件.Maven有一个超级POM,所有的POM均继承此文件.你可以使用解压工具打开jar文件$M2_HOME/lib/maven-model-b ...

  3. 总结一下工作中遇到的NPOI以及在ASP.NET MVC中的使用

    1.前言 相信大家在工作中经常要遇到一些导入导出Execl操作.学习贵在分享,分享使人快乐,园子里的前辈已经有很多好的文章,鄙人也是能力有限,在这里把这些好的文章总结,方便以后再工作中使用. NPOI ...

  4. javascript 事件传播与事件冒泡,W3C事件模型

    说实话笔者在才工作的时候就听说了什么"事件冒泡",弄了很久才弄个大概,当时理解意思是子级dom元素和父级dom元素都绑定了相同类型的事件,这时如果子级事件触发了父级也会触发,然后这 ...

  5. commonjs amd cmd的区别

    一篇博客告诉你三者的区别:http://zccst.iteye.com/blog/2215317 告诉你三者同requirejs seajs的区别:http://blog.chinaunix.net/ ...

  6. “未能加载文件或程序集“EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”

    产生原因: 使用nuget管理程序包,同一个解决方案里面有不同版本的Entity Framework,有可能在不同时间安装不同版本的Entity Framework,所以出现这个问题. 解决方案: 1 ...

  7. [codevs 1995]黑魔法师之门(并查集)

    题目:http://codevs.cn/problem/1995/ 分析:脑补一下满足题目要求的子图肯定就是环……于是题目就变成了不断加边求环的个数.看起来有点麻烦……但是环的实质是几个小环组合起来的 ...

  8. [转]C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe

    写在前面 原文地址:C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe 这篇文章躺在我的收藏夹中有很长一段时间了,今天闲着没事,就自己动手实践了一下.感觉 ...

  9. 8、面向对象以及winform的简单运用(事件与winform入门)

    事件 Visual studio中对可视化窗体控件的事件处理机理: 所有的.NET Framework可视化窗体控件的预定义事件,都会某一对应的“事件名+Handler”委托类型的变量.与此事件相关的 ...

  10. zabbix 乱码的问题

    文章转自:http://www.ttlsa.com/zabbix/zabbix-chinese-garbled-ttlsa/ 在使用zabbix的时候发现图片下方的中文都是一个个小方格 这是zabbi ...