if not object_id('KeywordTable') is null drop table KeywordTable
create table dbo.KeywordTable
(id int identity (1,1) not null,Primary key(id),num int not null default 0,
keyword nvarchar(50) not null default '词组')
--以下数据用来测试的
insert into KeywordTable(num,keyword)
values(1,'北京')
insert into KeywordTable(num,keyword)
values(1,'上海')
insert into KeywordTable(num,keyword)
values(1,'杭州')
insert into KeywordTable(num,keyword)
values(1,'系统')
insert into KeywordTable(num,keyword)
values(1,'测试')
insert into KeywordTable(num,keyword)
values(1,'留言')
insert into KeywordTable(num,keyword)
values(1,'流言蜚语')
insert into KeywordTable(num,keyword)
values(1,'无恶不作')
insert into KeywordTable(num,keyword)
values(1,'地区')
insert into KeywordTable(num,keyword)
values(1,'平果')
--以上数据用来测试的
declare @keywords nvarchar(200)
set @keywords='杭州系统我家在平果网名笨笨' --查询关键字
--首先创建一个虚拟表,用来存储待匹配的关键字,这个虚拟表可以加快一定的速度
declare @tb table
(
id int,keyword varchar(50)
)
--检测词库中匹配的词组,并将其插入虚拟表
insert @tb
select [id],keyword from [KeywordTable] where charindex(keyword,@keywords)>0
--拆词,首先创建一个虚拟表
declare @keyTable table
(
keyword varchar(50)
)
--先把整个查询字符串插入虚拟表中(因为整个字符串其实也是一个词)
insert @keyTable
select @keywords union
select keyword from @tb --这里先把所有匹配的关键字都插入虚拟表里了
--然后再使用游标开始拆词
declare @thisKey nvarchar(50) --拆从词库中查询出来的关键词存储到此变量
declare @leftKey nvarchar(50) --用来存储关键字左边的字符
-- declare @rightKey nvarchar(50) --用来存储关键字右边的字符
declare cursor_insert cursor for select [id] from @tb order by len(keyword) desc --定义游标,cursor_insert为游标名
declare @i int
declare @charat int --关键字的位置
open cursor_insert
fetch cursor_insert into @i --将ID值赋给@i
while @@fetch_status=0 --判断是否到表尾
begin
--取值
set @thisKey = (select top 1 keyword from @tb where [id]=@i order by len(keyword) desc)
while charindex(@thisKey,@keywords)>0
begin
--关键字左边的字符写入虚拟表
set @charat = charindex(@thisKey,@keywords)
set @leftKey = left(@keywords,@charat-1)
if @leftKey<>'' and len(@leftKey)>1
begin
insert @keyTable
select @leftKey
end
--剔除关键字
set @keywords=STUFF(@keywords,@charat,len(@thisKey),'')
--这里把剔除关键字后的剩余字符串插入虚拟表
if @keywords<>'' and len(@keywords)>1 and (select count(keyword) from @keyTable where keyword=@keywords)<1
begin
insert @keyTable
select @keywords
end
--数据插入虚拟表的操作结束了
end
--
fetch cursor_insert into @i --取下一记录的ID值赋给@i
end
close cursor_insert
deallocate cursor_insert
--查询
select * from @keyTable order by len(keyword) desc -- 列出拆词后的结果
--用拆解出来的关键字去查询数据库
--以下数据用来测试
if not object_id('msgTable') is null drop table msgTable
create table dbo.msgTable
(id int identity (1,1) not null,Primary key(id),title nvarchar(50) not null default '测试',
content ntext)
insert into msgTable(title,content)
values('北京/上海/杭州','北京,上海,杭州都能查询到的数据')
insert into msgTable(title,content)
values('北京/杭州','北京,杭州都能查询到的数据')
insert into msgTable(title,content)
values('杭州','只有杭州能查询到的数据')
insert into msgTable(title,content)
values('留言','只有留言能查询到的数据')
--select * from msgTable t where exists(select keyword from @keyTable where charindex(keyword,t.title)>0)
select msg.*,k.keyword from msgTable as msg,@keyTable as k where msg.title like '%' + k.keyword + '%'
/*以前没写过拆词程序,今天一时兴起,随手敲的代码,拆词效果不是很理想。
本人对T-SQL很不了解,所以写的有些零乱,没有整理成函数,也没测试在大数据量的时候的运行速度
恩,最主要的,全文索引也没创建,估计大数据量的时候会很慢...
以下代码会在数据库中建两个表(KeywordTable,msgTable )
所以建议新建一个空数据库,然后再到查询分析器里运行以上代码...*/