首页 新闻 会员 周边 捐助

SqlServer分词

0
悬赏园豆:30 [已解决问题] 解决于 2011-09-28 16:03

现在需要这样的一个效果,根据产品名,做模糊查询,得到其产品名相似的产品。

但是越精确的越靠前。

原本我的方式是:



alter
function f_splitIncrease
(
@strSource nvarchar(2000),
@strSplitStr nvarchar(100)
)
returns @tempTable table(id int identity primary key, one nvarchar(1000))
as
begin
declare @tempStr nvarchar(1000);
declare @startIndex int;
set @startIndex = 1;
set @strSource = @strSource + @strSplitStr;
while(@startIndex <> 0)
begin
set @startIndex = charindex(@strSplitstr, @strSource, @startIndex+1);
if(@startIndex <> 0)
begin
set @tempStr = left(@strSource, @startIndex - 1);
if(@tempStr <> '')
begin
insert into @tempTable values(@tempStr);
end
end
end
return
end
调用 select * from dbo. f_splitIncrease('the office seasons')

会得到

the

the office

the office seasons

这样三条记录,

再根据这个去做搜索,代码如下:

alter proc Proc_Product_Related
(
@name nvarchar(2000),
@splitStr nvarchar(100) = ' '
)
as
begin
declare @tempTable table(
id
int identity(1,1) primary key,
ProductID
int,
[Name] nvarchar(255),
ProductNo
nvarchar(50),
MemberPrice
money,
ThumbnailImg
nvarchar(255),
ProductImg
nvarchar(255)
)
if(@splitStr is Null)
begin
set @splitStr = ' ';
end
begin transaction
insert into @tempTable
select distinct ProductID, [Name], ProductNo, MemberPrice, ThumbnailImg, ProductImg from product p, (select * from dbo.f_splitIncrease(@name, @splitStr)) f
where p.name like + f.one + '%'
if(@@error > 0)
begin
rollback transaction
end
select * from @tempTable
if @@error > 0
rollback
else
commit transaction
end

 


于是最精确的排在最下面。

但是由于模糊搜索the office时,已经包含了 the office seasons,会出现记录重复。

现在要解决记录重复,如果使用distinct关键字的话,他的结果集就不是最精确的排在最下面。没有达到原本想要的效果。

这里该如何处理呀?

问题补充: 根据我在程序中利用DataTable的特性做的消除重复和在SqlServer利用Distinct关键字消除重复得到的结果的对比, 得到如下结论: distinct关键字的处理方式是: 先产生一个临时表,拥有其主表的表结构。 然后再消除重复。并将消除后的记录一条一条的插到临时表中。 同时将临时表返回。 至于消除重复,如果一条记录跟每一条记录对比,消耗肯定很大,可能数据库有另外的机制,我在程序中用的方法是,先order by一次。重复的记录就在一起了,然后在循环,只需要判断 i == i-1就可以了。
双调的主页 双调 | 初学一级 | 园豆:7
提问于:2010-09-01 16:27
< >
分享
最佳答案
0

SQL SERVER 的全文索引功能比较弱,试试 HubbleDotNet 吧,很容易搞,一小时不到就可以搞定全文索引,可以和SQL SERVER 联动,很方便,功能也强很多,速度比SQL SERVER 那个快很多,和分词也结合的很好,解决你说的这个问题一点问题都没有。目前已经有500多个用户,包括新浪,驱动之家,51aspx 等比较著名的企业。

项目主页

http://www.hubbledotnet.com/

参考下面几篇文章

http://www.cnblogs.com/eaglet/archive/2010/05/13/1734273.html

http://www.cnblogs.com/eaglet/archive/2010/08/30/1812650.html

http://www.cnblogs.com/eaglet/archive/2010/04/07/1706305.html

博客园搜索引擎小组

http://space.cnblogs.com/group/search/

收获园豆:30
eaglet | 专家六级 |园豆:17139 | 2010-09-02 07:33
支持eaglet的HubbleDotNet。就是文档再全点就好了。
Astar | 园豆:40805 (高人七级) | 2010-09-02 08:17
文档我正在补,谢谢支持!
eaglet | 园豆:17139 (专家六级) | 2010-09-02 12:51
授人鱼不如授人渔! 你的文档里面主打是"盘古分词",不知道他对英文分词如何。 我还没有去试,因为工作时间比较紧。有时间一定去试试。 不如你先讲讲盘古分词的原理
双调 | 园豆:7 (初学一级) | 2010-09-07 20:25
盘古分词可以处理英文分词,英文分词主要是单词词根化处理。
eaglet | 园豆:17139 (专家六级) | 2010-09-08 18:26
其他回答(2)
0

应用 Distinct 后再 对“产品名”这列 排序 试试。

HUHU慈悲 | 园豆:9973 (大侠五级) | 2010-09-01 16:35
排序,是如何排的列? 直观上,是根据其字母顺序在排序。 违背了初衷了。 显示的时候最精确的显示最前面
支持(0) 反对(0) 双调 | 园豆:7 (初学一级) | 2010-09-01 16:37
0

什么叫最精确。这个属于智能学,只有人对词或者字的理解排序的位置,在程序上既然你做出来了,开销还是比较大的。你在百度上搜,也并不是越精确的在前面啊。

这是我的看法

慧☆星 | 园豆:5722 (大侠五级) | 2010-09-01 17:56
这里的最精确是相对而言,比如我输入 中华人民共和国, 相信你模糊搜索中华人民,比模糊搜索中要精确一些. 关键在于分词该如何分才算合理.其次就是考虑其记录的有效性了.
支持(0) 反对(0) 双调 | 园豆:7 (初学一级) | 2010-09-01 18:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册