现在需要这样的一个效果,根据产品名,做模糊查询,得到其产品名相似的产品。
但是越精确的越靠前。
原本我的方式是:
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
会得到
the
the office
the office seasons
这样三条记录,
再根据这个去做搜索,代码如下:
(
@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关键字的话,他的结果集就不是最精确的排在最下面。没有达到原本想要的效果。
这里该如何处理呀?
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/
应用 Distinct 后再 对“产品名”这列 排序 试试。
什么叫最精确。这个属于智能学,只有人对词或者字的理解排序的位置,在程序上既然你做出来了,开销还是比较大的。你在百度上搜,也并不是越精确的在前面啊。
这是我的看法