about:blank

编程与生活一样, 都是严肃而富有艺术的
随笔 - 15, 评论 - 86, 引用 - 1

导航

关于

其实我是蜘蛛侠...
另一个blog: http://yishan.cc/blogs/nickledson

标签

每月存档

最新留言

  • MBT Shoes
    <p>Thank you for your provided article, which are useful for me. Are you interested in the MBT...
    by kicksinfo(注册) on 2010/8/20 13:43:44
  • mbt shoes sale
    <p>I could see the thoughts going through your mind.I guess I should have said my name is MBT ...
    by kicksinfo(注册) on 2010/8/20 11:05:47
  • re:be cool or not, that is a question
    <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-U...
    by kicksinfo(注册) on 2010/8/9 9:35:01
  • re:be cool or not, that is a question
    <p>Prom Dresses, formal and homecoming Dresses are available at fidress, the largest on line s...
    by xiaochen(注册) on 2010/7/29 11:29:32
  • mbt shoes clearance
    <p>I have always been more prone to buy <a href="http://www.wowmbtsale.com/">&...
    by kicksinfo(注册) on 2010/7/24 18:03:24
  • mbt shoes clearance
    <p>I have always been more prone to buy <a href="http://www.wowmbtsale.com/">&...
    by kicksinfo(注册) on 2010/7/24 17:12:47
  • re:be cool or not, that is a question
    <p>Have a pair of own Nike air max <a href="http://www.airjordanshoes2u.com/air-jordan...
    by chuying(注册) on 2010/7/11 18:33:27
  • wulijun
    <p>&nbsp;themselves physicallyseeking to improve<a href="http://www.guccibagsale.o...
    by wulijun(注册) on 2010/7/7 13:28:06
  • re:世界上最早的浏览器
    <p>FashionStyleOnsale offer high quality Moncler Jackets at low price. Moncler Jackets on sa...
    by matin(注册) on 2010/6/25 21:39:12
  • re:世界上最早的浏览器
    <p><span class="Apple-style-span" style="border-collapse: separate; color: r...
    by 阿赞(注册) on 2010/6/4 11:24:32
  • re:世界上最早的浏览器
    <p><span class="Apple-style-span" style="border-collapse: separate; color: r...
    by 阿赞(注册) on 2010/6/4 11:24:20
  • re:世界上最早的浏览器
    <p>Official balenciaga handbags Online Shop - offering you balenciaga inspired fashion and li...
    by sibat0705(注册) on 2010/3/27 22:31:17
  • re:世界上最早的浏览器
    <p> <p>Get the cheapest Juicy Couture discounts around. Find it all here: JC handbags, ...
    by lihaoxj16(注册) on 2010/3/23 1:19:15
  • re: 我眼中的编程之美
    写得真好!
    by magicboy(匿名) on 2008/3/18 15:51:40
  • re: 我眼中的编程之美
    赞一个,把算法能力和项目工程能力区别开来对待是现在很多一线开发人员的通病,我曾经也深陷这个误区不能自拔
    by Anrs(匿名) on 2008/3/13 8:35:41
  • 回复: Hard Drive
    很有同感,我喜欢!!!!!!!!!
    by borcala(匿名) on 2008/2/18 20:47:00
  • 回复: Hard Drive
    很有同感,我喜欢!
    by borcala(匿名) on 2008/2/18 20:46:00
  • 回复: Hard Drive
    看来还是有些人关注这本书的:) <br> <br>&gt;&gt;lzz, xjb: <br>我一直都是&quot;敏于思而疏于行&...
    by VincentChen(匿名) on 2008/2/15 21:19:00
  • 回复: Hard Drive
    Hard Drive = 用力开车的意思。 <br> <br>但是“用力开车”查不到这样的书。
    by ralph(匿名) on 2008/2/14 17:20:00
  • 回复: Hard Drive
    有中文版本嗎?
    by 阿牛(匿名) on 2008/2/14 16:47:00

