The Elastic Stack,包括Elasticsearch、Kibana、Beats和Logstash(也称为ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。Elaticsearch,简称为ES,ES是一个开源的高扩展的分布式全文搜索引擎,是整个ElasticStack技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
9200端口:web端
9300:端口:客户端
Elasticsearch是面向文档型数据库,一条数据在数据库中就是一个文档。
特点:倒排索引:把关键词和文章ID形成关联
name -> 1001, 1002
正排索引:把ID和文章形成关联,根据主键ID去查询整个数据,如果要查询关键词,则是模糊查询,此时性能会差很多。
1001 -> name 1002 -> age
文档:elasticsearch是面向文档的,那么就意味着索引和搜索数据的最小单位是文档, elasticsearch中 ,文档有几个重要属性:
自我包含,一篇文档同时包含字段和对应的值,也就是同时包含key:value可以是层次型的, -一个文档中包含自文档,复杂的逻辑实体就是这么来的{就是一个json对象}灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用,在elasticsearch中,对于字段是非常灵活的,有时候,我们可以忽略该字段,或者动态的添加一个新的字段。 索引操作
PUT:创建索引
GET:获取索引
DELETe:删除索引
HEAD:获取一些header信息
数据操作查看所有索引信息:
GET: http://ip:9200/_cat/indices?v
POST:创建文档
# 此处1001是指定id http://127.0.0.1:9200/shopping/_doc/1001
GET:查询文档数据
http://127.0.0.1:9200/shopping/_doc/1001
查询索引下的所有文档数据
GET: http://127.0.0.1:9200/shopping/_search
全局修改
PUT: http://127.0.0.1:9200/shopping/_doc/1001
局部修改
POST: http://127.0.0.1:9200/shopping/_update/1001
payload
doc: {
"title": "Apple"
}
条件查询
# 根据请求路径
GET: http://127.0.0.1:9200/shopping/_search?q=category:iPhone
# 根据请求体
GET: http://127.0.0.1:9200/shopping/_search
"query": {
"match": {
"category": "Apple"
}
"from": 0 # 从哪一页开始查询
"size": 2 # 获取文档个数
"_source": ["title"] # 限制获取的字段信息
}
多条件查询
"query": {
"bool": { # 条件查询
"must": [ # 所有条件必须满足
"match": {
"category": "Apple"
}
"from": 0 # 从哪一页开始查询
"size": 2 # 获取文档个数
"_source": ["title"] # 限制获取的字段信息
]
}
}
"query": {
"bool": { # 条件查询
"should": [ # 满足一个或多个条件即可
"match": {
"category": "Apple"
}
]
}
}
"query": {
"bool": { # 条件查询
"should": [ # 满足一个或多个条件即可
"match": {
"category": "Apple"
}
],
"filter": { # 过滤器
"range": { # 范围查询
"price": {
"gt": 5000 # gt表示大于
}
}
}
}
}
match查询中默认把要查询的内容进行分词,进行的是局部匹配,此时可以换成match_phrase,是完全匹配。
对查询结果中的哪个字段进行高亮显示
"query": {
"bool": { # 条件查询
"should": [ # 满足一个或多个条件即可
"match": {
"category": "Apple"
}
]
}
},
"highlight": {
"fields": {
"category": {}
}
}
创建映射关系
PUT: http:127.0.0.1:9200/user/_mapping
"properties": {
"name": { # name是一个字段的名称
"type": "text" # 支持全文检索
"index": true # 是否可以被索引
},
"age": {
"type": "keyword" # 单个匹配
"index": true
}
}
高级部分
分布式集群
单节点集群
主分片:把数据分成多少片,类似mysql中的分表
副本:每个分片有多少个副本
// 此时一个主分片有三个副本
{
"settings": {
"number_of_shards": 3, // 主分片个数
"number_of_replicas": 1 // 副本个数
}
}
使用Elasticsearch-head显示yellow:表示当前所有主分片都正常运行,但是副本分片没有全部处于正常状态。
注意此处的概念,不是说有主分片就是绝对主节点,只是对于该分片而言该节点是主节点,每个节点相对于每个节点都是一个主节点。
故障转移
当集群中只有一个节点在运行时,意味着会有一个单点故障问题一-一没有冗余。幸运的是,我们只需再启动一个节点即可防止数据丢失。当你在同一台机器上启动了第二个节点时,只要它和第一个节点有同样的cluster.name配置,它就会自动发现集群并加入到其中。但是在不同机器.上启动节点的时候,为了加入到同一集群,你需要配置一个可连接到的单播主机列表。之所以配置为使用单播发现,以防止节点无意中加入集群。只有在同一台机器上运行的节点才会自动组成集群。
路由计算
当数据进行存储的时候的规则:路由计算(哈希算法:hash(id) % 主分片数量)。
这是传统的哈希算法,但是当有一台退出集群的时候,所有的映射都会失效了,如果是持久化数据要做数据迁移,如果是分布式缓存,则会产生缓存失效,因此此时可以使用哈希一致性算法。
分片控制
在存储的时候进行路由计算之后会进行副本分片,此时每个节点都会有一个副本,此时用户可以访问任何一个节点的数据,这个节点称为协调节点
数据写流程
客户端请求集群节点(协调节点)协调节点将数据转发到指定的节点节点把数据保存节点将数据发送给副本副本保存后进行反馈主分片进行返回客户端获取返回
客户端收到成功响应,文档变更已经在主分片和所有副本分片执行完成,变更是安全的。
数据读流程
客户端发送查询请求到协调节点
协调节点计算数据所在的分片以及全部的副本位置
先进行轮询操作,查找到最小压力的节点
将请求转发给具体的节点
节点返回查询结果,将结果反馈给客户端
更新流程
更新一个文档
客户端向协调节点发起请求协调节点将请求转发到主分片所在的节点不断的更新(自旋锁)最后同步副本返回客户端 SpringBoot集成
SpringData是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。Spring Data可以极大的简化JPA (Elasticsearch…) 的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。
配置类
@Configuration
@Data
@ConfigurationProperties(prefix = "elasticsearch")
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
private String host;
private Integer port;
@Override
publid RestHighLvelClient elasticsearchClient() {
RestClientBuilder builder = RestClient.builder(new HttpHost(host, port));
RestHighLevelClient rest = new RestHighLevelClient(builder);
return rest;
}
}
对于要进行mysql的数据的mapper文件
@Repository public interface ClassDao extends ElasticsearchRepository{ }
实例类映射数据类(将mysql数据和elk数据进行关联)
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
// 此处可以看出,一个索引就是一个表,而es8.0+淡化了type的概念,因此一个indices可以看做是一个数据库
@document(indexName="索引名称", shards=切片数量, replicas=副本数量)
public class Class {
// 以下为数据中的数据
@Id
private int id; // id必须分配,这里的id是全局唯一的标识,等同于es中的_id
@Field(type=FieldType.Text)
private String title; // 可以被分开查询
@Field(type=FieldType.Keyword)
private String category; // 不能被分开查询
@Field(type=FieldType.Double)
private Double private; //
@Field(type=FieldType.Keyword, index=false)
private String images; // 不能被查询
}
进行es的配置
@Autowired private ElasticsearchRestTemplate elasticsearchRestTemplate;
对es中的数据进行增删改查
// 增
Class class = new Class();
class.set("");
classDao.save(class);
// 根据id查
Class class = classDao.findById("").get();
// 查询所有
Iterable class = classDao.findAll();
// 删
Class class = new Class();
classDao.delete(class);
分页查询
// 设置查询分页
PageRequest pg = PageRequest.of("当前页", "每页显示多少条", "排序");
// 分页查询
Page pgs = classDao.findAll(pg);
for (Class c: pgs.getContent()) {
//
}
elasticsearch在docker的安装
一定一定要首先设置max_map_count,默认是65535,改成
sysctl -w vm。max map_count=262144
否则在后面es的运行中es会经常出故障甚至无法连接端口
docker拉取镜像
docker pull elasticsearch:7.9.2
运行容器
docker run -di --name=elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:7.9.2



