按匹配度来排序的研究(讨论者有分)

fenlin 2004-12-08 05:42:43
例如:数据库中有几条测试的数据
ID cname
1 电子工业
2 电脑包装
3 电脑包裹
4 电脑机械
5 包装机

怎么样才能实现按匹配度来排序?
例如:要搜索关键字“电脑包装”返回结果
ID cname
2 电脑包装 --全字匹配
3 电脑包裹 --含有“电脑包”
4 电脑机械 --含有“电脑”
5 包装机 --含有“包装”
1 电子工业 --含有“电”
...全文
219 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsxaa 2004-12-09
  • 打赏
  • 举报
回复
这种搜索一般没有什么好的优化方法....
fenlin 2004-12-09
  • 打赏
  • 举报
回复
TO:hdhai9451(Water Space--海洋空間) 思路上应该是这样的,就差在怎么样让它智能化,例如:用户输入10个字或以上的关键字

TO:小李铅笔刀,你的代码可以了,谢谢您。不知对于海量1000W数据还有没有得再优化?
lsxaa 2004-12-09
  • 打赏
  • 举报
回复
select aa.id,aa.cname,sum(power) as power
from (select a.*,b.idd as power
from sorts a,#t b
where charindex(left(@str,b.idd),a.cname)>0
or charindex(right(@str,b.idd),a.cname)>0
) aa
group by aa.id,aa.cname
order by power desc
Andy__Huang 2004-12-09
  • 打赏
  • 举报
回复
ID cname
2 电脑包装 --全字匹配
3 电脑包裹 --含有“电脑包”
4 电脑机械 --含有“电脑”
5 包装机 --含有“包装”
1 电子工业 --含有“电”

你的要求是什麼?我覺得這樣做

... order by case when charindex('电脑包装',cname) then 0 else 1 end,
case when charindex('电脑包',cname) then 0 else 1 end,
case when charindex('电脑',cname) then 0 else 1 end,
case when charindex('包装',cname) then 0 else 1 end,
case when charindex('电',cname) then 0 else 1 end

先把你最想排在前面的列出來,不是的再排在後面;再按下一個條件排序,也是同樣的道理,符合條件的排在前面,不符合條件遙排在後面。


fenlin 2004-12-09
  • 打赏
  • 举报
回复
declare @len int
declare @str varchar(100)

set @str='电脑包装'
set @len=len(@str)
set rowcount @len
select idd=identity(int,1,1) into #t from sysobjects a,sysobjects b
set rowcount 0

select aa.id,aa.cname,sum(power) as power
from (select a.*,b.idd as power
from sorts a,#t b
where charindex(left(@str,b.id),a.cname)>0 or charindex(right(@str,b.id),a.cname)>0) aa
group by aa.id,aa.cname
order by power desc

服务器: 消息 207,级别 16,状态 3,行 10
列名 'id' 无效。
服务器: 消息 207,级别 16,状态 1,行 10
列名 'id' 无效。
itcoo 2004-12-09
  • 打赏
  • 举报
回复
就模糊查询来说没有什么好的效率可言,通过对查询字段建立索引(也可以是暂时性的索引)来提高点效率。
zlp321002 2004-12-09
  • 打赏
  • 举报
回复
我说刀哥的星,怎么不见了呢!!

刀哥的一定好使!

楼主试试这个行不行:

select * from 表 where 要匹配的字段 like '%[电脑包装]%'
itcoo 2004-12-09
  • 打赏
  • 举报
回复
to lsxaa(小李铅笔刀)
开玩笑的:)
能说明一下into #t from sysobjects a,sysobjects b在这里的作用吗?
lsxaa 2004-12-09
  • 打赏
  • 举报
回复
aa前你少写一个括号 )
fenlin 2004-12-09
  • 打赏
  • 举报
回复
declare @len int
declare @str varchar(100)

set @str='电脑包装'
set @len=len(@str)
set rowcount @len
select idd=identity(int,1,1) into #t from sysobjects a,sysobjects b
set rowcount 0

