javaeye:JavaEye3.0开发手记的 4 - ruby的全文检索

  在Java平台上面lucene是众望所归全文检索工具lucene性能不俗稳定第 3方扩展和分词算法众多但是在RoR方面就没有那么幸运了JavaEye网站WebSite要做全文检索如何来解决全文检索问题呢?

  在ruby平台上面全文检索有 3个途径:

  1、solr, acts_as_solr

  solr是apache开源组织个项目完全基于lucene最新版本在lucene上层提供了个基于HTTP/XMLWeb Servicessolr发行包自己绑定了jetty6.0应用服务器可以直接启动成为个独立全文检索web服务

  由于和solr通讯方式是标准基于HTTPXML所以你可以使用任何编程语言JavaCRubyPython都不在话下你通过向solr发送xml查询请求让solr在后台运行lucene返回结果也被封装为xml当然你也可以让solr去做索引基本上solr就是 lucene个Web服务封装solr优势在于为大规模全文检索做了很多缓存Cache优化由于采用xml也不限于客户端种类

  RoR有个叫做acts_as_solr插件封装了ruby对solr访问如果你喜欢用solr作为全文检索acts_as_solr是个不错选择他可以很方便让你RoR应用添加全文检索功能考虑到lucene稳定性这个方案是个相当不错选择

  但是这个方案缺点也是显而易见RoR应用所有全文检索都要依赖后台再次向solr服务器发送web请求来获取结果单个页面执行速度肯定会受限于后台跨httpweb请求这对于那些对全文检索功能依赖特别多网站WebSite来说恐怕很难接受因此JavaEye3.0不采用solr方案

  2、sphinx

  http://robbin.javaeye.com/blog/122696

  我已经在上篇博客当中介绍了sphinx我个人非常青睐sphinx这种独立第 3方全文检索服务器而且能够和MySQL结合很好更不用说其优异性能了但是sphinx缺点在于没有很好分词扩展接口它是个纯C开发服务这对于中文分词功能支持来说就很难实现了因此不得不遗憾放弃

  3、ferret

  ferret是ruby平台模仿lucene个移植软件Software但是ferret并非纯ruby实现而是基本上用C编写而成只有少量面向接口是ruby写ferret虽然和lucene很像连API也基本但是ferret成熟度远远不及lucene这表现在:

  1) ferret不支持中文分词

  2) ferret用C编写其索引格式和lucene不兼容

  3) ferret索引速度很慢而且很不稳定

  4) windows平台ferret在search时候会崩溃

  尽管ferret有上面这些缺点但是RoR平台可供选择余地却不大因此还是决定使用ferret

  ------------------------------ ferret 分割线 ------------------------------

  1、acts_as_ferret (AAF)

  AAF是个相当不错RoR插件封装对ferret操作但是经过我考察决定弃用AAF这是AAF是直接绑定到model上面这会带来些问题:

  1) 每当model对象被insert/update/delete时候AAF会通过model回调实时更新全文索引在生产环境这是个很可怕事情多个ruby进程同时更新索引就会出问题所以AAF索性提供个DRB方式ferret server让你在生产环境去用

  但即便如此如果多个ruby进程同时更新索引呢? 考虑到rubygreen thread性能drb server也很容易就被阻塞住而且退步来说即便drb性能很好每个全文检索请求都去发起次ruby远程恐怕也是很难接受事实

  2) AAF索引每条model记录但我却不想索引隐藏贴况且我索引机制也不想绑定在model上面

  2、中文分词问题

  如果只是简单中文单字拆分到不难支持只需要利用RegexpAnalysis写个正则表达式去匹配UTF-8编码中文就行了目前JavaEye全文检索就是这样处理貌似搜索结果还过得去

  但是如果要追求非常精确搜索结果则必然需要通过词典最大匹配算法去进行中文分词那就只能自己用ruby来写中文分词算法了这个是留待我们今后要做工作

  2、ferret索引稳定性问题

  JavaEye网站WebSite有8万topic30万post由于ruby本身性能不佳ferret又不很稳定在服务器上面直接做index差点把服务器搞瘫了所以此路不通

  由于全文检索并不需要很高实时性所以我们解决办法就是每天晚上把数据库数据下载到本地台式机上面然后在本地台式机上面导入数据库进行全量索引然后在压缩打包上传到服务器上面去这样每天全文检索结果只会迟后时间基本上可以满足需求了

Tags:  javaeyeandroid javaeye是什么 javaeye.com javaeye

延伸阅读

最新评论

发表评论