首页 新闻 赞助 找找看

笔试题:C#实现多模式匹配算法或者多关键词匹配算法

0
悬赏园豆:80 [已解决问题] 解决于 2012-09-29 11:25

  关键词a,b,c,d,e..大概10 个左右,需从数据库表中查找某个字段的值匹配a,b,c,d,e... 关键词的数据(表中大概有30万数据)。

  

问题补充:

例如:我在前台输入a,b,c,d 四个关键词。

数据库(test 表)中有字段keyword

 id  keyword

 1        a,b,c,d,e,f,g

 2    b

 3        c

 4        d

 5        e

 6        g

匹配成功的有前面4条数据。

心有多大,舞台就有多大的主页 心有多大,舞台就有多大 | 初学一级 | 园豆:99
提问于:2012-09-11 20:19
< >
分享
最佳答案
0

select  keyword from test where charindex(keyword,'a,b,c,d,e,f,g')>0

收获园豆:30
jingjunfeng | 小虾三级 |园豆:873 | 2012-09-12 17:45

兄弟,你这种方法应该不是楼主想要的结果,勿喷。我上图给你看。

图中,我第一个Sql语句是查询这张表所有数据(这张表总共有59条记录,1-9条的KeyWorld是a。10-19的KeyWorld是a,b。20-29的KeyWorld是a,b,c。依次类推。50-59的KeyWorld是a,b,c,d,e,f)。

当我查询条件为只查询     a,f 满足这两个值的查询条件,如果按照楼主期望的那种结果,那么应该是可以将这59条记录全部查询出来(因为这59条记录都有a)。但是用兄弟你写的这个查询语句,就只能查询出9条记录,那就是 KeyWorld为a 的那9条数据。不过你写的Sql语句有其它的使用价值,顶一下。

icyme | 园豆:77 (初学一级) | 2012-09-12 23:02

@izhangxu: 在大数据量下,charindex 效率没有contains 高,我试过了

心有多大,舞台就有多大 | 园豆:99 (初学一级) | 2012-09-16 00:00

在查询里用函数效率都高不到哪儿去,数据库就不是设计用了做逐行处理的。数据量越大,Join 处理和函数导致的逐行处理就越慢。特别是还会设索引失效。

另外%前置的like同样会使索引失效。效率一样很低

luofer | 园豆:468 (菜鸟二级) | 2012-10-25 16:28

函数导致的逐行处理就越慢。特别是还会设索引失效。不是Join

luofer | 园豆:468 (菜鸟二级) | 2012-10-25 16:29
其他回答(6)
0

楼主说的可是多条件模糊查询?

icyme | 园豆:77 (初学一级) | 2012-09-11 23:13

不是多条件模糊查询

例如:我在前台输入a,b,c,d 四个关键词。

数据库(test 表)中有字段keyword

 id  keyword

 1        a,b,c,d,e,f,g

 2    b

 3        c

 4        d

 5        e

 6        g

符合条件的有前4条记录数据,找出来,并且表中有30w 的数据。

0
create proc sp_QueryDemo
    @a varchar(20),
    @b varchar(20)
    --其他字段定义
as
begin
    declare @sql varchar(5000)
    set @sql='select  字段列表  from  tb_a where 1=1 '
   if(@a != null)  @sql + ' and  a like %'+@a+'%'
     if(@b != null)  @sql + ' and  b like %'+@b+'%'
     --其他字段拼接
    exec (@sql )  --假如有参数,后面添加参数
 end
收获园豆:20
土豆屋 | 园豆:354 (菜鸟二级) | 2012-09-11 23:38
0

每次前台输入的关键字是固定的还是不固定的

jason2013 | 园豆:1998 (小虾三级) | 2012-09-12 10:03
0

 

把输入的参数格式化后放入表变量或临时表,然后和主表Join。怎么Join不用说了把?

 

如:

输入:a,b,c,d

格式化结果:

a

b

c

c

a,b

a,c

.........

 

写个笛卡尔乘积函数解决格式化。

收获园豆:25
luofer | 园豆:468 (菜鸟二级) | 2012-09-12 10:29

临时表中格式化数据.格式化结果=test(表).keyword  ?

 

id  keyword

1  a,b,c,d,e,f,g

搜索不出上条数据,格式后的结果数据中包含e,f,g。

一个很out 的方法,效率估计不好,将a,b,c,d 关键词 拆分成数组,拼接查询语句,例如 keyword like %'a' % or keyword like %'b' or  keyword like %'c' or keyword like %'d' 这样效率极其慢,换成全文索引Contains(keyword,'"a*"')....效率高很多,但是感觉还是不最好的处理方式。

0

我看这题目不只是考匹配,还有一句“(表中大概有30万数据)”,意思是说大数据量的操作能够短时间内完成。不然就成数据库题目了,还要C#干什么呢

收获园豆:5
hardersen | 园豆:206 (菜鸟二级) | 2012-09-13 10:20
0

不要在这样找笔试题了,一次就这么几个,还没过瘾就没有了,去安装个《笔试宝典》收录了网上90%的笔试题http://bishi.jisupeixun.com

xin850615 | 园豆:204 (菜鸟二级) | 2016-01-22 13:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册