-
Notifications
You must be signed in to change notification settings - Fork 0
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
目录下,这里要新建一个plugins
和 plugins/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 中的例子操作
首先需要在 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
通过 settings
和 mappings
接口来设置用户的 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 settings 和 get mapping,以 users index 为例:
curl -XGET 'http://localhost:9200/users/_settings?pretty'
curl -XGET 'http://localhost:9200/users/_mapping?pretty'
关于 elasticsearch 的基本使用就介绍这么多,更多需求请查阅文档。