广告

 

    CommunityServer的搜索功能是通过定时对cs_Post表中的新增文章进行增量分词索引(由communityserver.config的Jobs配置节中ForumIndexing, GalleryIndexing, WeblogIndexing和FilesIndexing完成), 将分词索引结果hash后记录到cs_SearchBarrel表中, 搜索时再根据cs_SearchBarrel同其他表进行关联查询来实现的. 从CS诞生至今, 它的搜索功能一直对中文支持得很不好, 究其原因, 通过查看cs_SearchBarrel表中Word字段的值就可以发现, 主要是由于它对中文分词的实现很糟造成的. 所以一种解决方案是引入一个新的效果更好的中文分词组件, 而我采用的实现方案是使用SQL Server内置的Full-text index服务.

    CS中广泛采用了Provider模式来实现各种功能, 搜索模块也不例外, 我们主要关注的有两个类, 一个是SearchTerms类, 一个是继承自SearchProvider类的SearchBarrelProvider类, SQL全文检索采用的是原文, 所以实现步骤如下:
    1. 首先将SearchTerms类中对搜索关键字进行hash的代码去掉, 一是在对TokenizeKeywords方法进行调用时将第二个参数赋为false, 二是修改GetAndOrKeywords方法去掉对关键字hash的代码.
    2. 其次我们要修改SearchBarrelProvider中的SQL查询字符串, 用全文检索的CONTAINS/FREETEXT谓词取代对cs_SearchBarrel表的关联查询. 同时数据库中的cs_SearchBarrel_Search存储过程也需要修改以去除对cs_SearchBarrel的查询操作.
    3. 最后为cs_Posts表的Body字段创建Full-text Index, 设置一个schedule每隔一段时间增量索引一次, 修改communityserver,config文件注释掉那几个CS内置的定时索引Jobs, 重新编译源码, CS就开始采用SQL内置的全文检索功能了, 从实际使用的角度看, 效果还是蛮不错的. (具体修改细节请参考文后的附上的代码下载)

    Google.cn主页的搜索框在用户键入关键字时会自动出现一个相关关键字的下拉列表供用户选择, 我们采用AJAX Controls Toolkit中的AutoComplete控件也可以为CS的搜索输入框实现同样的效果. 下面是实现步骤:
    1. 首先创建一个名为cs_QueryHistory表, 它具有三个字段:QueryWord(搜索词), ResultCount(搜索结果数), QueryCount(同一搜索词被采用的次数), 在每次用户进行搜索之后, 如果此次搜索词已经在cs_QueryHistory表中存在, 则更新对应的QueryCount和ResultCount, 否则插入一条新的数据.
    2. 然后建立一个名为QueryAutoComplete.asmx的web service提供给AutoComplete控件, web service提供一个声明为public string[] GetCompletionList(string prefixText, int count)的web method, 被调用时会根据prefixText查询cs_QueryHistory表, 返回由prefixText作为前缀以及数量为count的string数组. 为了提高效率, 我们还可以将由a-z开头的所有关键词预先取出置入缓存中以加快响应速度.

    在调试过程中还发现了两个问题, 一是CS中的输入框控件DefaultButtonTextBox在回车时会触发设置到它的button属性上的按钮的postback行为, 而在AutoComplete控件的下拉框中选取好某个备选条目时, 也是用回车键进行确认的, 这就造成了事件处理先后问题, 如果AutoComplete控件先响应了回车的keydown事件, 则一切正常. 否则, DefaultButtonTextBox先行响应了回车的keydown事件, 会使得AutoComplete控件改变搜索框中值的行为发生在postback之后. 也就意味着submit到服务器的表单中不是我们选中的条目, 而是在搜索框中未补全的关键词. 第二个问题是, 当返回的string数组不足count条目时, AutoComplete控件的下拉框中会用多条名为”null”的条目替代, 用户体验很不好. 还好AJAX Controls Toolkit是开源的, 我们下载源码修改AutoComplete控件客户端脚本中的_onKeyDown响应方法, 在用户选取条目的同时就同时更新文本框的值, 而不必用回车确认. 同时修改呈现下拉框的_update方法, 在增加新条目的循环中加一条判断语句, 一旦遇到null值或者string长度为空则break跳出. 重新编译AJAX Control Toolkit程序集并在CS项目中刷新引用. 这样就实现了关键字自动补完功能.

    后记: 通过对CS搜索模块的改进, 发现里面有一些不甚必要代码, 一个简单的过程偏偏要弄得非常复杂, 一个模块的调用要经历大量的继承和多态绑定, 很多人反映CS整体效率不高也就不足为奇了. 当然ASP.NET2.0往往也就陪上成了替罪羊...我在调试过程中, 还发现, 默认的搜索模块拼接出来的查询串相当恐怖, 当搜索"过程 and 计划 or CommunityServer"时, 拼接出来的查询串居然是: SELECT DISTINCT P.PostID, P.SectionID, Weight = (B0.Weight + B1.Weight), P.PostDate FROM cs_SearchBarrel B0, cs_SearchBarrel B1, cs_Posts P, cs_Sections F WHERE (B0.WordHash = -2605057 OR B0.WordHash = -272220937) AND B1.WordHash = -405848999 AND B0.PostID = P.PostID AND B1.PostID = P.PostID AND (P.SectionID in (3)) AND F.SectionID = P.SectionID AND P.SettingsID = 1000 AND F.IsSearchable = 1 AND P.IsApproved = 1 ORDER BY Weight DESC, PostDate DESC, 我们可以看到, 有n个查询关键词, 那么cs_SearchBarrel表就要被嵌套进行自然连接n-1次, 查询复杂度会随着关键字数量增多呈指数级(X^n, n增长)增大, 当索引表在一段时间不断膨胀后, 针对相同的query, 查询的复杂度又会依据幂级数(X^n, X增长)增大!

