使用Docker安装ES

  1. 设置Docker网络
1
docker network create es-net
  1. 拉取ES镜像
1
2
docker pull elasticsearch:7.12.1
docker pull kibana:7.12.1

如果有打包好的tar包, 可以使用docker load -i xxxx.tar完成加载

  1. 运行ES镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker run -d --name es \
-e "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" \
-e "discovery.type=single-node" \
-v es-data:/usr/share/elasticsearch/data \
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network=es-net \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.12.1

# -d 表示后台运行
# --name 表示容器名为es
# -e 设置环境变量, JAVA堆内存为1G, 设置为单点模式运行
# -v 设置数据保存目录和插件目录
# --network 加入Docker网络es-net
# -p 暴露端口映射, 9200是HTTP端口, 9300是集群各个节点互联端口
  • 进入浏览器ip:9200, 出现一个JSON表明运行成功
  1. 运行Kibana
1
2
3
4
5
6
7
docker run -d --name kibana \
-e ELASTICSEARCH_HOSTS=https://es:9200 \
--network=es-net \
-p 5601:5601 \
kibana:7.12.1

# 因为在同一个es-net中, 所以可以使用es名称加端口号互联
  • 进入ip:5601即可正常使用
  • Dev Tools可以写DSL语句, 并将语句发送给ES, 本质就是发送一个Restful的请求到网络中

安装分词器

1
2
3
4
5
POST /_analyze
{
"text": 你好,我在南邮学习Java,
"analyzer": "english"
}

无论使用英文分词器(english), 中文分词器(chinese), 还是标准分词器(standard), 都没有办法区分中文

所以一般使用IK分词器

  1. 在线安装
1
2
3
4
5
6
7
8
# 进入容器内部
docker exec -it elasticsearch /bin/bash
# 在线下载安装(版本需要严格对应, 不然会报错)
bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/7.12.1

# 退出重启
exit
docker restart elasticsearch
  1. 离线安装
1
2
3
4
5
6
7
# 查看Docker plugins目录位置
docker inspect es-plugins
# 将IK分词器的文件夹放到plugins目录中即可
# 重启es容器
docker restart es
# 查看日志
docker logs -f es
  • IK分词器包含最少切分(ik_smart)和最细切分(ik_max_word)

IK分词器支持扩展, 只需要修改config目录中的IkAnalyzer.cfg.xml文件

1
2
3
4
5
6
7
<properties>
<comment>Ik Analyzer 扩展配置</comment>
<!--配置扩展词典, 这个其实是一个文件名, 在同一目录下新建-->
<entry key="ext_dict">ext.dic</entry>
<!--配置停用词典-->
<entry key="ext_stopwords">stopword.dic</entry>
</properties>

配置完成后重启容器生效

使用ES

mapping属性

mapping是对索引库中文档的约束

属性 含义
type 字段数据类型, 字符串分为text(可分词文本), keyword(精确值, 比如国家, 品牌, 姓名); 数值类型分为: long integer short byte double float; boolean类型; 日期(date); 对象(object) ; 没有数组, 但是允许一个字段有多个值
index 字段是否创建倒排索引, 默认为true
analyzer 使用哪种分词器, 只有text类型需要分词
properties 该字段的子字段

创建索引库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PUT /索引库名
{
"mappings": {
"properties": {
"字段1": {
"type": "text",
"analyzer": "ik_smart"
},
"字段2": {
"type": "keyword",
"index": false
},
"字段3": {
"properties": {
"子字段": {
"type": "keyword"
}
}
},
// ...
}
}
}

查看索引库

1
GET /索引库名

删除索引库

1
DELETE /索引库名

修改索引库

ES禁止修改索引库原有字段, 但是可以添加新的字段

1
2
3
4
5
6
7
8
9
10
11
PUT /索引库名/_mapping 
{
"properties": {
"新字段名": {
"type": "integer"
}
}
}
// 新字段名不能与原有字段名重复
// 如果修改字段会报400
// 如果查看不存在的索引库会报404

新增文档

1
2
3
4
5
6
7
8
POST /索引库名/_doc/文档id
{
"字段1": "值1",
"字段2": {
"子字段1": "值2",
// ...
}
}

查询文档

1
GET /索引库名/_doc/文档id

删除文档

1
DELETE /索引库名/_doc/文档id

修改文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 全量修改, 先删除旧文档, 添加新文档
PUT /索引库名/_doc/文档id
{
"字段1": "值1",
"字段2": {
"子字段1": "值2",
// ...
}
}
// 增量修改
POST /索引库名/_update/文档id
{
"doc": {
"字段名": "新值",
}
}