Elasticsearch
是一个分布式的开源搜索和分析引擎, 适用于所有类型的数据,包括文本、数字、地理空间、结构化和啡结构化数据。Elasticsearch
在Apache Lucene
的基础上开发而成,由Elasticsearch N.V.
(即现在的Elastic
)于2010年首次发布。Elasticsearch
以其简单的REST风格API、分布式特性、速度和可扩展性而闻名,是Elastic Stack
的核心组件: Elastic Stac
k是适用于数据采集、充实、存储、分析和可视化的一组开源工具。人们通常将Elastic Stack
称为ELK Stack
(代指Elasticsearch
、Logstash
和Kibana
),目前Elastic Stack
包括一系列丰富的轻星型数据采集代理, 这些代理统称为Beats
,可用来向Elasticsearch
发送数据。
Elasticsearch
在速度和可扩展性方面表现出色,能够索引多种类型的内容,意味着可以用于多种用例:
原始数据会从多个来源(包括日志、系统指标和网络应用程序)输入到 Elasticsearch
中。_数据采集_指在Elasticsearch
中进行_索引_之前解析、标准化并充实这些原始数据的过程。这些数据在 Elasticsearch
中索引完成之后,用户便可针对他们的数据运行复杂的查询,并使用聚合来检索自身数据的复杂汇总。在 Kibana
中,用户可以基于自己的数据创建强大的可视化,分享仪表板,并对 Elastic Stack
进行管理。
Elasticsearch
索引_指相互关联的文档集合。Elasticsearch
会以 JSON
文档的形式存储数据。每个文档都会在一组_键(字段或属性的名称)和它们对应的值(字符串、数字、布尔值、日期、_数值_组、地理位置或其他类型的数据)之间建立联系。
Elasticsearch
使用的是一种名为_倒排索引_的数据结构,这一结构的设计可以允许十分快速地进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。
在索引过程中,Elasticsearch
会存储文档并构建倒排索引,这样用户便可以近实时地对文档数据进行搜索。索引过程是在索引 API 中启动的,通过此 API 您既可向特定索引中添加 JSON 文档,也可更改特定索引中的 JSON 文档。
动词: 相当于 MySQL 中的 insert
名词: 相当于 MySQL 中的 Database
在 index (索引) 中,可以定义一个或多个类型,类似于 MySQL 中的 Table ,每一种类型的数据放在一起
把一条数据存在 ES 的某个索引的某个类型下,相当于 MySQL 的某个数据库的某张表下
保存在某个 索引(数据库)下, 某种 类型(表) 的一个 Document 文档(一条数据), 文档是 JSON格式的,Document 就像是 MySQL 中的某个 Table 里面的内容。
docker pull elasticsearch:7.4.2
docker pull kibana:7.4.2
先在本机中创建一个自己的目录 , 如:/mydata/elasticsearch
, 然后再目录底下创建三个文件夹 data
、 config
和plugins
,为后面创建elasticsearch实例时,可以做一个文件映射,便于我们对 es 实例进行修改。
同时,在 config
文件夹里,新建 elasticsearch.yml
配置文件,并配置 es 可以被远程的任何机器进行访问
mkdir -p /mydata/elasticsearch/data
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/plugins
echo "http.host:0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
启动 elasticsearch
实例
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx256m" \
-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
-e "discovery.type=single-node"
: 设置 es 为单节点运行
-e ES_JAVA_OPTS="-Xms64m -Xmx256m"
: 设置 es 的最小内存使用 64M ,最大内存使用为 256 M
启动成功后,访问 http://主机IP:9200
,能看到如下信息,即为创建成功
注: 如果启动失败,可以通过命令 docker logs elasticsearch
查看启动日志,可能出现的错误:
1、没有权限访问。因为我们启动的命令挂载到了外面, 所以可能存在无法访问的写入的权限
解决方案: 使用命令 chmod -R 777 /mydata/elasticsearch
给任何用户任何组所有权限,重启es实例即可。
kibana只需要创建实例,关联我们刚刚的es即可
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://主机IP:9200 \
-p 5601:5601 -d kibana:7.4.2
上面的命令是根据官方文档查看而来的,不过这条命令在虚拟机中好像无法启动(我本地 [vmware 15.6 + centos7] 的环境下,一直无法启动成功,连接失败),而在阿里云ESC服务器上,可以成功启动,遇到上诉的情况,可以通过下面这条命令查看 es 实际暴露的 ip,把上面的主机 IP 修改为对应的 ip 即可
//007e为elasticsearch的id
docker inspect 007e 或者 docker inspect elasticsearch
则,kibana 创建的示例的命令为
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://172.17.0.3:9200 \
-p 5601:5601 -d kibana:7.4.2
由于我们刚刚在执行前一个命令的时候,已经创建了一个名为 kibana 的实例,所以需要先删除后,在执行上一步的命令
// 查看所有运行中的实例
docker ps
// 查看所有的实例
docker ps -a
// 删除 kibana 的实例
docker rm kibana
访问 http://主机ip:5601
,看到如下页面即为创建成功
可使用下面的两个命令,使得我们主机重启后,实例也会自动启动
docker update --restart=always elasticsearch
docker update --restart=always kibana
GET http://主机ip:9200/_cat/nodes
GET http://主机ip:9200/_cat/health
GET http://主机ip:9200/_cat/master
GET
:http://主机ip:9200/_cat/indices
MySQL:保存一条数据到表中
保存一个数据,保存在哪个索引的哪个类型下, 可以指定唯一标识
MySQL: 保存在哪个数据库的哪张表下
新增更新二合一,第一次发送为新增,后面的则为更新。不指定id会报错,一般用做于修改
PUT
/customer/external/1
{
"name": "John Doe"
}
新增修改二合一,不带ID或者带ID但是之前没有数据为新增,带ID且之前有数据,为修改
PUT
/customer/external/
{
"name": "John Doe"
}
查询 哪个索引 下的 哪个类型 下的 哪条数据
MySQL: 查询哪个数据库下的哪张表的哪条数据
GET
/customer/external/1
_seq_no:并发控制字段,每次更新就会 +1 ,可以用来做乐观锁
_primary_term:可用于做乐观锁,主分片重新分配,如重启,就会变化
乐观锁使用:
更新前,先查询出当前的数据,可以获取当前 _seq_no
以及当前 _primary_term
更新的时候,带上?if_seq_no={当前 _seq_no }&if_primary_term={当前 _primary_term}
POST
/customer/external/1/_update
{
# doc 的内容为文档的最新值
"doc": {
"name": "John Doew"
}
}
POST 带 _update 更新, 会对比原数据,如果更新的数据与原来一致,则
_version
、_seq_no
不会变化, 且result
的值为noop
,意思为没有做任何操作,且可以给原有的文档中,新增一个属性{
# 带 _update doc不可省略, doc 的内容为文档的最新值
"doc": {
"name": "John Doew",
"age": 20
}
}如上的请求也是可以成功的
POST
/customer/external/1
{
"name": "John Doew"
}
PUT
/customer/external/1
{
"name": "John Doew"
}
以上两种方式的更新,永远为更新操作,不会对比原来的操作,每次请求 _version
、 _seq_no
都在不断叠加,且同 带 _updte
的 POST 请求一样,可以为原有文档新增上新的属性
发送 DELETE
请求, 需要指定到具体的文档、索引
DELETE
/customer/external/1
DELETE
/customer
在 ElasticSearch 中, 不提供删除类型的方法
必须发送 POST
请求,在 PostMan 中无法模拟请求,这里需要用到 kibana
POST
/customer/external/_bulk
在 customer
索引下的 external
类型中批量执行
# 一个大括号代表一个操作,两行为一个动作
{"index":{"_id": "1"}} # 索引一个文档,文档的id为1
{"name": "John Doe"} # 文档的内容
{"index":{"_id": "2"}}
{"name": "John Doe"}
took
:执行所花费的时间 errors
: 是否有错误
items
:独立统计每条命令的执行结果,如果中间有某条命令执行失败,后面的命令也不会受到影响,且命令执行失败的时候,不会跟MySQL一样,回滚
ElasticSearch 介绍、Docker安装以及基本检索第三篇
原文:https://www.cnblogs.com/lovelywcc/p/14137307.html