1. 什么是kibana
Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作。 你用Kibana来搜索,查看,并和存储在Elasticsearch索引中的数据进行交互。 你可以轻松地执行高级数据分析,并且以各种图标、表格和地图的形式可视化数据。 Kibana使得理解大量数据变得很容易。它简单的、基于浏览器的界面使你能够快速创建和共享动态仪表板,实时显示Elasticsearch查询的变化。
2. 安装kibana可视化插件
解压上篇博客上传的kibana-6.4.3-linux-x86_64.tar.gz
修改kibana配置文件
# 将默认配置改成如下:
server.port: 5601 //kibana默认端口号
server.host: "192.168.0.105" //服务器IP地址
elasticsearch.url: "http://192.168.0.105:9200" //es的url
进入kibana的bin目录下,执行./kibana启动kibana
浏览器访问:http://192.168.0.105:5601,出现以下页面即表明kibanba安装成功
3. kibana增删改查文档
Elasticsearch存储结构 :
Elasticsearch是文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:
{
"name" : "zhangsan",
"sex" : 0,
"age" : 20
}
关系数据库 ⇒ 数据库 ⇒ 表 (用户表) ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
① 创建索引
② 查询索引
③ 创建文档(注意id不可重复,相当于mysql的主键id)
④ 查询文档
⑤ 更改文档(方式和新增一个样,注意执行后version和result的变化)
⑥ 删除文档
⑦ 删除索引
4. 高级查询(了解一下就行,一般我们springboot整合即可)
① 查询所有数据
② 根据多个id查询
③ 查询年龄为22岁
④ 查询年龄20-30之间
⑤ 查询年龄20-30之间,且降序排列
⑥ 查询年龄20-30之间,且降序排列,分页
⑦ 查询年龄20-30之间,且降序排列,分页,只展示name和age字段
5. Dsl语言查询与过滤
① 根据姓名精确查询
term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇
GET myes/user/_search
{
"query": {
"term": {
"name": "zhangsan"
}
}
}
② match根据名称模糊查询,相当于like
GET myes/user/_search
{
"query": {
"match": {
"name": "迪"
}
}
}
③ match根据名称模糊查询,相当于like,limit0,1
GET myes/user/_search
{
"from": 0,
"size": 2,
"query": {
"match": {
"name": "迪"
}
}
}
④ 使用filter过滤年龄,_source代表只展示的字段
6. Elasticsearch版本控制
① 为什么要进行版本控制CAS无锁(乐观锁)?
为了保证数据再多线程操作下的准确性
② 悲观锁和乐观锁
悲观锁:假设会发生并发冲突,屏蔽一切可能违反数据准确性的操作(最坏的打算,就认为一定会发生并发冲突)
乐观锁:假设不会发生并发冲突,只在提交操作是检查是否违反数据完整性
③ 内部版本控制和外部版本控制
内部版本控制:_version自增长,修改数据后,_version会自动的加1(一般用内部版本控制)
外部版本控制:为了保持_version与外部版本控制的数值一致,使用version_type=external检查数据当前的version值是否小于请求中的version值
7. SpringBoot整合Elasticsearch
① 首先在pom.xml文件引入以下依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yuyi</groupId>
<artifactId>springboot-es</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
② 配置application.yml
spring:
data:
elasticsearch:
####集群名称
cluster-name: myes
####地址
cluster-nodes: 192.168.0.105:9300
其中cluster-name为服务器/usr/local/elasticsearch-6.4.3/config/elasticsearch.yml的配置,默认为elasticsearch,可更改,这里我改成了myes,如下图所示:
③ SpringBoot启动类加上以下注解,其中basePackages为扫描的dao层
package com.yuyi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
@SpringBootApplication
@EnableElasticsearchRepositories(basePackages = "com.yuyi.repository")
public class AppEs {
public static void main(String[] args) {
SpringApplication.run(AppEs.class, args);
}
}
④ 编写一个实体类,UserEntity,属性与上面建的myes/user一一对应
indexName:上面配的索引(即mysql中的数据库)
type:类型(即mysql中的表)
package com.yuyi.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import lombok.Data;
@Document(indexName = "myes", type = "user")
@Data
public class UserEntity {
@Id
private String id;
private String name;
private Integer sex;
private Integer age;
}
⑤ DAO层
package com.yuyi.repository;
import org.springframework.data.repository.CrudRepository;
import com.yuyi.entity.UserEntity;
public interface UserReposiory extends CrudRepository<UserEntity, String> {//String指主键id的类型
}
⑥ Controller层,简单编写两个接口进行测试
package com.yuyi.controller;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.yuyi.entity.UserEntity;
import com.yuyi.repository.UserReposiory;
@RestController
public class EsController {
@Autowired
private UserReposiory userReposiory;
/**
* 添加文档
* @param user
* @return
*/
@RequestMapping("/addUser")
public UserEntity addUser(@RequestBody UserEntity user) {
return userReposiory.save(user);
}
/**
* 查询文档
* @param id
* @return
*/
@RequestMapping("/findUser")
public Optional<UserEntity> findUser(String id) {
return userReposiory.findById(id);
}
}
⑦ 打开postman进行测试:
可以发现在kibana可视化界面,获取到id为2的值:
测试查询接口:
至此,kibana可视化界面安装,以及SpringBoot整合Elasticsearch正式完成!!