SQL Server 全文检索初探

来源:互联网 发布:谷歌软件 编辑:程序博客网 时间:2024/05/01 23:57

创建Catalog

现在您需要创建一个全文catalog。该目录似乎是一个容器,把所有的全文索引到。因此,如果你要搜索需要的三个表的文本,需要生成三个索引(每个表一个索引),并且把三个索引放在一个catalog中。
提示:在微软网站涉及相关操作的一些信息到需要SQL完整版本,如“Storage folder”就是Express版本没有的。

别着急,下面大家来不通过管理界面手动创建一下catalog。Demo中,只创建了一个catalog,并把两个full-text index放入其中。个人的一些经验,如果一个index涉及的数据量较大,你应该为每一个index创建一个单独的catalog。

下面操作是如何创建一个catalog:

  1. 程序—SQL SERVER管理界面—连接需要操作的数据库
  2. 点击 “New Query”
  3. 输入:
use DBName
go
EXEC sp_fulltext_database ‘enable’
go
CREATE FULLTEXT CATALOG catalogName
go

 

说明:DBName指要操作数据库名称;catalogName指catalog的名字,根据自己需要定义

  1. 执行上述SQL语句,将会做两件事情,在相应数据库上enable fulltext searching;创建全文目录

提示:如果目录将会很大的话,把目录放在其他硬盘或者地址会是一个明智的选择。这样会很大程度的提高性能。

创建全文索引

创建全文索引的一个前提是,表中必须有这样的一个索引“unique, single-column, non-nullable index”。大多数情况下,主键都会满足这样的要求。

SQL Server这样做的实际要求是:

1. 必须有非空索引(主键都会满足这样的要求)。

2. 索引必须作用在单独一个列上。复合主键是不满足这个要求,一个work around是可以新建立一列,如textid,int型,自增,并建立索引。

提示:如果你的主键过长,笔者也建议新建一个int型自增列,例如主键是GUID的话,那么创建全文索引开销会是非常巨大的。

创建全文索引步骤

  1. 保证上面提到的条件; unique, single-column, non-nullable index
  2. 输入SQL 语句
CREATE FULLTEXT INDEX ON yourdatabase.dbo.yourtable
(
column_to_index
Language 0X0
)
KEY INDEX yourindex ON yourcatalog
WITH CHANGE_TRACKING AUTO

说明:

yourdatabase.dbo.yourtable 使用者数据库的名字和表明

column_to_index 含有全文内容的列

yourindex表里的索引(就是上面描述需满足unique, single-column, non-nullable index的索引)

yourcatalog 本文开始时创建过的catalog名字

Language:告诉 SQL Server可以是任意语言(当然你也可以通过Management Studio修改成中文,英文等,具体语言编码这里不敖述)

提示:如果你的表数据量很大,建立全文索引会需要一定的时间,甚至会出现一段时间CPU使用率为100%的情况。

使用全文检索

下面来使用一下,输入SQL语句:

SELECT description
FROM yourtable
WHERE CONTAINS(description, '"NBA Playoff"')

提示:

1. 字符串的格式,最外面是单引号,里面是双引号,最里面是要查找的文本。

2.  想要模糊一把的话,请使用*,  如’”NBA*”‘会查找所有以NBA开头的文本。

3. 不支持开始模糊,笔者不才,’”*BA*”‘这样是查不出东西的,大家如有办法,欢迎指点

一些调试方法

  1. SQL Server Log: C:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/LOG
  2. FullText Index Log: SQLFTxxxxxx.LOG

提示:可读性很差,但真正了解之后对Debug是很有帮助的。

其他

1.  SQL Server 2005之后,允许一个表拥有两个及以上全文索引。

2.  查找表中哪一列作为全文检索列 select * from sys.fulltext_indexes

3.  如何添加一个全文索引

exec sp_fulltext_column ‘tabname’, ‘colname’, 'add', '2057'

说明:

tabname:  一段或两段的表名。该表必须已经存在于当前的数据库中。该表必须有全文索引。

colname:  是 qualified_table_name 中某个列的名称。该列必须是一个字符,或是一个 image 列,不能是一个已计算列。

2057:    表示语言, code ‘2057′ 表示 UK English

区域设置区域设置 ID中性0简体中文0×0804繁体中文0×0404荷兰语0×0413英国英语0×0809美国英语0×0409法语0×040c德国0×0407意大利0×0410日语0×0411朝鲜语0×0412现代西班牙语0×0c0a普通瑞典语0×041d

 

结论

全文检索很容易建立,一旦建立,快速的响应将给使用者和用户带来惊喜!

原创粉丝点击