Docker 安装 ES以及使用

Docker ES 安装

当docker 容器 启动出错时候 可以使用docker logs +容器的名称进行查看
docker下的es安装。 (free -m 先看下虚拟机的内存大小)

  1. docker pull elasticsearch:7.4.2
  2. //主要用于 可视化检索数据
  3. docker pull kibana:7.4.2

docker 下实例化 ES

  1. ### 创建目录
  2. mkdir -p /mydata/elasticsearch/config
  3. mkdir -p /mydata/elasticsearch/data
  4. ### 表示给配置文件中写入配置 任何ip都可以访问
  5. echo "http.host: 0.0.0.0">> /mydata/elasticsearch/config/elasticsearch.yml
  6. ### 启动虚拟机
  7. docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
  8. -e "discovery.type=single-node" \
  9. -e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
  10. -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  11. -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
  12. -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
  13. -d elasticsearch:7.4.2
  14. //修改访问权限 -R 标识递归进行操作 linux 权限数字代码 4:r 2:w 1:x
  15. chomd -R 777 /mydata/elasticsearch
  16. //设置docker 容器自动重启
  17. docker update --restart=always elasticsearch

docker 安装kibana

  1. docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.1.100:9200 -p 5601:5601 \
  2. -d kibana:7.4.2
  3. docker update kibana --restart=always

docker 常用命令

  1. ###docker 常用命令
  2. docker rm 容器id (容器名称)
  3. docker rmi 镜像id 删除镜像
  4. docker update redis --restart=always
  5. --restart参数=
  6. no
  7. 默认策略,在容器退出时不重启容器
  8. on-failure
  9. 在容器非正常退出时(退出状态非0),才会重启容器
  10. on-failure:3
  11. 在容器非正常退出时重启容器,最多重启3
  12. always
  13. 在容器退出时总是重启容器
  14. #开机自启
  15. unless-stopped
  16. 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
  17. # 一般推荐使用always参数
  18. --restart=always
  1. 语雀 插入其他内容CTRL + /

Es 基本操作

4.1 查询bank 索引下的排序查询 这种查询方式为query DSL

  1. GET bank/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "sort": [
  7. {
  8. "account_number": "asc"
  9. },
  10. {"balance": "desc"}
  11. ]
  12. }

4.2 分页 排序 选择返回指定字段

  1. GET bank/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "sort": [
  7. {
  8. "account_number": {"order": "desc"}
  9. },
  10. {
  11. "balance": {"order": "asc"}
  12. }
  13. ],
  14. "from": 0,
  15. "size": 5,
  16. "_source": ["account_number","balance"]
  17. }

4.3 使用match 进行选定字段查询(match如果查询的不是字符串就是一个精确查询,字符串的话就是一个全文检索,并且会有一个最大匹配得分)

  1. GET bank/_search
  2. {
  3. "query": {
  4. "match": {
  5. "account_number": "995"
  6. }
  7. }
  8. }

4.4 match_phrase 短语匹配

  1. GET bank/_search
  2. {
  3. "query": {
  4. "match_phrase": {
  5. "account_number": "9"
  6. }
  7. }
  8. }
  1. multi_match多字段匹配(只要任意选择的字段 就可以被匹配到)

    1. GET bank/_search
    2. {
    3. "query": {
    4. "multi_match": {
    5. "query": "mill",
    6. "fields": ["address","city"]
    7. }
    8. }
    9. }
  2. bool负荷多种查询 (should 条件可以不满足)

    1. GET bank/_search
    2. {
    3. "query": {
    4. "bool": {
    5. "must": [
    6. {"match": {
    7. "address": "mill"
    8. }},
    9. {"match": {
    10. "gender": "M"
    11. }}
    12. ],
    13. "must_not": [
    14. {"match": {
    15. "age": 38
    16. }}
    17. ],
    18. "should": [
    19. {"match": {
    20. "city": "c"
    21. }}
    22. ]
    23. }
    24. }
    25. }
  3. filter结果过滤 (must,should匹配成功会提升相关性得分,must not会被当成是一个过滤器fix:过滤器不会提升得分)

    1. GET bank/_search
    2. {
    3. "query": {
    4. "bool": {
    5. "filter": [
    6. {"range": {
    7. "age": {
    8. "gte": 20,
    9. "lte": 30
    10. }
    11. }}
    12. ]
    13. }
    14. }
    15. }
  4. term:和must 一样可以做匹配查询 但是他是对非text 字段进行一个匹配

  5. aggregations(执行聚合查询 类似于sql 的GROUP BY 和sql的聚合查询) ```shell GET bank/_search { “query”: { “match_all”: { } }, “aggs”: { “ageAgg”: { “terms”: {
    1. "field": "age",
    2. "size": 100
    }, “aggs”: {
    1. "avgAgg": {
    2. "avg": {
    3. "field": "balance"
    4. }
    5. }
    } } }, “size”: 0 }

按照年龄聚合查询 并且聚合性别

GET bank/_search { “query”: { “match_all”: {} }, “aggs”: { “ageAgg”: { “terms”: { “field”: “age”, “size”: 100 }, “aggs”: { “genderAgg”: { “terms”: { “field”: “gender.keyword”, “size”: 10 }, “aggs”: { “balanceAgg”: { “avg”: { “field”: “balance” } } } } } } } }

  1. <a name="nn8G9"></a>
  2. ### 4.10 创建mapping 映射
  3. ```shell
  4. PUT /my_index
  5. {
  6. "mappings": {
  7. "properties": {
  8. "age":{"type": "integer"},
  9. "name":{"type": "text"},
  10. "email":{"type": "keyword"}
  11. }
  12. }
  13. }

