ruby中文搜索支持的想法
ruby下面中文分词的搜索如何进行?
目前开始考虑这个问题, 目标是使用ferret, ferret是lucene搜索引擎的ruby版本, 凭借一点lucene的经验, 我个人是非常喜欢ferret的, 靠lucene强大的分词,index,search功能, 可以做出很多有趣的功能, 但是ferret有两个难点
- 不支持中文分词,而且集成第三方分词对我来说较困难(没有开发c的经验,而且我知道的中文分词算法都是java版本)
- 有时候做索引会出错,好象是段地址错误, 因为ferret是在前台index, 所以错误也是在前台fastcig进程中, 感觉很不爽
原来的想法
利用ferret 和lucene兼容的特点, 单独写一个java 类库, 定时对资源做索引,不过后来为了效率(index比lucene快), 新版本的ferret放弃了和lucene兼容, 这个想法是不可行了
更新后的想法
利用mysql中文分词插件,这个东西倒是很好,但是偏偏只支持mysql4.0,和mysql 5.1 beta, 刚好不支持我目前用的mysql5.0.x 由于没有现成版本可以用, 也只好放弃(这个插件只能用来全文搜索, 不像ferret还有其他好玩的功能)
目前的想法:
- 在ferret中通过rjb调用 lucene的中文分词然后再index
- 需要index的model都增加一个属性indexed,新建或者更新的时候都把indexed设置为false
- 把java写好的中外分词通过rjb包装为一个drb service,或者干脆挂在resin上做http页面调用
- 在后台,单独的程序定时启动把所有未index的记录select出来(indexed=false), 然后逐一调用第二步开发的进行分词,即是过程中出错, 也不影响前台页面, 这里只改动ferret的ruby代码.
- 如果可能, 搜索程序通过远程协议来对keyword分词,然后再搜索
缺点
-
这个方案看上去比较恶心.很像一件到处是补丁的衣服, 目前没有时间慢慢去研究ferret中的c代码. 只好通过java来绕圈子
-
在后台运行index的话, 就无法实时搜索当前文章, 而是有一个延时, 不过我觉得这个好解决. 另外后台index 就算出错了也不影响前台页面, 大不了有些记录搜索不到而已
-
对keyword分词会有速度影响, 不过影响应该很小