--在执行该脚本程序之前启动sql server的全文搜索服务,即microsoft search服务
use AMS10 --打开数据库
go
--检查pubs是否支持全文索引,如果不支持全文索引,则使用sp_fulltext_datebase打开该功能
if (select databaseproperty ('AMS10','IsFulltextEnables'))=0
execute sp_fulltext_database 'enable'
--建立全文目录FT_orderform
execute sp_fulltext_catalog 'FT_orderform','create'
--为T_orderform表建立全文索引数据元
execute sp_fulltext_table 'T_orderform','create','FT_orderform','ORDERID'
--设置全文索引列名
execute sp_fulltext_column 'T_orderform','ticketno','add'
execute sp_fulltext_column 'T_orderform','Passengers','add'
--execute sp_fulltext_column 'T_orderform','notes','add'
--建立全文索引
execute sp_fulltext_table 'T_orderform','activate'
--填充全文索引目录
execute sp_fulltext_catalog 'FT_orderform','start_full'
GO
--检查全文目录填充情况
WHILE FulltextCatalogProperty('FT_orderform','PopulateStatus')<>0
BEGIN
--如果全文目录正处于填充状态,则等待30秒后再检测一次
WAITFOR DELAY '0:0:30'
END
--全文目录填充完成后,使用全文目录检索
--查询title列或notes列中包含有database或computer字符串的图书名称
SELECT ticketno
FROM T_orderform
where contains(ticketno,'7812388833444')
SELECT top 10 ticketno FROM T_orderform where ticketno!=''
--7812114904851|7812114904852
--CONTAINS(Name, 'Mountain');
select passengers,* from T_orderform where contains(passengers,'takei/toshiaki')
select passengers,* from T_orderform where contains(passengers,'*郑宝斌')
前面是建全文索引的一个实例,测试成功过的,注意要打开全文索引服务,AMS10这个是库名,T_orderform这个是表名,ticketno和Passengers这个是列名。
你会发现select passengers,* from T_orderform where contains(passengers,'*郑宝斌')
这个能不出结查,但select passengers,* from T_orderform where contains(passengers,'takei/toshiaki')可以,原因是全文索引的字符集不对,中文的查不出来
以下为contains一些常用的用法:
我们通过例子来学习,假设有表 students,其中的 address 是全文本检索的列。
1. 查询住址在北京的学生
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'beijing' )
remark: beijing是一个单词,要用单引号括起来。
2. 查询住址在河北省的学生
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"HEIBEI province"' )
remark: HEBEI province是一个词组,在单引号里还要用双引号括起来。
3. 查询住址在河北省或北京的学生
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"HEIBEI province" OR beijing' )
remark: 可以指定逻辑操作符(包括 AND ,AND NOT,OR )。
4. 查询有 '南京路' 字样的地址
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'nanjing NEAR road' )
remark: 上面的查询将返回包含 'nanjing road','nanjing east road','nanjing west road' 等字样的地址。
A NEAR B,就表示条件: A 靠近 B。
5. 查询以 '湖' 开头的地址
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"hu*"' )
remark: 上面的查询将返回包含 'hubei','hunan' 等字样的地址。
记住是 *,不是 %。
6. 类似加权的查询
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'ISABOUT (city weight (.8), county wright (.4))' )
remark: ISABOUT 是这种查询的关键字,weight 指定了一个介于 0~1之间的数,类似系数(我的理解)。表示不同条件有不同的侧重。
7. 单词的多态查询
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' )
remark: 查询将返回包含 'street','streets'等字样的地址。
对于动词将返回它的不同的时态,如:dry,将返回 dry,dried,drying 等等。