案例简介
本案例是把日志数据保存到Elasticsearch的索引中,并通过Kibana图形化界面的开发工具给查询出来添加的日志数据,完成从0到1的简单使用
ElasticSearch职责用法简介
ElasticSearch用在哪
ElasticSearch在我这个案例中,不是用来缓解增删改查这4个操作的压力的(有些项目可能用来缓解查询的速度,压力,我这个项目没用到),是专门用来记录日志的,所以这就不像Redis,RabbitMQ一样,好理解,因为Redis、RabbitMQ是专门用来缓解业务操作压力的。
ElasticSearch常用在日志管理中,原先项目的日志管理可能用的logback,保存到一个日志文件中,有问题了就打开看看,但项目的并发高了,就意味着日志就多,日志文件就大,几百兆的日志文件打开都不好打开,就算打开,也不好定位问题,就算是用MySQL表,数据量大了也不好处理,所以就用ElasticSearch专门存日志数据,管理日志。
ElasticSearch的一些简单概念
ElasticSearch可以像MySQL那样存储数据,那这里面的概念就需要捋一下,MySQL存的数据在数据库、表中,ElasticSearch对应的就是索引、文档,只不过ElasticSearch7.X以及以后的版本,文档不能再自定义,只有默认的_doc,所以能自己命名的只有索引(对于一个新的工具,里面有一些新的概念,肯定得学,这没办法)
ElasticSearch的查询语句格式和返回的数据格式都是JSON,所以这就增加了学习的成本,但不用全部都会,只需要知道怎么把springboot项目的日志保存到ElasticSearch中,然后在图形化界面程序Kibana中去查询到刚保存在ElasticSearch的日志就可以了
ElasticSearch在Kibana中怎么用
ElasticSearch的命令有
GET(查数据)、POST(创建和修改)、PUT(更新和创建)、DELETE(删除)
这4类之分,这4个命令关键字在Kibana的开发工具中使用的话必须大写
创建
PUT /students
{
"mappings": {
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" },
"phone": { "type": "keyword" }
}
}
}
PUT /students这个命令就是创建名为students的索引(数据都存这里)
mappings是定义索引的字段和数据类型
properties是包含索引中所有字段的定义
剩下的就是三个字段,以及三个字段的类型,keyword是表示精确匹配和聚合,也就是说,往里面添加数据就按照这三个定义好的字段以及类型添加就可以了
添加
POST /students/_doc
{
"name": "张三",
"age": 18,
"phone": "12345678910"
}
POST /students/_doc就是往刚才创建好的索引里面添加数据(7.0以后的版本都是默认_doc,不能自定义,students是索引名字,对应mysql的数据库,_doc是文档名字,对应mysql的表),剩下就是数据了
查询
GET /students/_search
{
"query" : { "match_all" : {}}
}
GET /students/_search是查询命令,
_search是查询的关键字,意思是执行搜索操作
query是指定查询条件
match_all是基本搜索,就是查询所有
修改
POST /students/_update/5QexW5IBczl1l0mGGalG
{
"doc": {
"age": 20
}
}
POST /students/_update/5QexW5IBczl1l0mGGalG是根据id进行修改
doc是要更新的字段和新值,里面就是具体的字段值
删除
DELETE /students/_doc/5QexW5IBczl1l0mGGalG
SpringBoot和ElasticSearch结合简单使用
pom.xml文件坐标
<!-- Spring Data Elasticsearch -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- Elasticsearch Client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.12.1</version>
</dependency>
配置文件
# ElasticSearch配置
spring.elasticsearch.rest.uris=http://127.0.0.1:9200
接口
往ElasticSearch里面添加数据的接口(对,就这个简单)
ElasticsearchRepository<Log, Long>,Log是日志文件对象,Long是日志主键类型
@Component
public interface LogElasticSearch extends ElasticsearchRepository<Log, Long> {
}
Log日志类
@Document(indexName = "logbill") //logbill为索引名字,全部小写,不能大写
@Field(type = FieldType.Text) //指定字段的类型,不写的话就是自动识别类型
@Data
@Entity
@Document(indexName = "logbill")//索引名字,全部小写
@Table(name = "log")
public class Log implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY,generator = "JDBC")
private Long id;
@Column
@Field(type = FieldType.Text)
private String ipv4;
@Column
@Field
private String ipv6;
@Column
@Field
private String controller;
@Column
@Field
private String method;
@Column
@Field
private String url;
@Column
@Field
private String name;
/**
* 调用时间
*/
@Column
@Field(type = FieldType.Date)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date time;
/**
* 逻辑删除
*/
@Column
@Field(type = FieldType.Integer)
private Integer deleted;
public Log() {
}
public Log(String ipv4, String ipv6, String controller, String method, String url, String name, Date time, Integer deleted) {
this.ipv4 = ipv4;
this.ipv6 = ipv6;
this.controller = controller;
this.method = method;
this.url = url;
this.name = name;
this.time = time;
this.deleted = deleted;
}
}
调用
在需要往ElasticSearch里面添加数据的地方,注入刚才那个接口,然后再调用save方法,这个data就是Log类型的,就可以了
@Autowired
private LogElasticSearch logElasticsearch;
logElasticsearch.save(data);
最后再查询一下
GET /logbill/_search
{
"query" : { "match_all" : {}}
}
总结
以上就完成了ElasticSearch的简单使用,从0到1的过程已经完成,至于以后用更加复杂的操作,那就看情况了,其实难点还是ElasticSearch的查询语句全部是JSON格式的,刚开始不太好接受,习惯了就好,有什么不懂得可以评论下,看到会回复