首页新闻找找看学习计划

sqlserver模糊匹配效率低怎么解决

0
悬赏园豆:40 [已解决问题] 解决于 2016-08-26 21:41

我们的数据库,数据表Company,有一万多条数据,
我们要不断拿字段 CompanyName  出来匹配 用户输入,以数据库中的为准。
如果用户输入 : 格力电器
以前一直用 select  * from  Company   where   CompanyName  like '%格力电器%'

但是这样匹配出来的太少了,很不准确,导致错误新增  

比如要查询: 格力电器珠海有限公司  客户希望  输入: 格力电器珠海总公司  ,格力电器珠海公司,格力电器珠海有限责任公司,格力电器责任有限公司,格力电器公司等都能匹配出来。

但是 第一种匹配方法无法做到。
 
我尝试分割用户的输入词: 生成这样的sql语句:
select * from Company  where CompanyName like '%格力%电器%珠海%有限%责任%公司%'
后来又用 select * from Company  where CompanyName like '%格力%电器%珠海有限责任%公司%'
select * from Company  where CompanyName like '%格力%电器%珠海有限责任%公司%'
or CompanyName like '%格力电%器珠海%有限责%任公司%'

但是效率太低了,根本不能满足要求,查出来大概几分钟。

他们主要是录入数据,希望厂家匹配出来,自动填充。他们操作习惯是,直接粘贴进去。为了省时间,但是这样稍微有差别,就匹配不出来,然后他们就增加一条,导致厂家很混乱。

不知道各位有什么办法,救救我啊。
弄了很久了,弄不成啊。

荆棘人的主页 荆棘人 | 初学一级 | 园豆:173
提问于:2014-06-05 17:29
< >
分享
最佳答案
0

搞个笨方法吧,一般笨客户才有这种笨需求.所以就用笨方法.有什么不能过滤的新名词后面添加到函数里就好了

create function dbo.ft_get_short_company_name(@company_name varchar(50))
returns varchar(50)
as
begin
    declare @company    varchar(50)
    select @company = replace(@company_name,'有限责任公司','')
    select @company = replace(@company,'有限公司','')
    select @company = replace(@company,'总公司','')
    select @company = replace(@company,'公司','')
    --去除省名城市名
    --去除其它自定义内容
end


select  * from  Company   where   charindex(dbo.ft_get_short_company_name('格力电器有限责任公司'),CompanyName) > 0
收获园豆:40
AlphaQcode | 菜鸟二级 |园豆:251 | 2014-08-13 15:00

严重同意,其实用不了多么高大上的东东

Penpal | 园豆:209 (菜鸟二级) | 2015-09-22 16:17
其他回答(9)
0

模糊匹配效率低的解决方案就是不用模糊匹配. 

mssqlserver的话用全文索引.很容易的

吴瑞祥 | 园豆:28770 (高人七级) | 2014-06-05 18:09
1

1、从你的客户需求来看,他们出的价钱一定很高,基本上快赶上那个要求不能使用ASPX(低档货)的客户的。我初步估计项目达到10亿,而且还是美元,虽然汇率在走低,不过还是有5、6个人民币那么多。

2、Google和Baidu基本上技术上能达到你客户的要求,你可以找这两家采购再转卖给你的客户。

 

3、好了,不扯了,

比如要查询: 格力电器珠海有限公司  客户希望  输入: 格力电器珠海总公司  ,格力电器珠海公司,格力电器珠海有限责任公司,格力电器责任有限公司,格力电器公司等都能匹配出来。

类似这样的需求,本身如果满足的话,就是说,你的客户可能每次输入都会得到8000~9000个符合要求的信息,因为电脑根本不知道为什么格力就成了关键词了,如果不小心把公司当成关键词的话,是不是每个有包含公司的公司都会出现?

如果不是这样的话,要么你的客户愿意在信息条“ 格力电器珠海总公司、格力电器珠海公司,格力电器珠海有限责任公司,格力电器责任有限公司,格力电器公司”这些里面建立一个匹配数据,否则鬼才知道。

你的客户如果愿意输入“格力”出现后面那一堆,那叫合理需求,如果非要手贱输入“格力电器珠海有限公司”,还要匹配那后面的一系列名称,你们的业务还同意的话,真心对你们公司的技术实力表示佩服,期待中国Google的出现。

 

当你们解决了这个问题以后(先假设你们可以解决),客户会有一个这样的需求的,比如Walmart超市,可不可以当用户输入是WALMART超市的时候也可以找出来啊。

或者搜索小米科技,可以找到五谷杂粮科技公司。

爱编程的大叔 | 园豆:30188 (高人七级) | 2014-06-05 20:48
0

灰常同意2楼观点,其实你们公司谈需求的不知道是谁?或者只是个熟悉业务并且对技术只有一点了解的人,其实这是很危险的,其实他要就只懂业务还好,但是如果还会那么一点点技术的话,那么他理解的这个需求他就会认为是完全可以实现的。

其实不然,因为你所要的效果是你输入一个字符串,只要其中有那么一两个字符或者中文与数据库中匹配,那么就可以将匹配的结果全部搜索出来,那么你的计算机怎么知道你想要匹配的是什么呢?你说你想查询: 格力电器珠海有限公司  客户希望  输入: 格力电器珠海总公司  ,格力电器珠海公司,格力电器珠海有限责任公司,格力电器责任有限公司,格力电器公司等都能匹配出来,那么这种情况是你自己认为你想要的是匹配你所输入的字符串中的“格力电器”or“格力”or“格力电”or“力电器”。。。等等,都要疯了,换而言之,你这样弄的话,假如你要搜索小米科技公司,还真的会带出五谷杂粮科技公司 -。-,客户的需求真的好高端,做之前真心需要好好分析,可行性实现的

LgV5 | 园豆:221 (菜鸟二级) | 2014-06-06 09:28
0

解决方案还是有的,你可以考虑lucene等引擎建立分词库,然后根据词库去最小词义匹配。但正如大叔所言,这不是小需求,从商业角度及你们实施能力考虑,这个功能你至少得再加价200万以上加6个月时间,问问你的客户是否愿意买单?

邀月 | 园豆:25327 (高人七级) | 2014-06-06 14:32
0

用lucene吧。

jone_e | 园豆:1410 (小虾三级) | 2014-06-06 16:24
0

哥也珠海的,就在格力广场旁边上班,狠啊

+小马哥++ | 园豆:906 (小虾三级) | 2014-06-13 09:44
0

lucene

Nicolas.Nick | 园豆:232 (菜鸟二级) | 2014-07-11 16:23
0

给此字段加上全文索引,用全文索引来搜索,比较精确而且节约资源

| 园豆:327 (菜鸟二级) | 2014-07-23 15:04
0

请你有木有解决问题了,我也遇到同一类的问题

liangzhaohe | 园豆:202 (菜鸟二级) | 2016-08-12 18:31

要求用户必须严格输入,现在无法实现智能化。

后来我们做了数据分类,把某些关键词指定为一个标准名称。

支持(0) 反对(0) 荆棘人 | 园豆:173 (初学一级) | 2016-08-26 21:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册