源码下载

我是陈远(Vincent Chen), 正在上研, 对Web开发和数据挖掘技术很感兴趣, 我的邮件是NickLedson[at]gmail[dot]com, 欢迎交流:-)

打印 | 张贴于 2007-04-09 21:32:00 | Tag:WEB开发

留言反馈

#回复: 改进CommunityServer的搜索功能 编辑
重新编译AJAX Controls Toolkit即可...
2007-04-20 23:50:00 | [匿名:VincentChen]
#回复: 改进CommunityServer的搜索功能 编辑
文中提到,可以修改AutoComplete控件客户端脚本,我想请教一下:修改后的脚本如何让他生效呢?也就是如何让客户端执行我们修改后的而不是原始的脚本?
比较紧急,望不吝赐教!
2007-04-20 10:40:00 | [匿名:cunet]
#回复: 改进CommunityServer的搜索功能 编辑
>>wollaston

CS的写cache策略是透写, 读cache策略是LRU(latest recently used), 这种策略对内存的要求很高, 因为它基本思想就是, 存储是廉价的, 用它来换性能划得来. 具体代码分析博客园曾经有人写了一个系列文章, 还有宝玉的博客上也有一部分, 多搜一搜吧.
2007-04-19 15:33:00 | [匿名:VincentChen]
#回复: 改进CommunityServer的搜索功能 编辑
quote:我觉得cs的缓存设置也不甚合理

能详细说么?我这两天看cs的代码。不知道有没有人系统分析过。或者统一整理过。
2007-04-19 14:41:00 | [匿名:wollaston]
#回复: 改进CommunityServer的搜索功能 编辑
SQL里面会不会也有效率问题呢?比如说拼SQL串这些的,用多了,会把SQL服务器拖死的.
2007-04-11 10:30:00 | [匿名:铁匠]
#回复: 改进CommunityServer的搜索功能 编辑
我正准备改进这个玩意呢,被你抢先了,呵……
2007-04-10 21:54:00 | [匿名:天天向上]
#回复: 改进CommunityServer的搜索功能 编辑
当然会有效率低下是有各方面原因的, 大量的多态和反射当然是其中之一, 我觉得cs的缓存设置也不甚合理
2007-04-10 18:06:00 | [匿名:NickLedson]
#回复: 改进CommunityServer的搜索功能 编辑
觉得继承和多态虽然会影响效率,但是不会有严重影响,查询串的那个还比较靠谱, root cause 不要这么轻易下结论
2007-04-10 09:33:00 | [匿名:helixapp]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode.MVC引擎 0.5.2.0