深入探索:Windows+Rails+Sphinx进行中文全文检索

原发 blogkid.cn

 

先说点题外话,以后大家买独立服务器的时候,还是买linux的吧。如今这么活跃的开源社区为linux贡献了好多柴火,而相应的软件在windows实在发展得缓慢。要是我当初买了linux服务器,以前和现在都能少许多烦恼,今天的“深入探索”,根本就用不着。

事情是这样的,我手头的一个项目里,打算用rmmseg+ferret+acts_as_ferret搭配起来做全文检索。一直也相安无事,直到我 今天决定放到生产环境试试看。这一试不要紧,发现DRB服务器启动不起来,提示的是”fork() funtion is unimplemented on this machine”。windows上哪里有fork啊,我顿时欲哭无泪。如果不用DRB的话,就也不能用acts_as_ferret了(原因请看 robbin的这个帖子 )。

恩,这时我并没有灰心,因为我在前几天看到了另一个解决方案 ,用的是sphinx,狮身人面。其中有windows版本的安装:

在Windows上安装
在Windows上为Sphinx打补丁、编译、连接libmmseg要比在Linux上做这些事情麻烦得多,而且大多数Windows上的开发人员都没有自己编译开源软件的习惯,幸好李沫南已经做了一个安装包:
http://www.coreseek.com/ft/csft_setup_2.5.1.exe
执行这个安装包即可安装Coreseek的Windows版,假设将Coreseek安装在D:\CsFullText25
将D:\CsFullText25\bin加入到环境变量PATH中,以便以后在命令行能够找到Sphinx提供的各种工具。

安装Ultrasphinx
Sphinx在Linux和Windows上都已经安装好了,我们可以通过一个Rails程序来做一下测试。
假设我们原先有一个Rails应用thought_log
cd thought_log
ruby script/plugin install -x svn://rubyforge.org/var/svn/fauna/ultrasphinx/trunk
若这个Rails应用尚未提交到SVN中,或者使用其他版本管理工具,则使用
ruby script/plugin install svn://rubyforge.org/var/svn/fauna/ultrasphinx/trunk
注意,执行这条命令前需要先安装好SVN for Windows(不是TortoiseSVN)。

当我按部就班执行到红色的那一步,命令行里提示我该svn不存在。我直接打开,也是404错误。这个最重要的rails插件,在我要安装的时候,居然消失了。

百般无奈,只好放一放,出去打个电话。电话回来,突然有了灵感,尝试用”gem install ultrasphinx”,居然安装成功了,不过是作为gem。没关系,我跑到gems目录下,找到ultrasphinx的文件夹,整个复制到 rails项目的vendor下面,同时把文件夹改名为ultrasphinx。

果然,gem安装的ultrasphinx就是那个消失的rails插件,不晓得为啥从插件变身gem了。但是探索还没有结束:

为了在Windows上正常使用Ultrasphinx,需要为Ultrasphinx打一点补丁:
修改vendor/plugins/ultrasphinx/tasks/ultrasphinx.rake

在文件最后加入:
def os_path path
if RUBY_PLATFORM =~ /mswin32/
path.gsub!(’/', ‘\\’)
end
path
end

然后将其中的:
“searchd –config ‘#{Ultrasphinx::CONF_PATH}’”
改为:
“searchd –config \”#{os_path(Ultrasphinx::CONF_PATH)}\”"

这样修改的原因是类似以下的写法:
searchd –config ‘D:/WORK/thought_log/config/ultrasphinx/development.conf’
在Windows上是无法正常运行的,必须改为:
searchd –config “D:\WORK\thought_log\config\ultrasphinx\development.conf”

除了例子中对searchd的调用,在ultrasphinx.rake文件中所有执行命令行调用的地方都需要做这样的修改。

看出来了吧,需要这么打补丁,是因为人家ultrasphinx根本就是为linux做的。想在windows上跑起来,要做的远远不止这些。

经过我的不断尝试,发现在ultraphinx.rake中,所有涉及到system调用的,全部需要重写。使用”kill -9 #{XXXpid}”的地方,我都改成了”task /f /im searchd.exe”,这样可以确保在使用”rake ultrasphinx:daemon:stop”时能杀掉伺服的进程。但是另一个函数”ultrasphinx_daemon_running?”是通 过linux的ps命令查看进程是否存活,我不知道怎么修改,就干脆屏蔽了它,不知道会不会带来别的后果。

在经历大量修改之后,运行”rake ultrasphinx:index”终于可以正常地生成索引了,速度那叫一个快。

运行”rake ultrasphinx:daemon:start”也可以正常启动伺服器,Oh Yeah!

sphinx+ultrasphinx+libmmseg终于可以正常工作了。我把自己修改之后的ultrasphinx在GoogleCode开了一个project,如果大家需要,可以在http://code.google.com/p/ultrasphinx-win32/ 获得,配合这篇文章 ,相信,可以让你少走很多弯路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值