Ferret中搜索中文
上次看ferret没有找到搜中文的好办法, 今天再死磕一次.
发现acts_as_ferret都进gem了…但是还是不能搜中文!
最终找到一个支持非拉丁语系言语搜索的插件, 作者自己写了一个Analyzer, 装上就OK了, 姑且算是一个办法, 至于质量和具体的实现方式接下来再考证.
还有一片来自宝岛上的文章可以看一下.
[Update 200-7-3] Generate index from mime-type file with ferret
我为什么要用ferret,原因在于招聘系统收到了大量的简历,80%为MSWord,10%+为PDF,一个一个打开看受不了,想用关键词搜索。所以提出一个方案-招聘系统不接受附件,简历直接扔到textarea里面,这样不就能查了么。于是乎Rails重新完成一套系统,时间不超过3天,而用SQL like去查又太小儿科了,数据多了也受不了。于是乎想到Ferret
但是简历在线编辑就爽么?我精心制作的CV岂不是就没意义了!
对用户上传的简历做索引才是王道!于是乎找到了一个叫ff的小工具,利用pdf2text,html2text,antiword 抓出文件内容再利用ferret做index,还可以和rails集成!
[Update 2007-7-3] Run ferret in DrbServer
在production环境下你那一群mongrel很可能跑在N多application server上,这时不能让每个server上都维护一个local ferret,于是乎我们把ferret跑在一个远程的DrbServer上面。方法很简单,acts_as_ferret已经为我们做好了封装,而Drb也是跟随ruby作为内嵌库来的。
不过我发现了一个问题,用gem安装acts_as_ferret后缺少配置文件config/ferret_server.yml 和启动脚本script/ferret_start ferret_stop,应该说是装gem的时候这几个文件没放对地,我手工copy过来也不能用,原因大概是没有正确的require ‘acts_as_ferret’,不知道是我gem装的有问题还是这gem有问题。
最终还是用plugin的方式安装了acts_as_ferret,一切正常。修改一下ferret_server.yml配置文件,script/ferret_start启动DrbServer。再修改一下model,加上:remote => true。Finish!
之后又遇到一个问题,如果需要和其它东西一起做混合式搜索,比如一张表只有一个字段想用ferret处理,其它字段仍然用sql处理怎么办?一个在DB里搜,一个在索引里搜,hack一下代码把两者mix起来?那最终在做pagination怎么办,能处理offset和page number limit么?
最终还是时间优先,采用最简单的方法,ferret搜索的时候用find_id_by_contents查出所有的匹配id,再与其它条件一起放到sql的where条件里搜。两分钟修改完成。
关于DrbServer的配置方法可以参考官方wiki。