使用Docker
安装ES
- 设置
Docker
网络
1
| docker network create es-net
|
- 拉取
ES
镜像
1 2
| docker pull elasticsearch:7.12.1 docker pull kibana:7.12.1
|
如果有打包好的tar
包, 可以使用docker load -i xxxx.tar
完成加载
- 运行
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
表明运行成功
- 运行
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 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 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" } } }, // ... } } }
|
查看索引库
删除索引库
修改索引库
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 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": { "字段名": "新值", } }
|