ElasticSearch的一点点使用经验

为啥要使用

可以分词、全文搜索

安装方法

官方源

使用添加es官方安装源的方式 官方源安装ES步骤

Docker版

这个目前最为省心,强烈推荐。

1
2
3
4
5
6
7
FROM docker.elastic.co/elasticsearch/elasticsearch:6.3.2

# 安装ik分词插件,特别注意插件版本需要与ES的版本相匹配,否则会启动不了
RUN ./bin/elasticsearch-plugin install --batch https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.2/elasticsearch-analysis-ik-6.3.2.zip

EXPOSE 9200 9300

导入数据

创建索引

ES6和ES5以及之前的版本有很大区别,下面的创建索引适用于ES6以上版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
curl --header "content-type: application/JSON" -XPUT 'http://localhost:9200/some_index' -d '
{
"mappings": {
"index_name": {
"properties": {
"id": { "type": "long"},
"desc": {
"term_vector": "with_positions_offsets",
"type": "text",
"analyzer": "my_analyzer"
},
"path": {
"type": "text"
}
}
}
},
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"filter": [
"lowercase"
],
"char_filter": [
"html_strip",
"escape_sign"
],
"tokenizer": "ik_max_word"
}
},
"char_filter": {
"escape_sign": {
"type": "mapping",
"mappings": [
"@=>lkjds3"
]
}
}
}
}
}'

导入数据可以用这个第三方包:laravel-elasticsearch,配合写一个Command脚本就行了。

中文分词

手工编译源码

分词采用 IK Analysis for Elasticsearch,首先需要安装Java的打包工具mvn,然后clone上面github上面的代码,执行打包命令。

1
mvn package

打包完成后会生成target目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
├── config
│   └── ik
├── LICENSE.txt
├── pom.xml
├── README.md
├── src
│   └── main
└── target
├── archive-tmp
├── classes
├── elasticsearch-analysis-ik-1.8.0.jar
├── elasticsearch-analysis-ik-1.8.0-sources.jar
├── generated-sources
├── maven-archiver
├── releases
└── surefire

11 directories, 5 files

官方编译版本

推荐这种方式 https://github.com/medcl/elasticsearch-analysis-ik/releases

安装

接着拷贝解压出target/releases/elasticsearch-analysis-ik-1.8.0.zip到ES根目录下的plugins目录(如果没有新建一个即可)下即可

本地的ArchLinux以及线上的CentOS均是位于如下目录

1
/usr/share/elasticsearch

目录结构如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
plugins/
└── ik
├── commons-codec-1.9.jar
├── commons-logging-1.2.jar
├── config
│   └── ik
│   ├── custom
│   │   ├── ext_stopword.dic
│   │   ├── mydict.dic
│   │   ├── single_word.dic
│   │   ├── single_word_full.dic
│   │   ├── single_word_low_freq.dic
│   │   └── sougou.dic
│   ├── IKAnalyzer.cfg.xml
│   ├── main.dic
│   ├── preposition.dic
│   ├── quantifier.dic
│   ├── stopword.dic
│   ├── suffix.dic
│   └── surname.dic
├── elasticsearch-analysis-ik-1.8.0.jar
├── elasticsearch-analysis-ik-1.8.0.zip
├── httpclient-4.4.1.jar
├── httpcore-4.4.1.jar
└── plugin-descriptor.properties

4 directories, 20 files

需要注意的是plugins下的文件用户和组需要设置为:elasticsearch,否则会导致ES启动不了

1
chown -R elasticsearch:elasticsearch plugins/

重启ES后就可以在对应的索引里头把analyzer修改成ik对应的几个分词器了

其他分词插件

有兴趣的老铁可以研究一下,目前IK对我来说是够了。

简繁转换

使用 STConvert Analysis for Elasticsearch 来进行繁体到简单的转换,代码clone下来后,使用mvn命令打包一下

1
mvn package

打包成功后,可以在target/release目录内找到对应的包

1
2
3
4
5
6
7
8
9
[INFO] Reading assembly descriptor: /home/vagrant/dev/elasticsearch-analysis-stconvert/src/main/assemblies/plugin.xml
[INFO] Building zip: /home/vagrant/dev/elasticsearch-analysis-stconvert/target/releases/elasticsearch-analysis-stconvert-1.8.3.zip
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12:06 min
[INFO] Finished at: 2016-06-22T14:26:37+08:00
[INFO] Final Memory: 32M/212M
[INFO] ------------------------------------------------------------------------

编辑插件包的时候千万注意版本问题,否则ES会报插件版本不符合的!

遇到的问题

query phase execution exception result window is too large

这个问题是因为默认窗口太小引起的,解决方式也很简单。

1
curl -XPUT "http://localhost:9200/some_index/_settings" -d '{ "index" : { "max_result_window" : 100000 } }'

无法搜索@、!、.、等等特殊符号

这个问题是因为ES在建立索引的时候,会将这些字符视为无用字符。
一个比较土的方法,在索引的时候把@符号替换成某一串字符(一定不要是常用字符串)比如:uhbbgt,在检索的时候使用mapping把@符号再替换为uhbbgt即可。

参考文档