select aa.id,aa.cname,sum(power) as power
from (select a.*,b.idd as power
from sorts a,#t b
where (charindex(left(@str,b.id),a.cname)>0 or charindex(right(@str,b.id),a.cname)>0) aa
group by aa.id,aa.cname
order by power desc

提示错误:第 13 行: 'aa' 附近有语法错误。
lsxaa 2004-12-09
  • 打赏
  • 举报
回复
晕倒,不是来抢分的 :(

楼主给我发消息了
itcoo 2004-12-09
  • 打赏
  • 举报
回复
学习~~~
lsxaa(小李铅笔刀) 数据库版的“星星”来这里抢分了。哈哈。。。

lsxaa 2004-12-09
  • 打赏
  • 举报
回复
这里改一下,试试

where charindex(left(@str,b.id),a.cname)>0
or charindex(right(@str,b.id),a.cname)>0
leopard_47 2004-12-09
  • 打赏
  • 举报
回复
关注一下!!
fenlin 2004-12-09
  • 打赏
  • 举报
回复
十分感谢"小李铅笔刀",你的代码返回的结果是:
ID cname
2 电脑包装
3 电脑包裹
4 电脑机械
---------------------
5 包装机 --少了这一条记录
---------------------
1 电子工业

lsxaa 2004-12-09
  • 打赏
  • 举报
回复
改一点
declare @len int
declare @str varchar(100)

set @str='电脑包装'
set @len=len(@str)
set rowcount @len
select idd=identity(int,1,1) into #t from sysobjects a,sysobjects b
set rowcount 0

select aa.id,aa.cname,sum(power) as power
from (select a.*,b.idd as power
from 表 a,#t b
where charindex(substring(@str,1,b.idd),a.cname)>0 ) aa
group by aa.id,aa.cname
order by power desc
lsxaa 2004-12-09
  • 打赏
  • 举报
回复
你试试 我没有测试
declare @len int
declare @str varchar(100)

set @str='电脑包装'
set @len=len(@str)
set rowcount @len
select idd=identity(int,1,1) into #t from sysobjects a,sysobjects b
set rowcount 0

select aa.id,aa.cname,sum(power) as power
from (select a.*,b.id as power
from 表 a,#t b
where charindex(substring(@str,1,b.id),a.cname)>0 ) aa
group by aa.id,aa.cname
order by power desc
dh20156 2004-12-09
  • 打赏
  • 举报
回复
我记得好象可以通过字段字符长度减去包含字符长度来比较,查一下先
blues-star 2004-12-09
  • 打赏
  • 举报
回复
这个函数对中文好像不太好用。
blues-star 2004-12-09
  • 打赏
  • 举报
回复
DIFFERENCE
以整数返回两个字符表达式的 SOUNDEX 值之差。

语法
DIFFERENCE ( character_expression , character_expression )

参数
character_expression

是类型 char 或 varchar 的表达式。

返回类型
int

注释
返回的整数是 SOUNDEX 值中相同字符的个数。返回的值从 0 到 4 不等,4 表示 SOUNDEX 值相同。

示例
在下例的第一部分,比较两个相差很小的字符串的 SOUNDEX 值,DIFFERENCE 返回的值是 4。在下例的第二部分,比较两个相差很大的字符串的 SOUNDEX 值,DIFFERENCE 返回的值是 0。

USE pubs
GO
-- Returns a DIFFERENCE value of 4, the least possible difference.
SELECT SOUNDEX('Green'),
SOUNDEX('Greene'), DIFFERENCE('Green','Greene')
GO
-- Returns a DIFFERENCE value of 0, the highest possible difference.
SELECT SOUNDEX('Blotchet-Halls'),
SOUNDEX('Greene'), DIFFERENCE('Blotchet-Halls', 'Greene')
GO

下面是结果集:

----- ----- -----------
G650 G650 4

(1 row(s) affected)

----- ----- -----------
B432 G650 0

(1 row(s) affected)

加载更多回复(16)

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