文章目录
  1. 1. 下载IK Analyzer
  2. 2. 解压到solr
  3. 3. 配置IK分词
  4. 4. 启动Solr
  5. 5. 在Rails3中使用sunspot
    1. 5.1. 添加到rails
    2. 5.2. 更改Model
    3. 5.3. 重建索引

本来想在rails中使用ElasticSearch做为全文搜索的,但对27W的数据建立索引后发现索引文件比原始数据还大。原始数据存在postgresql中,大小为1.8G,索引到ElasticSearch后却有2G,这还是不存储_source的情况下,不然更大。然后就去试了一下solr,solr在rails3里面可以用sunspot。从文档里看起来使用非常简单,直接整合到ActiveRecord,而且默认自带一个solr3.5,但不支持中文分词,所以需要自己加上。我这里使用了IK,mmseg的方法应该也类似。

下载IK Analyzer

在这里我是下载了 IKAnalyzer2012_u6.zip。

解压到solr

我是用rvm安装的ruby,所以sunspot带的solr路径是 /home/chronos/.rvm/gems/ruby-1.9.3-p374/gems/sunspot_solr-2.0.0/solr/ 。

将里面的 IKAnalyzer2012_u6.jar 解压到solr的 /home/chronos/.rvm/gems/ruby-1.9.3-p374/gems/sunspot_solr-2.0.0/solr/solr/lib 目录下面,如果没有lib目录就自己建一个。别解压到 /home/chronos/.rvm/gems/ruby-1.9.3-p374/gems/sunspot_solr-2.0.0/solr/lib 下面,我刚开始也一直以为是那个目录,然后就一直提示出错。

配置IK分词

找到 schema.xml 更改其中的 fieldType。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" useSmart ="false"/>
<!-- <tokenizer class="solr.StandardTokenizerFactory"/> -->
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" useSmart ="false"/>
<!-- <tokenizer class="solr.StandardTokenizerFactory"/> -->
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.PositionFilterFactory" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
</fieldType>

这里的 useSmart 是不使用智能分词

启动Solr

1
sunspot-solr start -d data

data是指索引数据存放的位置,详细的使用方法请看 sunspot-solr –help 。

在Rails3中使用sunspot

添加到rails

1
rails generate sunspot_rails:install

执行完上面的命令后会在config文件夹里生成一个 sunspot.yml ,配置里面的选项,选项很简单就不在这里列出来了。

更改Model

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Post < ActiveRecord::Base
searchable do
text :title, :body
text :comments do
comments.map { |comment| comment.body }
end

boolean :featured
integer :blog_id
integer :author_id
integer :category_ids, :multiple => true
double :average_rating
time :published_at
time :expired_at

string :sort_title do
title.downcase.gsub(/^(an?|the)/, '')
end
end
end

只要在Model里面添加searchable段的内容就可以了,具体的字段配置根据自己的实际数据结构和需求调整。

重建索引

1
rake sunspot:reindex

执行上面的命令就可以自动的重建索引,我这里重建完索引后的最终大小是920.3MB。

tip

Gemfile 文件里面添加 gem ‘progress_bar’ 并 bundle install 一下,然后再执行上面的命令时可以显示索引进度。

sunspot 的详细用法可以看它的文档 。

文章目录
  1. 1. 下载IK Analyzer
  2. 2. 解压到solr
  3. 3. 配置IK分词
  4. 4. 启动Solr
  5. 5. 在Rails3中使用sunspot
    1. 5.1. 添加到rails
    2. 5.2. 更改Model
    3. 5.3. 重建索引