一文速通 Docker 搭建 ElasticSearch 并掌握基本用法

原创
2023/03/03 11:38
阅读数 30

前言

本文可以帮助读者快速掌握 ElasticSearch 的基本用法。

讲解内容分为两个 Part:

  1. Part 1 讲解如何通过 Docker 部署 ElasticSearch 和 ES 的可视化控制台 Kibana
  2. Part 2 讲解 ES 的常用请求和 QueryDSL。

下载

首先下载 elasticsearch 和 kibana 镜像:

docker pull elasticsearch:7.4.2
docker pull kibana:7.4.2 # ES 的可视化工具,对标 navicat,版本一定要和 ES 对上

下载完成后,我们查看已下载的镜像列表,看是否成功:

docker images

 配置

# 以后将 ES 的配置文件路径映射到此目录,可以将 /Users/dongyaoo/dockerMap/ 替换为自定义目录
mkdir -p /Users/dongyaoo/dockerMap/elasticsearch/config
# ES 的数据挂载到此文件夹
mkdir -p /Users/dongyaoo/dockerMap/elasticsearch/data
# ES 的插件挂载到此文件夹
mkdir -p /Users/dongyaoo/dockerMap/elasticsearch/plugins
# 设置 ES 可以被远程的任何机器所访问,把 host 配置写入我们宿主机的配置映射目录
echo "http.host: 0.0.0.0">>/Users/dongyaoo/dockerMap/elasticsearch/config/elasticsearch.yml

注意:ES 的 yml 配置文件中,每条配置中冒号后的空格不能省略,否则报错:

Exception in thread "main" ElasticsearchParseException[malformed, expected settings to start with 'object', instead was [VALUE_STRING]]

启动

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 
-e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx512m" 
-v /Users/dongyaoo/dockerMap/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml 
-v /Users/dongyaoo/dockerMap/elasticsearch/data:/usr/share/elasticsearch/data 
-v /Users/dongyaoo/dockerMap/elasticsearch/plugins:/usr/share/elasticsearch/plugins 
-d elasticsearch:7.4.2

解释

docker run	启动容器
--name elasticsearch	将这个容器命名为 elasticsearch
-p 9200:9200	将容器 9200 端口映射到宿主机的 9200 端口,以后给 ES 发 Rest API 请求走 9200
-p 9300:9300	ES 在分布式集群状态下,它们节点之间的通信端口
-e "discovery.type=single-node"	设置 ES 为单节点模式运行
-e ES_JAVA_OPTS="-Xms128m -Xmx512m"	设置给 ES 分配多少内存,-Xms128m 表示初始内存 128m,-Xmx128m 表示最大内存 512m。生产环境分配几十G。
-v /Users/dongyaoo/dockerMap/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml 映射配置文件
-v /Users/dongyaoo/dockerMap/elasticsearch/data:/usr/share/elasticsearch/data	映射 data
-v /Users/dongyaoo/elasticsearch/plugins:/usr/share/elasticsearch/plugins	映射插件,可以在宿主机装 ES 插件
-d elasticsearch	后台启动 ES,如果指定镜像版本,则为 -d elasticsearch:x.x.x

执行以下命令查看 ES 是否正常启动:

docker ps

kibana 可视化

kibana 有个配置文件 kibana.yml,为了能在宿主机同步修改 kibana 配置,我们让 kibana 容器挂在宿主机上的 kibana.yml。所以,我们先在宿主机搞一个 kibana.yml:

mkdir -p /Users/dongyaoo/dockerMap/kibana/config
vim /Users/dongyaoo/dockerMap/kibana/config/kibana.yml

我们将以下内容粘贴到 kibana.yml 中

server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://12.34.56.78:9200" ] # 12.34.56.78 替换为自己的ip
xpack.monitoring.ui.container.elasticsearch.enabled: true

elasticsearch.hosts 内的 url 为 ES 主机地址,以后访问 kibana 地址,它会把请求转发到 ES。

注意:kibana 不能识别 127.0.0.1 或 localhost,所以一定填完整 ip。可以通过以下命令查询 ip:

# mac
ifconfig | grep "inet"
# windows
ipconfig

启动!

docker run --name kibana -p 5601:5601 
-v /Users/dongyaoo/dockerMap/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml 
-d kibana:7.4.2

解释

-p 5601:5601	将容器 5601 端口映射到宿主机的 5601 端口

常用

访问地址 localhost:5601,打开 Kibana 的 Dev Tools。
可以看到,Kibana 控制台主要由两个部分构成,左侧类似编辑器的面板用来编写提交给 Elasticsearch 的请求。右侧为response 面板,用来展示请求结果的响应。

查看所有索引(9200 为 ES 服务器端口)

http://localhost:9200/_cat/indices

PUT 请求(可以做 INSERT INTO ... VALUES,UPDATE ... SET,但必须带上 id)

localhost:9200/customer/external/1:保存一个数据,指明在哪个索引的哪个类型下保存,带上数据的 id。当多次请求发送的数据相同时,会改变数据的版本,不会保存多条记录。

POST 请求(也可以做新增和修改)

