Skip to content
billie66 edited this page Sep 29, 2014 · 6 revisions

添加中文分词器 ik

Elasticsearch 默认使用的分词器是 standard,但是对中文的支持不准确。举个例子,如果要搜索 中文,我们期望的结果是包含 中文这个词组的匹配项,但 elasticsearch 会按单个字来匹配,出现很多无用的内容。解决这个问题的方法就是用更精确的中文分词器, 网上流行的是 ik,源码地址。ik 可以做为插件安装到 elastic 中。

安装环境

  • linode (ubuntu 12.04)
  • java version "1.7.0_65"
  • elasticsearch '1.3.2'

首先安装 java

sudo apt-get install openjdk-7-jre-headless

java 的安装位置是 /usr/lib/jvm

cd /usr/lib/jvm
$ ls -l
lrwxrwxrwx 1 root root   19 Aug 24 03:52 java-1.7.0-openjdk-amd64 -> java-7-openjdk-amd64
drwxr-xr-x 5 root root 4096 Sep 29 06:59 java-7-openjdk-amd64

看一下 java 版本:

$ java -version
java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.1) (7u65-2.5.1-4ubuntu1~0.12.04.2)
OpenJDK Client VM (build 24.65-b04, mixed mode, sharing)

接下来要知道 elastic 的安装路径以及配置文件所在位置,在 Ubuntu 中运行命令:

dpkg -L elasticsearch

这样就找到了与 elasticsearch 相关的所有文件了,官方文档的默认配置, 安装路径为 /usr/share/elasticsearch,配置文件 elasticsearch.yml 所在的目录 /etc/elasticsearch

安装 ik 插件,插件名字 elasticsearch-analysis-ik-1.2.6.jar下载地址

cd ~/Download
wget https://github.com/medcl/elasticsearch-rtf/blob/master/plugins/analysis-ik/elasticsearch-analysis-ik-1.2.6.jar

ik 插件下载完毕后,只要把它复制到 /usr/share/elasticsearch/plugins/analysis-ik 目录下,这里要新建一个pluginsplugins/analysis-ik 目录,

cd /usr/share/elasticsearch
sudo mkdir plugins
sudo mkdir plugins/analysis-ik
sudo cp ~/Download/elasticsearch-analysis-ik-1.2.6.jar plugins/analysis-ik

工作仍没完成,还得安装 ik 字典文件 ik.zip,点击下载地址,得到 ik.zip

解压 ik.zip,并把解压后的目录文件复制到 /etc/elasticsearch 下,

unzip ik.zip
sudo cp -rf ik /etc/elasticsearch

为了让 ik 插件生效,还需要修改 elasticsearch 的配置文件,打开文件 /etc/elasticsearch/elasticsearch.yml, 在文件的最后,添加以下语句:

index:
  analysis:
    analyzer:
      ik:
        alias: [ik_analyzer]
        type: org.elasticsearch.index.analysis.IkAnalyzerProvider
      ik_max_word:
        type: ik
        use_smart: false
      ik_smart:
        type: ik
        use_smart: true

保存文件,然后重新启动 elasticsearch,才能使所有配置生效。

sudo service elasticsearch restart

下面用 elastic 的 API 测试一下,ik 插件其否安装成功了。先创建一个新的 index,名字为 test

$ curl -XPUT 'http://localhost:9200/test/'
{"acknowledged":true}

然后打开浏览器,访问下面的地址

http://localhost:9200/test/_analyze?analyzer=ik&text=中文分词&pretty

输出结果:

{
  "tokens" : [ {
    "token" : "中文",
    "start_offset" : 0,
    "end_offset" : 2,
    "type" : "CN_WORD",
    "position" : 1
  }, {
    "token" : "分词",
    "start_offset" : 2,
    "end_offset" : 4,
    "type" : "CN_WORD",
    "position" : 2
  } ]
}

若得到这样的结果,证明 ik 插件已经工作了。若在服务器上测试,则可以按照 https://github.com/medcl/elasticsearch-analysis-ik 的 README 中的例子操作

rails 中配置 ik 分词器

首先需要在 model 文件中配置数据的 mapping 方式,假定有一个 User model,那就需要在 user.rb 文件中添加这些代码:

settings index: { number_of_shards: 3 } do
  mappings do
    indexes :name,  type: 'string', index: "not_analyzed"
    indexes :intro, type: 'string', analyzer: 'ik'
  end
end

通过 settingsmappings 接口来设置用户的 intro 字段采用的分词器为 ik, 参考文档

保存文件,要重新索引数据,新的设置才能生效,运行命令:

$ bundle exec rake environment elasticsearch:import:model CLASS='User' FORCE=y
[IMPORT] Done

另外可以在 rails console 中查看某个 index 的 settings 和 mappings, 以 User model 为例:

rails c
User.settings
User.mappings

也可以通过 elastic 的 API 来查看,get settingsget mapping,以 users index 为例:

curl -XGET 'http://localhost:9200/users/_settings?pretty'
curl -XGET 'http://localhost:9200/users/_mapping?pretty'

关于 elasticsearch 的基本使用就介绍这么多,更多需求请查阅文档。

Clone this wiki locally