1、下载镜像文件
docker pull elasticsearch:7.4.2 存储和检索数据 docker pull kibana:7.4.2 可视化检索数据 2 、创建实例 (1)安装ElasticSearch mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data (mkdir创建了目录,如果创建一级目录使用mkdir就可以了,创建多级目录使用mkdir -p才行) 执行上面两行后可见: echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml (http.host: 0.0.0.0使es可以被任何机器访问。echo "..." >> 被写入的位置) 执行上面一行后可见: chmod -R 777 /mydata/elasticsearch/ 使任何组的任何成员对 /mydata/elasticsearch/ 目录下的所有文件都是可读可写可执行。保证权限docker run --name elasticsearch -p 9200:9200 -p 9300:9300 (此处- p作用是端口映射,9200端口用于es的http请求,9300是es分布式集群状态下节点之间的通信端口) -e "discovery.type=single-node" (设置以单节点运行) -e ES_JAVA_OPTS="-Xms64m -Xmx512m" (如果不指定,es一启动会把内存全部占用,虚拟机直接卡死。初始64m,最大512m) -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml (- v参数用于挂载或者说关联。以后修改左面的也就修改了右面的配置) -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.4.2 (- d为后台启动,使用es:7.4.2版本) 以后再外面装好插件重启即可; 特别注意: -e ES_JAVA_OPTS="-Xms64m -Xmx256m" 测试环境下,设置 ES 的初始内存和最大内存,否则导 致过大启动不了 ES
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.4.2
执行上面一串代码后,查看一下:可见启动完成
windows浏览器访问:192.168.23.130:9200 可见下图,可见已完成
docker logs elasticsearch(也可以使用docker logs 容器id。容器id通过docker ps 查看):若上方出错可用此命令查看es日志判断哪里出错,当然我们这里我没有出错。
(2)安装Kibana 注意:操作ES也就是给它请求,postman也行。安装Kibana是让其在web端有可视化界面,且kibana还有其他小的优点。 docker run --name kibana -e ELASTICSEARCH_HOSTS= http://192.168.23.130:9200 -p 5601:5601 -d kibana:7.4.2 http://192.168.56.10:9200 一定改为自己虚拟机的地址 安装且启动后可见如图: windows浏览器访问:192.168.23.130:5601 可见下图,可见已完成。 二.初步检索注意:索引就是数据库。类型就是数据库表。文档就是表字段。其中类型的概念并不重。
这里 Types 的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index 下已经只能包含一个
type,Elasticsearch 7.X 中, Type 的概念已经被删除了。
1._cat(查询系统信息)
查看es的健康状况
查看主节点信息:
查看所有索引:
查看所有节点:
2、索引一个文档(增加)
来自于别处: 保存一个数据,保存在哪个索引的哪个类型下(即mysql的哪个数据库的哪张表下),指定用哪个唯一标识。 PUT customer/external/1: 在 customer 索引下的 external 类型下保存 1 号数据为PUT customer/external/1 { "name": "John Doe" }PUT 和 POST 都可以, POST 新增。如果不指定 id ,会自动生成 id 。指定 id 就会修改这个数据,并新增版本号 PUT 可以新增可以修改。 PUT 必须指定 id ;由于 PUT 需要指定 id ,我们一般都用来做修改 操作,不指定 id 会报错。 自己总结: 请求方式为:PUT URI:192.168.23.130:9200/ customer/external/1 body内容JSON格式:
{ "name": "John Doe" }注意:PUT请求方式同一请求发送多次为更新操作 执行后返回的数据:
请求方式为:POST URI:192.168.23.130:9200/ customer/external/ 192.168.23.130:9200/ customer/external/1 (1表示其id,其他数字也可以) body内容JSON格式:{
"_index": "customer", // 数据库
"_type": "external", // 数据库表
"_id": "1", // 唯一标识
"_version": 1, // 执行一次就加1
"result": "created", // 第二次执行为updated
"_shards": { // 分片
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
{ "name": "John Doe" }
(1)若URI:192.168.23.130:9200/customer/external/
注意:上方URI执行,POST 请求方式同一请求发送多次依旧是添加操作,且每一次执行都会自动创造一个唯一id。
执行后返回的数据:(2)若URI:192.168.23.130:9200/ customer/external/1 (1表示其id,其他数字也可以) 注意:此时多次执行为更新{
"_index": "customer",
"_type": "external",
"_id": "zRmrZn0B_qCPj000W49i", // 自动生成的唯一id
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
若带id,PUT和POST请求为一次新增,多次修改。POST可以不带id,不带id多次都为新增 3.查询文档(查找) GET customer/external/1 自己总结: 请求方式为:GET URI:192.168.23.130:9200/ customer/external/1 查询数据库customer下的数据库表external下的1号数据{
"_index": "customer",
"_type": "external",
"_id": "2",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
结果: { "_index": "customer", //在哪个索引 "_type": "external", //在哪个类型 "_id": "1", //记录 id "_version": 2, //版本号 "_seq_no": 1, //并发控制字段,每次更新就会+1,用来做乐观锁 "_primary_term": 1, //同上,主分片重新分配,如重启,就会变化 "found": true, // true为找到了数据 "_source": { //真正的内容 "name": "John Doe" } }乐观锁字段的测试: 更新携带 ?if_seq_no=0&if_primary_term=1 执行前: 执行后: 返回结果:
4.更新文档(修改){
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 3,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 4,
"_primary_term": 1
}
POST customer/external/1/_update { "doc":{ "name": "John Doew" } } 或者 POST customer/external/1 { "name": "John Doe2" } 或者 PUT customer/external/1 { "name": "John Doe" } 1.不同: POST 操作会对比源文档数据,如果相同不会有什么操作,文档 version 不增加 PUT 操作总会将数据重新保存并增加 version 版本; 带_update 对比元数据如果一样就不进行任何操作。 看场景; 对于大并发更新,不带 update ; 对于大并发查询偶尔更新,带 update ;对比更新,重新计算分配规则。 2.更新同时增加属性 POST customer/external/1/_update { "doc": { "name": "Jane Doe", "age": 20 } } PUT 和 POST 不带 _update 也可以5 、删除文档 & 索引 ES中类型(数据库表)的概念不深刻,没有删除这个的方法。
DELETE customer/external/1 DELETE customer6. bulk 批量 API
POST /customer/external/_bulk {"index":{"_id":"1"}} {"name": "John Doe" } {"index":{"_id":"2"}} {"name": "Jane Doe" } 语法格式: { action: { metadata }}n { request body }n { action: { metadata }}n { request body }n 复杂实例: POST /_bulk { "delete": { "_index": "website", "_type": "blog", "_id": "123" }} { "create": { "_index": "website", "_type": "blog", "_id": "123" }} { "title": "My first blog post" } { "index": { "_index": "website", "_type": "blog" }} { "title": "My second blog post" } { "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} } { "doc" : {"title" : "My updated blog post"} }bulk API 以此按顺序执行所有的 action (动作)。如果一个单个的动作因任何原因而失败, 它将继续处理它后面剩余的动作。当 bulk API 返回时,它将提供每个动作的状态(与发送 的顺序相同),所以您可以检查是否一个指定的动作是不是失败了。 (1)批量新增
POST /customer/external/_bulk
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
运行结果见下图:可见批量增加了两个数据。
注意:新增的两个数据是独立的。即一个运行失败另一个不一定运行失败
(2)
复杂实例
POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title":"My first blog post" }
{ "index": { "_index": "website", "_type": "blog" }}
{ "title":"My second blog post" }
{ "update":
{ "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3}
}
{ "doc" :
{"title" : "My updated blog post"}
}
运行结果见下图:



