(MS SQL)如何实现相关文章功能(多关键字匹配)

博客主要展示了在MS SQL中实现多关键字匹配相关文章功能的代码。包含三个存储过程,分别用于更新相关文章细节、删除相关文章细节以及获取相关文章,通过对关键字的处理和表的连接查询来实现功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:大家或许会觉得很惊讶:为什么灵感之源会讨论SQL?或许应该这样说吧:搞业务系统,不跟SQL扯上关系似乎比较难。

场景:在开发某系统的过程中,我遇到了要实现“相关文章”功能:任何文章都可以定义“关键字”,每篇文章依靠这个“关键字”来确定其它文章是否跟它相关,如果没有定义关键字,则可能需要使用全文检索来实现了,这是别的话题了。

思考:因为允许关键字可以通过“,”分隔符号来定义多个,所以加大了难度。经过思考,可以通过在保存文章的时候便分解关键字,建立一关键字表,把所有关键字逐个按对应的文章ID来保存。并决定采用纯SQL存储过程的办法,因为这种重复的操作,与其用通用函数,倒不如用预编译的存储过程更加快,这样能把所有处理都留給SQL Server。

解决方案:首选要做的是在原有文章表(Details)的基础上建立相关文章表(RelatedDetails),字段包括ItemID(主键)、DetailID(文章ID)和Keyword(关键字)。以下是主要存储过程:

1、UpdateRelatedDetails:更新相关文章关键字

None.gifCREATE procedure dbo.UpdateRelatedDetails
None.gif
None.gif@DetailID 
INT,
None.gif@Keywords 
NVARCHAR(500)
None.gif
None.gif
AS
None.gif
None.gif
EXEC DeleteRelatedDetails @DetailID
None.gif
None.gif
DECLARE @I INT
None.gif
DECLARE @Keyword NVARCHAR(50)
None.gif
None.gif
SET @Keywords=REPLACE(@Keywords,''',')
None.gif
SET @Keywords=REPLACE(@Keywords,''',')
None.gif
SET @Keywords=RTRIM(LTRIM(@Keywords))
None.gif
None.gif
SET @I=CHARINDEX(',', @Keywords)
None.gif
None.gif
WHILE @I>=1
None.gif    
BEGIN
None.gif        
SET @Keyword=LEFT(@Keywords, @I-1)
None.gif        
INSERT INTO DetailKeywords (DetailID, Keyword) VALUES(@DetailID, @Keyword)
None.gif        
SET @Keywords=SUBSTRING(@Keywords, @I+1,LEN(@Keywords)-@I)
None.gif        
SET @I=CHARINDEX(',', @Keywords)
None.gif    
END
None.gif
None.gif
IF @Keywords<>''
None.gif    
INSERT INTO DetailKeywords (DetailID, Keyword) VALUES(@DetailID, @Keywords)
None.gif
GO
None.gif

2、DeleteRelatedDetails:删除原有相关文章关键字
None.gifCREATE PROCEDURE dbo.DeleteRelatedDetails
None.gif
None.gif@DetailID 
INT
None.gif
None.gif
AS
None.gif
None.gif
DELETE FROM DetailKeywords WHERE DetailID=@DetailID
None.gif
GO
None.gif

3、GetRelatedDetails:获取相关文章,其中Details就是文章表
None.gifCREATE procedure dbo.GetRelatedDetails
None.gif
None.gif@DetailID 
INT
None.gif
None.gif
AS
None.gif
None.gif
DECLARE @Keywords NVARCHAR(500)
None.gif
None.gif
SELECT @Keywords=Keywords FROM Details WHERE ItemID=@DetailID
None.gif
None.gif
IF @Keywords<>''
None.gif    
BEGIN
None.gif        
SELECT DISTINCT d.ItemID, d.Subject, d.ItemFile
None.gif        
FROM Details d RIGHT OUTER JOIN DetailKeywords k ON k.DetailID=d.ItemID         WHERE d.ItemID <> @DetailID AND @Keywords LIKE '%'+k.Keyword+'%'
None.gif    
END
None.gif
GO
None.gif


代码很简单,但希望能給大家带来一点思考:)

p.s.因为前台是使用.NET写的,那这个帖子也算是部分.NET技术了,呵呵。

转载于:https://www.cnblogs.com/unruledboy/archive/2004/10/21/55190.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值