要在Rails上使用全文检索,选择一直不多,以前我一直是使用Ferret + Act_as_ferret + rmmseg的.不过Ferret不支持ruby 1.9,好像也很久没更新了.现在Rails上可用的全文检索又多了一个,那就是Thinking Sphinx . JavaEye的 司徒正美 同学已经写了篇介绍TS的大作,详见利用thinking sphinx实现全文检索 .我只是记录一下我在本机的安装和使用.
安装:
- 安装coreseek:Coreseek全文搜索服务器,它是基于Sphinx的.作者已经提供各个平台的可用版本,并提供下载 我的机器是ubuntu 9.04,所以安装非常的简单,直接下载deb包回来安装即可,没有遇到任何问题.
- 安装mmseg:这个是用来中文分词的.刚才那个下载地址就可以下载,除了下载deb安装包(如果你也是使用ubuntu的话),还记得下载它的源代码回来,因为生成中文词典的时候要用.
- 安装thinking sphinx :我是使用gem的方法安装,详细的安装方法,请参看官方的说明文档,很详细.
配置:
- 在config/environment.rb文件中加上一句:config.gem "freelancing-god-thinking-sphinx",:lib => 'thinking_sphinx',:version => '1.2.5'
- 在你的项目根目录下的Rakefile文件上加上: require 'thinking_sphinx/tasks'
这个的作用就是你可以使用TS为你准备的很多个rake task. - 在你的model中加上索引: #基本上都是这样子的
define_index do indexes :content has :created_at set_property :delta => true #这个是实时索引,注意,你的model表中得有delta这个字段,类型是boolean end
- 执行这个rake(请注意第 2 步): #如果你不生成配置文件的话
执行完这个,在config目录,你会看到 development.sphinx.conf 这个文件.rake ts:in #但是如果没有配置文件的话,你不能配置中文分词,所以还是用下面这个吧 rake ts:index
- 在修改 development.sphinx.conf 配置文件之前,要先生成中文分词的词典. cd mmseg-3.1/data
tar xvfz mmseg-3.1.tar.gz mmseg -u unigram.txt #这时目录下会生成一个unigram.txt.uni文件,这个就是词典了,要改名,这个是必须的,名字也是定死的,只能是uni.lib mv unigram.uni uni.lib #然后随便把它放到一个目录去,这个目录在配置Sphinx的时候有用,比如我的 cp uni.lib ~/xdict
- 修改 development.sphinx.conf 配置文件 #找到这个文件中 charset_type = utf-8 的地方
charset_type = utf-8 #改为: charset_type = zh_cn.utf-8 #并在下面多加一句: charset_dictpath = /home/yanghuan/xdict/ #这个目录就是存放刚才中文词典的目录
中文全文检索基本上大功告成.
有些值得注意的地方:
- 由于使用了实时索引,所以之前的数据是没有索引的,如果你要重建索引的话,可以使用 rake ts:rebuild
但是不知为何,我重建索引的时候,配置文件居然也变成了默认,所以如果你修改过配置文件的话,要小心. - 1.2版本以上 #1.2版本以上,使用
ThinkingSphinx.search #这个不再使用了 ThinkingSphinx::Search.search
-
ThinkingSphinx.search params[:q],:classes => [Post,Comment],:match_mode => :any #当 params[:q] = 'this' ,注意这里是一个单词的时候,无法匹配,我理解这个模式是任意匹配其中之一,不知是为何.
其它的Thinking Sphinx的使用方法可以上它的官方网站看,上面已经介绍得很详细了.而coreseek的安装也已经极为方便,也就是中文分词的配置是要注意一下的.
在网上也找到其它几篇写得很详细的coreseek安装的文章,共享之.