经常在网络上看到“相关文章”或“相似文章”功能,昨天晚上突发奇想,也想在我的网站上实现。睡前躺床上想了一下大概流程及数据库表的设计,一会就睡着了(个人习惯,想事情很快就会入睡
)
今天早上上班后立马开始着手实现,首先对数据库表进行了设计。结构如下:
文章关系表(文章id1,文章id2,关联度)
然后对程序做了设计:
添加文章的时候:
这个功能是基于关键字的,我文章中的各个关键字是以英文的逗号","进行隔开的,所以通过split函数将各个关键字取出来。将得到的关键字去按照文章表理的标题和关键字进行模糊查找。
select id from artile where title (like '%keyword%' or keywords like '%keyword%') and id<>本文id(请注意红色部分内容,不能将自己查出来了)
将查找结果填充在记录集recordset里,然后遍历这个记录集。
遍历的时候,需要查询遍历到的文章id是否和本文章已经建立和关联(因为有些文章关联度高,通过关键字建立的关联度>1),如果没有建立关联,则建立;如果已经建立关联,则关联度+1
do while not recordset.eof
set rs1=server.createobject("adodb.recordset")
rs1.open "select * from article_relation where (articleid=本文id and articleid1=recordset.id) or (articleid1=recordset.id and articleid=本文id)",conn,1,3
(请注意以上代码红色部分,recordset.id=遍历到的文章id。为了减少数据冗余,id1和id2的关联等于id2和id1的关联,所以用关键字or查询)
if rs1.recordcount>1 then
(如果关联已经存在,则关联度+1)
rs1("关联度")=rs1("关联度")+1
else
(如果不存在管理,则建立)
rs1.addnew
rs1("文章id1")=本文id
rs1("文章id2")=遍历到的id,recordset.id
rs1("关联度")=1
rs1.update
end if
rs1.close
loop
至此,关联表已经建立。
编辑文章功能,为了保证关联度准确,得先将原有的关联删除,再按照以上思路建立新的关联:
delete * from 文章关联表 where 文章id1=本文id or 文章id2=本文id
删除文章功能则用以上代码直接将关联删除。
显示相关文章:
"select top n * from 文章关联表 where 文章id1=本文id or 文章id2=本文id order by 关联度 desc"
查询前n条相关文章,因为关联是双向的,所以查询的时候既要查文章id1又要查文章id2,查询结果按照关联度降序显示。
比如本文id为3,关联度表为以下内容:
文章id1
| 文章id2
| 关联度
|
1
| 2
| 2
|
1
| 3
| 1
|
2 | 3 | 2 |
3
| 4
| 1
|
运行查询代码后,得到的结果如下:
这样就存在文章id3既在文章id1中,又在文章id2中的现象。所以在显示的时候做了如下处理:
if 本文id=文章id1 then
显示文章id2
else
显示文章id1
end if
总之就是不能显示本文id本身。
这样,就实现了相关文章功能。