4.11 修改mapping 映射字段

只能去新增字段不能去修改类型 如果需要修改则需要 新创建索引做数据的迁移

  1. PUT /my_index/_mapping
  2. {
  3. "properties": {
  4. "found":{"type": "long"}
  5. }
  6. }

分词器

分词器有多中类型 开源 ki分词器 (fix:要和自己的es 版本相对应才行)
https://github.com/medcl/elasticsearch-analysis-ik/releases

  1. 方式一将下载来的es 分词器放到挂在目录的plugins 文件下即可

    IK 分词器的版本需要跟 Elasticsearch 的版本对应,当前选择的版本为 7.4.2
    下载地址为:Github Release 或访问:镜像地址

  2. 方式二将将下载来的es 分词器放入到dockers内部,es容器的plugins下也行

    1. # 下载分词器
    2. wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.18/elasticsearch-analysis-ik-6.8.18.zip
    3. # 直接使用远程传输也可以 然后使用unzip 命令解压 zip 压缩包

    这里已经在挂载的 plugins 目录安装好了 IK分词器。现在我们进入到 es 容器内部检查是否成功安装 ```shell

    进入 es 容器内部

    docker exec -it elasticsearch /bin/bash

进入 es bin 目录

cd /usr/share/elasticsearch/bin

执行查看命令 显示 ik

elasticsearch-plugin list

退出容器

exit

重启 Elasticsearch

docker restart elasticsearch

  1. 3. 此时IK 分词器
  2. ```shell
  3. POST _analyze
  4. {
  5. "analyzer": "ik_smart",
  6. "text": "我爱中国"
  7. }

image.png

这里对于默认词库中没有的词,不会有词语的组合,所以我们可以通过配置自定义词库或远程词库来实现对词库的扩展所以我们采用nginx 作为服务器进行做ik 分词词库的服务器。

安装 nginx

1.先随意启动一个nginx 只是为了获取里边的配置文件

  1. docker run -p80:80 --name nginx -d nginx:1.10

2.将容器内部的文件 拷贝到当前目录

  1. docker container cp nginx:/etc/nginx .
  2. mkdir -p /mydata/nginx/html
  3. mkdir -p /mydata/nginx/logs
  4. #由于拷贝完成后会在config中存在一个nginx文件夹,所以需要将它的内容移动到conf中
  5. #conf 文件夹下就是原先nginx的配置
  6. mv /mydata/nginx/conf/nginx/* /mydata/nginx/conf/
  7. rm -rf /mydata/nginx/conf/nginx

3.执行如下命令启动容器

  1. docker run -p 80:80 --name nginx \
  2. -v /mydata/nginx/html:/usr/share/nginx/html \
  3. -v /mydata/nginx/logs:/var/log/nginx \
  4. -v /mydata/nginx/conf/:/etc/nginx \
  5. -d nginx:1.10
  6. docker update nginx --restart=always

4.自定义扩展分词库

我们在 nginx 中自定义分词文件,通过配置 es 的 ik 配置文件来远程调用 nginx 中的分词文件来实现自定义扩展词库。 注:默认 nginx 请求的是 数据目录的 html 静态目录

5.给es 自定义词库

  1. # 1. 打开并编辑 ik 插件配置文件
  2. vim /mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml

修改内容如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
  3. <properties>
  4. <comment>IK Analyzer 扩展配置</comment>
  5. <!--用户可以在这里配置自己的扩展字典 -->
  6. <entry key="ext_dict"></entry>
  7. <!--用户可以在这里配置自己的扩展停止词字典-->
  8. <entry key="ext_stopwords"></entry>
  9. <!--用户可以在这里配置远程扩展字典 -->
  10. <!-- <entry key="remote_ext_dict">words_location</entry> -->
  11. <entry key="remote_ext_dict">http://192.168.169.128/es/fenci.txt</entry>
  12. <!--用户可以在这里配置远程扩展停止词字典-->
  13. <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
  14. </properties>

6. 重启es

  1. docker restart elasticsearch

Java操作ES

8.1 导入maven配置

这个client基于9200端口进行与es 通信的 一些其他的客户端可能是9300不过之后会被废弃

  1. <!-- 导入es rest-high-level-client -->
  2. <dependency>
  3. <groupId>org.elasticsearch.client</groupId>
  4. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  5. <version>7.4.2</version>
  6. </dependency>

2. Java 配置

参照官网配置 https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-getting-started-initialization.html

  1. /**
  2. * @author net
  3. * @Create
  4. *
  5. * 1、导入配置
  6. * 2、编写配置,给容器注入一个RestHighLevelClient
  7. * 3、参照API 官网进行开发
  8. */
  9. @Configuration
  10. public class GulimallElasticsearchConfig {
  11. public static final RequestOptions COMMON_OPTIONS;
  12. static {
  13. RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
  14. // builder.addHeader("Authorization", "Bearer " + TOKEN);
  15. // builder.setHttpAsyncResponseConsumerFactory(
  16. // new HttpAsyncResponseConsumerFactory
  17. // .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
  18. COMMON_OPTIONS = builder.build();
  19. }
  20. @Bean
  21. public RestHighLevelClient esRestClient() {
  22. RestClientBuilder builder = null;
  23. builder = RestClient.builder(new HttpHost("192.168.56.10", 9200, "http"));
  24. RestHighLevelClient client = new RestHighLevelClient(builder);
  25. // RestHighLevelClient client = new RestHighLevelClient(
  26. // RestClient.builder(
  27. // new HttpHost("localhost", 9200, "http"),
  28. // new HttpHost("localhost", 9201, "http")));
  29. return client;
  30. }
  31. }