比较简单的拆词查询

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 )
所以建议新建一个空数据库,然后再到查询分析器里运行以上代码...*/ 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值