文章目录
  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. 重建索引