Elasticsearch安装及快速入门
Docker安装Elasticsearch
1.拉起镜像并创建对应的网络连接
拉起镜像
docker pull elasticsearch:7.16.2
创建网络连接,用来与其他容器服务进行通信,比如 Kibana
docker network create -d bridge elasticsearch_network
2.创建容器
配置挂载数据文件夹
# 创建配置文件目录
mkdir -p /data01/elasticsearch_data/config
# 创建插件文件目录
mkdir -p /data01/elasticsearch_data/plugins
# 创建数据目录
mkdir -p /data01/elasticsearch_data/data
# 将/mydata/elasticsearch/文件夹中文件都可读可写
chmod -R 775 /data01/elasticsearch_data
# 创建elasticsearch.yml文件
vi /data01/elasticsearch_data/config/elasticsearch.yml
# 添加到elasticsearch.yml文件下:
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
xpack.security.enabled: false # 关闭ElasticSearch 安全功能(正式生产环境需要打开该功能)
Elasticsearch目录介绍:
- bin:脚本目录,包括:启动、停止等可执行脚本
- config:配置文件目录
- data:索引目录,存放索引文件的地方
- logs:日志目录
- modules:模块目录,包括了es的功能模块
- plugins :插件目录,es支持插件机制
Elasticsearch-elasticsearch.yml常用配置:
cluster.name:
配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。
node.name:
节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理
一个或多个节点组成一个cluster集群,集群是一个逻辑的概念,节点是物理概念,后边章节会详细介绍。
path.conf:
设置配置文件的存储路径,tar或zip包安装默认在es根目录下的config文件夹,rpm安装默认在/etc/ elasticsearch
path.data:
设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开。
path.logs:
设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.plugins:
设置插件的存放路径,默认是es根目录下的plugins文件夹
bootstrap.memory_lock: true
设置为true可以锁住ES使用的内存,避免内存与swap分区交换数据。
network.host:
设置绑定主机的ip地址,设置为0.0.0.0表示绑定任何ip,允许外网访问,生产环境建议设置为具体的ip。
http.port: 9200
设置对外服务的http端口,默认为9200。
transport.tcp.port: 9300 集群结点之间通信端口
node.master:
指定该节点是否有资格被选举成为master结点,默认是true,如果原来的master宕机会重新选举新的master。
node.data:
指定该节点是否存储索引数据,默认为true。
discovery.zen.ping.unicast.hosts: ["host1:port", "host2:port", "..."]
设置集群中master节点的初始列表。
discovery.zen.ping.timeout: 3s
设置ES自动发现节点连接超时的时间,默认为3秒,如果网络延迟高可设置大些。
discovery.zen.minimum_master_nodes:
主结点数量的最少值 ,此值的公式为:(master_eligible_nodes / 2) + 1 ,比如:有3个符合要求的主结点,那么这里要设置为2。
node.max_local_storage_nodes:
单机允许的最大存储结点数,通常单机启动一个结点建议设置为1,开发环境如果单机启动多个节点可设置大于1。
运行容器
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms1g -Xmx1g" \
-v /data01/elasticsearch_data/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /data01/elasticsearch_data/plugins:/usr/share/elasticsearch/plugins \
--network elasticsearch_network \
-d elasticsearch:7.16.2
-e "discovery.type=single-node"
设置为单节点特别注意:
-e ES_JAVA_OPTS="-Xms1g -Xmx1g"
测试环境下,设置ES的初始内存和最大内存,否则导致过大启动不了ES
-v /data01/elasticsearch_data/plugins/:/usr/share/elasticsearch/plugins/
配置这个就不用进入容器操作了 直接把ik分词器解压到这个目录
这样es就启动好了。我们可以去检查es是否安装完成,可以输入命令:curl http://localhost:9200
设置 Elasticsearch 随Docker启动(可选):docker update elasticsearch --restart=always
Docker安装可视化Kibana
1.拉起镜像并创建对应的网络连接
拉起镜像
docker pull kibana:7.16.2
2.创建容器
运行容器
docker run -d --name kibana \
--network elasticsearch_network \
-e "I18N_LOCALE=zh-CN" \
-e ELASTICSEARCH_HOSTS=http://192.168.31.101:9200 \
-p 5601:5601 \
kibana:7.16.2
-e ELASTICSEARCH_HOSTS=``http://192.168.163.131:9200
: 这里要设置成自己的虚拟机IP地址
-e "I18N_LOCALE=zh-CN"
:这是设置中文
访问 http://localhost:5601 会进入 Kibana 控制台。
Elasticsearch快速入门
简单的集群管理
1.快速检查集群的健康状况
测试一下get方式查询集群状态
GET /_cluster/health
返回结果:
{
"cluster_name" : "docker-cluster-elasticsearch",
"status" : "yellow",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 10,
"active_shards" : 10,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 1,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 90.9090909090909
}
集群的健康情况(status):green、yellow、red?
- green:每个索引的primary shard和replica shard都是active状态的
- yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
- red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了
es也提供了一套api,叫做cat api,可以查看es中各种各样的数据
GET /_cat/health?v
2.快速查看集群中有哪些索引
GET /_cat/indices?v
文档(document)的数据格式
- 应用系统的数据结构都是面向对象的,具有复杂的数据结构
- 对象存储到数据库,需要将关联的复杂对象属性插到另一张表,查询时再拼接起来。
- es面向文档,文档中存储的数据结构,与对象一致。所以一个对象可以直接存成一个文档。
- es的document用json数据格式来表达。
文档 document CRUD操作
1.新建图书索引
首先建立图书索引 book
语法:PUT /index
PUT /book
2.新增图书 : 新增文档
语法:PUT /index/type/id
PUT /book/_doc/1
{
"name": "Bootstrap开发",
"description": "Bootstrap是由Twitter推出的一个前台页面开发css框架,是一个非常流行的开发框架,此框架集成了多种页面效果。此开发框架包含了大量的CSS、JS程序代码,可以帮助开发者(尤其是不擅长css页面开发的程序人员)轻松的实现一个css,不受浏览器限制的精美界面css效果。",
"studymodel": "201002",
"price":38.6,
"timestamp":"2021-12-28 16:11:35",
"pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags": [ "bootstrap", "dev"]
}
PUT /book/_doc/2
{
"name": "java编程思想",
"description": "java语言是世界第一编程语言,在软件开发领域使用人数最多。",
"studymodel": "201001",
"price":68.6,
"timestamp":"2021-12-28 16:11:35",
"pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags": [ "java", "dev"]
}
PUT /book/_doc/3
{
"name": "spring开发基础",
"description": "spring 在java领域非常流行,java程序员都在用。",
"studymodel": "201001",
"price":88.6,
"timestamp":"2021-12-28 16:11:35",
"pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags": [ "spring", "java"]
}
3.查询图书: 检索文档
语法:GET /index/type/id
查看图书:
GET /book/_doc/1
就可看到json形式的文档。
4.修改图书:替换操作
PUT /book/_doc/1
{
"name": "Bootstrap开发教程1",
"description": "Bootstrap是由Twitter推出的一个前台页面开发css框架,是一个非常流行的开发框架,此框架集成了多种页面效果。此开发框架包含了大量的CSS、JS程序代码,可以帮助开发者(尤其是不擅长css页面开发的程序人员)轻松的实现一个css,不受浏览器限制的精美界面css效果。",
"studymodel": "201002",
"price":38.6,
"timestamp":"2021-12-28 16:11:35",
"pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags": [ "bootstrap", "开发"]
}
替换操作是整体覆盖,要带上所有信息。
5.修改图书:更新文档
语法:POST /{index}/_update/{id}
POST /book/_update/1/
{
"doc": {
"name":"update_name"
}
}
-----返回结果-----
{
"_index" : "book",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 11,
"_primary_term" : 2
}
6.删除图书:删除文档
语法:DELETE /{index}/type/{id}
如删除id=1的book:DELETE /book/_doc/1
文档document入门
默认自带字段解析
GET /book/_doc/2
{
"_index" : "book",
"_type" : "_doc",
"_id" : "2",
"_version" : 1,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "java编程思想",
"description" : "java语言是世界第一编程语言,在软件开发领域使用人数最多。",
"studymodel" : "201001",
"price" : 68.6,
"timestamp" : "2021-09-17 16:11:35",
"pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags" : [
"java",
"dev"
]
}
}
_index
- 含义:此文档属于哪个索引
- 原则:类似数据放在一个索引中。数据库中表的定义规则。如图书信息放在book索引中,员工信息放在employee索引中。各个索引存储和搜索时互不影响。
- 定义规则:英文小写。尽量不要使用特殊字符。order user
_type
- 含义:类别。book java node
- 注意:以后的es9将彻底删除此字段,所以当前版本在不断弱化type。不需要关注。见到type都为_doc。
_id
含义:文档的唯一标识。就像表的id主键。结合索引可以标识和定义一个文档。
生成:手动(put /index/_doc/id)、自动
_source
含义:插入数据时的所有字段和值。在get获取数据时,在_source字段中原样返回。
定制返回字段
就像sql不要select *,而要select name,price from book …一样。
包含:GET /book/_doc/2?_source_includes=name,price
排除:GET /book/_doc/2?_source_excludes=name,price
_version
含义:版本号,不断上升
生成文档id
手动生成id
场景:数据从其他系统导入时,本身有唯一主键。如数据库中的图书、员工信息等。
用法:put /index/_doc/id
PUT /test_index/_doc/1
{
"test_field": "test"
}
自动生成id
用法:POST /index/_doc
POST /test_index/_doc
{
"test_field": "test1"
}
自动id特点:长度为20个字符,URL安全,base64编码,GUID,分布式生成不冲突
文档的替换与删除
1.全量替换
执行n次,返回结果中版本号(_version)就会n+1。此过程为全量替换。
2.强制创建
为防止覆盖原有数据,我们在新增时,设置为强制创建,不会覆盖原有文档。
3.删除(lazy delete)
实质:旧文档的内容不会立即删除,只是标记为deleted。适当的时机,集群会将这些文档删除。
4.局部替换(partial update)
使用 PUT /index/type/id
为文档全量替换,需要将文档所有数据提交。
partial update局部替换则只修改变动字段。
POST /book/_update/1/
{
"doc": {
"name":"update_name"
}
}
优点:
- 大大减少网络传输次数和流量,提升性能
- 减少并发冲突发生的概率。