对ASP.NET Forum 2.0做了一下code review,发现一件很不理解的事情,它的Search功能不是用SQL Server 2000 Full-Text Search来实现的。它的实现方式是创建了一个叫做forum_SearchBarrel的表,用来存放在哪些帖子里面有哪些关键字:
没有验证过,但我觉得这会是性能很差的一个解决方案。做了一个试验,用ACT往Forum里加了50万个帖子,标题和正文都由真实的英语单词根据一定的词频构成,然后做了一下Index(当然是ASP.NET Forums 2.0自己实现的Index)。结果发现,50万个帖子做完Index以后,forum_SearchBarrel表里面有1600万条记录。如果在这个基础上加上压力,50或者100个并发的搜索,性能会怎么样很让人担心(不过这个试验还没做,结果未知)。
我对全文检索的常用实现算法没有很多了解,但我不太理解为什么ASP.NET Forums 2.0不把搜索功能建筑在SQL Server 2000的Full-Text Index之上。SQL2K FTS的速度、容量等都是经过实际应用证明的。如果我是设计者,一定不会自己重起炉灶。可以想见的一个理由是这个Forum的开发团队不希望让后台数据库局限于SQL Server 2000。这倒也可以理解,毕竟Rob Howard已经另立门户,ASP.NET Forums 2.0现在已经叫做Community Server :: Forums了,属于Telligent Systems公司的解决方案了。在数据库层面上把所有的功能都用表、存储过程、触发器等来实现,就可以不太困难的从SQL Server 2000迁移到Oracle、DB2或者MySQL——虽然目前ASP.NET Forums 2.0的代码里面用的仍然是SqlDataProvider。但话又说回来,Oracle也好,MySQL也好,也都有各自的Full-Text Search实现技术,性能和效果一定比直接用表来实现要好。
关于这个问题我还没有想好,看来需要去看一些关于全文检索实现算法的文章。也许rhoward是有更深层考虑的,希望我的担心是多余的。我在博客园看到宝玉把Forum 2.01汉化了,汉化版叫做CnForums。他提到他把搜索改用SQL2K FTS来实现,性能好了很多。
--
本贴子以"现状"提供且没有任何担保也没有授予任何权利 - mvm
打印 | 张贴于 2004-10-26 12:35:00 | Tag:Dot NET

留言反馈
还有,我用sharepoint建的网站也这样.
与我联系:junyanhe◎hotmail.com
你说的没错,任何index无非就是forward index和reverted index。但我的主要观点是:既然sql server已经有了full text index功能,就不应该再自己在table的基础上再做一套index,这样performance、准确性等肯定不如sql server自带的full text index。
这就好像有些程序员喜欢在系统的内存管理基础上自己再做一层内存管理:先malloc一大块内存,然后在自己的程序里面划块管理使用。这样的结果往往是速度慢、效率差、代码复杂。
更全面一点,所有全文搜索引擎实现的也原理都一样,
区别只是INDEX的生成和RANK的手法
数据库的全文检索不是如果基于表和INDEX的话,
那又会是基于什么的呢
We don’t use full text for a variety of reasons: performance, custom security (forums security), custom weighting algorithm – those are the biggest reasons :) Free text is great, but slightly limiting for our needs.
可以让 forum_SearchBarrel 支持中文搜索,不过效率比较低,我当时的方案是使用sql中的like来检索forum_SearchBarrel 表中的Word字段从而得出其PostID,效率没有严格测试,应该可以接受。不过以前我一个300多兆的论坛(30多万帖子),升级到了asp.net forums beta,数据库变成了500多兆,加起来就是800多兆(在同一个数据库中),但是开启forums自带的索引不久后,数据库涨到了1G多,而且日志也飞涨,不久后服务器就不堪重荷了,最后只要一加载forums的数据库,服务器就半死机了……
现在我使用SQL的全文索引后,30多万帖子(数据库1G多)检索一般只需要0.0几秒,效率还是非常高的!
forums是每隔15分钟检索100个帖子,也就是100,000个帖子要15*1000/60约250个小时也就是10多天
如果真要用,帖子索引这部分也要优化一下,因为目前的算法同一个帖子会索引出来很多重复的记录甚至是空格
以前的源代码中就有OleDb的. 但后来看不到OleDb数据库访问的源代码了.
to mvm: 数据访问是单独一个类, 也就是说SqlDataProvider, 但OleDb的就有可能是OleDbDataProvider, 等等!从ForumsDataProvider派生.
在web.config中可以更改使用的Provider
如果是msde2000的话是不支持全文检索的!
我现在已经转换成使用dotLucene了.
原因嘛, 因为现在WEB空间比数据库空间便宜.哈哈! :)
虽然有不足的地方, 但不可否认, 我确实在asp.net forums上学到不少.
很多php应用程序的表都会加上前缀,保证不同的应用程序可以把表创建在同一个mysql数据库里面,目的就是为了节省占用数据库的数量,多一个数据库都要多交米给托管商呢。
搜索这部分我就不说了,后台的进程不停的索引,数据库空间不停的往上窜,这种检索方法对中文还无效……
还有就是附件,不懂为什么非要存在数据库中,汗死啊,至少应该给用户一个可选项阿!
一个很争议的就是帖子内容存两份:一份是原始帖子内容,另一份是帖子格式化后的内容,固然可以提高帖子时显示时效率,但是众所周知,论坛数据库主要空间就是被帖子内容占用了,这样数据库一下在大了将近一倍啊!原本500多兆的数据库一升级到asp.net forums 数据库一下子变成1G多了……
另外不知道微软的这些老几工作内容都是什么呢?MVM还在研究这些软件,是工作需要还是个人兴趣?
-------------------------------------------------------------------------------
有存储过程和触发器,移植起来很麻烦的