关键词精确搜索问题,给分! (keyword:keyword keywords tag tags 关键词 搜索)

yzyun 2006-03-07 04:33:04
我有一个文章关键字对照表(talbe_1):
文章id 关键词
---------
1 中国
2 汽车
3 中国
3 汽车

现在我想在页面上搜索文章,类似于搜索引擎那种,输入了[中国 汽车],
我只想搜索到文章id为3的。

请教了,给分!!!
...全文
348 21 打赏 收藏 举报
写回复
21 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ldw701 2006-05-16
老大就是老大
  • 打赏
  • 举报
回复
esoft98 2006-05-15
??
  • 打赏
  • 举报
回复
esoft98 2006-05-13
yzyun:
你说的方法中,查找时,"米色 时尚 巴黎 裙子"只要符合一个即可搜索到商品.
但如果我想实现"与"的关系,即要同时满足"米色" "时尚" "巴黎" "裙子",你的设计就无法实现了.
还望高手指点.
  • 打赏
  • 举报
回复
esoft98 2006-05-13
也很想知道TAGS的设计以及实现方法
  • 打赏
  • 举报
回复
yzyun 2006-03-14
自己顶下
  • 打赏
  • 举报
回复
yzyun 2006-03-10
CSDN的论坛发布排版真是不好
上楼的帖子发成了那样,不好意思
大家可以copy然后贴到EditPlus 或 UltraEdit ,会比较清晰。
  • 打赏
  • 举报
回复
yzyun 2006-03-10
既然不少人感兴趣 大家不妨讨论下 呵呵

我把我的这部分设计考虑拿出来,大家批评批评

先说说主题表和标签库表:

主题表:
我们可以把它理解为文章主题表、商品表、图书表或其它什么表都行
下面我以商品表为例子
表名:T_Goods
字段:
1. goodsID int --商品ID
2. goodsName nvarchar --商品名
3. gColor --商品颜色
4. gPrice --商品单价
5. gMadeCity --商品产地
6. gStyle --商品风格样式
7. ......
......
......

标签表:
表名:T_Tags
1. TagID bigint --标签的ID
2. TagTitle nvarchar --tag内容
3. ClickNum int --被点击和访问的次数

商品标签对照表:
表名:T_Tags_up
1. ID bigint --ID
2. goodsID nvarchar --商品ID
3. TagID bigint --标签的ID

用户标签访问表:
表名:T_Tags_User
1. ID bigint --ID
2. UserID bigint --用户ID
3. TagID bigint --标签的ID
4. ClickNum int --被点击和访问的次数
5. isOwn char(1) --是否为当前用户所建立

(以上tag相关的设计,参考了drupal的数据库中相关部分的设计。)

在维护(新增、修改)T_Goods表的时候,
根据维护商品的相关属性(商品名、颜色、产地、风格样式、......)生成tag列表,
比照T_Tags中的记录,如果T_Tags中没有某tag,则insert到T_Tags中,
同时在T_Tags_up记录该商品和tag的关联
(对于商品的删除操作,暂不予讨论)
(对于T_Tags_User表的使用情况,暂不予讨论)

搜索实现的大体思路:
那么,在进行商品关键字搜索的时候,
系统根据待搜索的关键字(如:[米色 时尚 巴黎 裙子])到T_Tags中查找TagID;
再到T_Tags_up中查找相关的记录,
进而找到T_Goods中的相关记录,是为搜索结果。

至于SQL或数据库程序的具体实现,希望看看大家的思路
  • 打赏
  • 举报
回复
dutguoyi 2006-03-09
:-)
  • 打赏
  • 举报
回复
sky0120 2006-03-09
牛人难得一见
  • 打赏
  • 举报
回复
kafly 2006-03-09
我想知道你这个关键词列表是怎么来的。

从这个表里查到文章ID3那倒是小问题。

用全文检索效果不是很好,想增加一个关键词完全匹配的查询
1、建立全站常用关键词库
2、建一索引表,定时统计各关键词在信息中出现频率,频率列表写入一个字段,文章ID列表写入该表一个字段。
3、查询时只从索引表中找关键词,获得信息ID、关键词频率数组。

处理数组,优先输出包含所有关键词的ID,然后根据信息ID出现次数多少排序。
  • 打赏
  • 举报
回复
sql5186 2006-03-08
SELECT 文章ID
FROM Table
WHERE 关键字='客户输入关键字1'
or 关键字='客户输入关键字2'
GROUP BY 文章ID HAVING COUNT(文章ID)>1
  • 打赏
  • 举报
回复
msjqd 2006-03-08
应该是

SELECT 文章ID
FROM Table
WHERE 关键字='客户输入关键字1'
or 关键字='客户输入关键字2'


邹老大写的通用
  • 打赏
  • 举报
回复
yzyun 2006-03-08
牛人出来了
  • 打赏
  • 举报
回复
efly75 2006-03-08
其实应该有更简单的方法:可以先将用户输入的关键字根据空格分隔(我相信在Web这一层实现这个应该是蛮方便的)为数组,之后循环处理,组合生成以下的SQL语句:
SELECT 文章ID
FROM Table
WHERE 关键字='客户输入关键字1'
and 关键字='客户输入关键字2'
  • 打赏
  • 举报
回复
lsqkeke 2006-03-07
学习 :)
  • 打赏
  • 举报
回复
zjcxc 2006-03-07
-- 2. 调用函数实现高效检索(关键词上建立索引)

DECLARE @s nvarchar(4000)
SET @s = N'中国 汽车' -- 要搜索的关键词

-- 搜索
SELECT 文章id
FROM talbe_1 A, dbo.f_f_splitSTR(@s, N' ') B
WHERE A.关键词 = B.col
GROUP BY 文章id
HAVING COUNT(*) = LEN(@s) - LEN(REPLACE(@s, N' ', '')) + 1
  • 打赏
  • 举报
回复
zjcxc 2006-03-07
-- 1. 建立一个函数, 用于分拆搜索关键词

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_splitSTR]
GO

/*--字符串分函数

分拆指定分隔符的的字符串,返回结果表

--邹建 2004.04(引用请保留此信息)--*/

/*--调用示例

SELECT * FROM f_splitSTR('aa ba b','a ')
--*/
CREATE FUNCTION f_splitSTR(
@s varchar(8000), --要分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
DECLARE @splitlen int
SET @splitlen=LEN(@split+'a')-2
WHILE CHARINDEX(@split,@s)>0
BEGIN
INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
END
INSERT @re VALUES(@s)
RETURN
END
GO
  • 打赏
  • 举报
回复
lsqkeke 2006-03-07
哦 我看的需求没看仔细! 理解有点偏差
不好意思了 :)
  • 打赏
  • 举报
回复
lsqkeke 2006-03-07
在列 "关键词" 上建立索引!

如果数据的是”中国 汽车“ 这种由空格组成的关键字
declare @v varchar(20)
set @v='中国 汽车 头部'
select top 1 * from tb order by case when charindex(' '+关键词+' ',' '+@v+' ')<>0
then charindex(' '+关键词+' ',' '+@v+' ') else 999 end
  • 打赏
  • 举报
回复
wudan8057 2006-03-07
用全文索引速度更快!
  • 打赏
  • 举报
回复
加载更多回复(1)
相关推荐
发帖
疑难问题

2.1w+

社区成员

MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
加入社区
帖子事件
创建了帖子
2006-03-07 04:33
社区公告
暂无公告