[已解决问题] 【急!】类似GOOGLE,爱词霸,如何快速查询匹配数据?
提问时间: 2008-07-23 14:57
悬赏分:50 浏览:270 次
一在线词典查询。如何让数据快速查询。我的思路是查询放在DATASET,然后用 DataRow[] drow = ds.Tables[0].Select(" word like '" + WordStr + "%'"); 这样匹配数据。问题1》页面loading加载几十W条数据到服务器内存里的时候,实在是太慢了。。
有什么好建议吗?
提问者:李辉明 - 初学一级

问题补充:1》除了优化查询数据库方面,如建立词条索引,优化SQL之类,全文索引,缓存。
2》希望在算法,结构方面能提供些建议。
3》数据量有100W条,查询不超过1秒。
4》一文本框,一查询按钮,做成类似GOOGLE这种。这个可用AJAX,我问的不是自动完成功能。问题在于如何匹配数据的算法方面。
5》Dictionary.ContainsKey和List.BinarySearch哪个效率高 ??List.先Sort
6》如何比对词条,把临近相似的显示出来,如:“c,ca,case,cast,cat,catch”,输入“ca”的时候,把“ca,case,cast,cat,catch” 这些个词条显示出来。

最佳答案
不要用DataSet了,换成一个Array,或者List来保存数据. 100w = 1M 假设一条记录占500个字节 1M * 500 Bytes per record = 500MB 这样基本有个1G以上的内存就够用的了,只是网站启动时加载慢. 如果在内存里顺序搜索仍然不够快,可以加载后排序,然后进行二分查找.
2008/7/23 22:38:36 回答者:deerchao


提问者对于答案的评价:deerchao的方法,非常不错,先在数据库中做索引,存储过程,把数据都加载到LIST泛型类中,加载到内存之后在用二分查找,不过实际操作的时候二分查找有问题,有时候会出问题,主要是单号与双号求平均值的时候,有偏差。私底下给我不少建议。所以分数就给他了,其它人的建议,谢谢你们。
其它回答(5)
可否结合一下,第一个字母匹配从数据库读取出来,放入dataset,应该比几十万的数量级小很多吧,然后在dataset中选取当用户输入第2个以及以后的字母的情况 当然,还应该在适当的地方加入缓存处理
2个月前   回答者:雨哲 - 初学一级
楼主是想实现在文本框中输入时内容时的自动完成功能吗?请使用ASP.NET AJAX中的AutoCompleteExtender控件
2个月前   回答者:麒麟.NET - 小虾三级
你可以研究一下常见的词典格式,词典文件一般没有必要用数据库吧。
2个月前   回答者:玉开 - 大侠五级
自动完成功能,网上很多的,Ajax是一种实现方法吧!!!
2个月前   回答者:JackLee - 小虾三级
建议不使用DataSet一次加载全部单词的方法,这样dbs与iis通信量太大,效率上会有损失。如果不使用google suggest,则用户全部输入后,才会触发查询。此时查询,其得到结果应该是可确定的(0个或1个等),这样,dbs与iis之间的通讯很小,且查询只有一次。之前的建议,数据库查询次数都不小于1次。其实,影响速度的问题,主要在与数据库连接花费的时间,只要索引建的好(此处是不是把每个单词列建成了索引?),100万条,查询其中的一条,速度是很快的(远小于1秒)。
2个月前   回答者:Richie - 菜鸟二级
评论
2个月前   李辉明 :
TO 麒麟.NET :
问题不在于是否用AJAX的AutoCompleteExtender控件,在于如何让用户查询的速度快。因数据量实在过大。
2个月前   李辉明 :
TO:雨哲
你这种方式,是否每次缓存中没有的数据,都要连接一次SQL?能否有开始就把一堆的词条放在服务器的内存上,这样,用户直接从内存里查询数据出来是否快的多?100W条,一个词条算6个字节,不到11个M。
2个月前   李辉明 :
我问的不是自动完成功能。问题在于用什么算法或者数据结构,能快速查询。。

   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题

> 问题排行榜

相关内容

相关链接