创建Catalog
现在您需要创建一个全文catalog。该目录似乎是一个容器,把所有的全文索引到。因此,如果你要搜索需要的三个表的文本,需要生成三个索引(每个表一个索引),并且把三个索引放在一个catalog中。
提示:在微软网站涉及相关操作的一些信息到需要SQL完整版本,如“Storage folder”就是Express版本没有的。
别着急,下面大家来不通过管理界面手动创建一下catalog。Demo中,只创建了一个catalog,并把两个full-text index放入其中。个人的一些经验,如果一个index涉及的数据量较大,你应该为每一个index创建一个单独的catalog。
下面操作是如何创建一个catalog:
- 程序—SQL SERVER管理界面—连接需要操作的数据库
- 点击 “New Query”
- 输入:
use DBName go EXEC sp_fulltext_database ‘enable’ go CREATE FULLTEXT CATALOG catalogName go |
说明:DBName指要操作数据库名称;catalogName指catalog的名字,根据自己需要定义
- 执行上述SQL语句,将会做两件事情,在相应数据库上enable fulltext searching;创建全文目录
提示:如果目录将会很大的话,把目录放在其他硬盘或者地址会是一个明智的选择。这样会很大程度的提高性能。
创建全文索引
创建全文索引的一个前提是,表中必须有这样的一个索引“unique, single-column, non-nullable index”。大多数情况下,主键都会满足这样的要求。
SQL Server这样做的实际要求是:
1. 必须有非空索引(主键都会满足这样的要求)。
2. 索引必须作用在单独一个列上。复合主键是不满足这个要求,一个work around是可以新建立一列,如textid,int型,自增,并建立索引。
提示:如果你的主键过长,笔者也建议新建一个int型自增列,例如主键是GUID的话,那么创建全文索引开销会是非常巨大的。
创建全文索引步骤
- 保证上面提到的条件; unique, single-column, non-nullable index
- 输入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*”‘这样是查不出东西的,大家如有办法,欢迎指点
一些调试方法
- SQL Server Log: C:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/LOG
- 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 |
结论
全文检索很容易建立,一旦建立,快速的响应将给使用者和用户带来惊喜!