localhost:9200/customer/external:

  • 不带 id 时,可以做新增,即使多次请求发送的数据一样,也会自动生成不同的 id,保存多条记录。
  • 带上 id 时,则会改变数据的 _version,_seq_no,不会产生新的记录。
    • 额外带上 _update,会对比原来的数据,如果不变,则 _version 和 _seq_no 也不变

GET 请求

localhost:9200/customer/external/1

{
    "_index": "customer", // 索引
    "_type": "external", // 类型
    "_id": "1", // 文档
    "_version": 2, // 版本(当多条数据的id一样时会升版本)
    "_seq_no": 1, // 并发控制字段,每次更新就会递增,用来做乐观锁
    "_primary_term": 1,
    "found": true,
    "_source": {
        "name": "ES测试"
    }
}

DELETE 请求

localhost:9200/customer/external/1:删除 id 为 1 的文档

localhost:9200/customer:直接将索引删除

bulk 批量 API

POST customer/external/_bulk

POST customer/external/_bulk
{"index": {"_id": "1"}}
{"name": "张三"}
{"index": {"_id": "2"}}
{"name": "李四"}

语法格式:
{action:{metadata}}\n
{request body  }\n
{action:{metadata}}\n
{request body  }\n

批量操作,当发生某一条执行发生失败时,其他的数据仍然能够接着执行,也就是说彼此之间是独立的。

Query DSL(领域特定语言)

  • 全文检索:GET bank/_search
  • 非文本用 term 查询(和 match 一样,都用来匹配某个属性的值)
  • 文本字段用 match | match_phrase查询
    • match 会对搜索条件进行分词,例如“address”: "mill lane",任何文档包含 "mill" 或 "lane" 的都会搜出
      • "address.keyword":表示精确匹配,任何文档等于 "mill lane" 的才会被搜出来
    • match_phrase 不会对搜索条件分词,任何文档包含 "mill lane" 的才会被搜出来
  • 复合查询用 bool
    • must 必须满足
    • must not 必须不满足
    • should 最好满足
    • 并不是所有的查询都需要产生分数,特别是哪些仅用于 fiter 过滤的文档。为了不计算分数,elasticsearch会自动检查场景并且优化查询的执行。不参与评分更快。

聚合 aggs

语法如下:

"aggs":{ # 聚合
    "aggs_name 这次聚合的名字,方便展示在结果集中":{
        "AGG_TYPE聚合的类型(avg,term,terms)":{}
     }
}

 例子:

复杂子聚合:查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资
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"
              }
            }
          }
        },
        "balanceAgg": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

映射 _mapping

映射是用来定义一个文档(document),以及它所包含的属性(field)是如何存储和索引的。

ElasticSearch7 去掉 type 概念。elasticsearch 是基于Lucene开发的搜索引擎,而 ES 中不同 type 下名称相同的字段最终在 Lucene 中的处理方式是一样的。例如,两个不同 type 下的两个 user_name 字段,在 ES 同一个索引下其实被认为是同一个字段,ES 必须在两个不同的 type 中定义相同的字段映射。否则,不同 type 中的相同字段名称就会在处理中出现冲突的情况,导致 Lucene 处理效率下降。去掉type就是为了提高 ES 处理数据的效率。

创建映射

PUT /my_index
{
  "mappings": {
    "properties": {
      "age": {
        "type": "integer"
      },
      "email": {"type": "keyword"},
      "name": {"type": "text"}
    }
  }
}

映射增加字段

PUT /my_index/_mapping
{
  "properties": {
    "employee-id": {
      "type": "keyword",
      "index": false // index 字段默认为 true,表示需要被 ES 检索
    }
  }
}

查看映射

GET my_index/_mapping

更新映射与数据迁移

 

// 6.0 以后写法
POST _reindex
{
  "source": {
    "index": "bank"
  },
  "dest": {
    "index": "new_bank"
  }
}


// 老版本写法
POST _reindex
{
  "source": {
    "index": "bank",
    "type": "account"
  },
  "dest": {
    "index": "new_bank"
  }
}

分词

POST _analyze
{
  "analyzer": "standard", // 内置英文分词器
  "text": "The 2 Brown-Foxes bone."
}
POST _analyze
{
  "analyzer": "ik_smart", // ik 分词器,中文
  "text": "我是外国人"
}

ES安装插件

如果在宿主机做了插件文件夹映射,那么可以下载插件的 zip,解压到宿主机的插件文件夹

否则,我们进入容器:

docker exec -it elasticsearch /bin/bash
cd bin
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
elasticsearch-plugin list # 查看已安装的插件目录

通过 elasticsearch-plugin 安装的插件的配置文件在 /usr/share/elasticsearch/config 下

例如,我们进入 ik 分词器插件的配置文件夹,修改它的配置文件 IKAnalyzer.cfg.xml,使其加载我们的自定义词典。

vi /usr/share/elasticsearch/config/analysis-ik/IKAnalyzer.cfg.xml

作者:一位不愿留下姓名的BAT全栈程序员

原文链接:https://zhuanlan.zhihu.com/p/610935604

侵删

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部