es搭建及使用
一.es安装
1.环境需要 必须安装了java环境 jdk1.8
2.下载需要使用es的版本 本次演示版本为v7.4.2版本
下载地址 https://www.elastic.co/cn/downloads/elasticsearch
3.如需要使用可视化界面kibana 下载时版本需要跟es版本一致v7.4.2版本
下载地址 https://www.elastic.co/cn/downloads/kibana
4.下载完成首先启动es 解压开以后双击 elasticsearch.bat
5. 启动成功如下图
访问 localhost:9200
二.Springboot集成es
1.es pom依赖下载
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>esDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>esDemo</name>
<description>esDemo</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注:此次spring-boot-starter-parent版本为2.2.1.RELEASE
最主要的包为 spring-boot-starter-data-elasticsearch
2.application.properties增加es访问地址
server.port=8080
spring.elasticsearch.rest.uris= 127.0.0.1:9200
3.创建index 索引(此处根据具体业务创建所需索引)
package com.example.demo.bean;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @program: esDemo
* @description: 创建es 索引实体
* @author: David
* @create: 2023-02-09 10:34
**/
@Document(indexName = "lol")
public class LoLEs {
@Id
private Long id;
@Field(type = FieldType.Text)
private String hName;
@Field(type = FieldType.Text)
private String uName;
@Field(type = FieldType.Integer)
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String gethName() {
return hName;
}
public String getuName() {
return uName;
}
public void sethName(String hName) {
this.hName = hName;
}
public void setuName(String uName) {
this.uName = uName;
}
}
三.Extends ElasticsearchRepository 实现es简单增删改查的业务
1.如想用JPA的方式去实现es简单增删改查的业务可以
Extends ElasticsearchRepository
@Repository
public interface LoLEsRespository extends ElasticsearchRepository<LoLEs,Long> {
}
2.用jpa的方式实现增删查
@RestController
@CrossOrigin
public class LoLEsController {
@Autowired
private LoLEsRespository loLEsRespository;
/**
* @Description: 创建索引
* @Param: [loLEs]
* @return: void
* @Author: david
* @Date: 2023/2/9
*/
@PostMapping(value = "/create/user")
public void create(@RequestBody List<LoLEs> loLEs) {
loLEsRespository.saveAll(loLEs);
}
/**
* @Description: 查询该索引所有数据
* @Param: []
* @return: java.util.List<com.example.demo.bean.LoLEs>
* @Author: david
* @Date: 2023/2/9
*/
@GetMapping(value = "/get/user")
public List<LoLEs> getAll() {
Iterable<LoLEs> all = loLEsRespository.findAll();
List<LoLEs> objects = new ArrayList<>();
if (null != all) {
all.forEach(user -> {
LoLEs loLEs = new LoLEs();
loLEs.setId(user.getId());
loLEs.sethName(user.gethName());
loLEs.setuName(user.getuName());
loLEs.setAge(user.getAge());
objects.add(loLEs);
});
}
return objects;
}
/**
* @Description: 根据id删除索引数据
* @Param: [id]
* @return: void
* @Author: david
* @Date: 2023/2/9
*/
@GetMapping(value = "/del/user")
public void delUser(@RequestParam("id") Long id) {
loLEsRespository.deleteById(id);
}
}
四.使用RestHighLevelClient方式对es 进行 复杂查询操作(http协议)
1.常用查询条件
terms 精准查询
range 范围查询
wildcard 模糊查询
multiMatch 多字段模糊查询
sort 排序 字段的类型必须是:integer、double、long或者keyword
lte(30).gte(20) lte 小于等于 gte 大于等于
builder.from(0).size(2); 分页
sum(“sum_age”).field(“age”); 求和
avg(“avg_age”).field(“age”); 平均值
package com.example.esdemo;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
@SpringBootTest
class EsDemoApplicationTests {
@Autowired
private RestHighLevelClient client;
@Test
void contextLoads() {
}
/**
* @Description: 多条件查询
* @Param: []
* @return: void
* @Author: david
* @Date: 2023/2/9
*/
@Test
public void searchMore() throws IOException {
// 创建请求
SearchSourceBuilder builder = new SearchSourceBuilder()
.query(QueryBuilders.termsQuery("uName", "aa", "bb"));
//搜索
SearchRequest searchRequest = new SearchRequest();
//搜索的索引
searchRequest.indices("lol");
searchRequest.source(builder);
// 执行请求
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 解析查询结果
System.out.println(response.toString());
}
/**
* @Description: 范围查询
* @Param: []
* @return: void
* @Author: david
* @Date: 2023/2/9
*/
@Test
public void search1() throws IOException {
// 创建请求
SearchSourceBuilder builder = new SearchSourceBuilder()
.query(QueryBuilders.rangeQuery("age").from(20).to(30));
//搜索
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("lol");
searchRequest.source(builder);
// 执行请求
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 解析查询结果
System.out.println(response.toString());
}
/**
* @Description: 模糊查询
* @Param: []
* @return: void
* @Author: david
* @Date: 2023/2/9
*/
@Test
public void search2() throws IOException {
// 创建请求
SearchSourceBuilder builder = new SearchSourceBuilder()
.query(QueryBuilders.wildcardQuery("hName", "测试1"));
//搜索
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("lol");
searchRequest.source(builder);
// 执行请求
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 解析查询结果
System.out.println(response.toString());
}
/**
* @Description: 多字段模糊查询
* @Param: []
* @return: void
* @Author: david
* @Date: 2023/2/9
*/
@Test
public void search3() throws IOException {
// 创建请求
SearchSourceBuilder builder = new SearchSourceBuilder()
.query(QueryBuilders.multiMatchQuery("测试", "uName", "hName"));
//搜索
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("lol");
searchRequest.source(builder);
// 执行请求
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 解析查询结果
System.out.println(response.toString());
}
/**
* @Description: 排序,字段的类型必须是:integer、double、long或者keyword
* @Param: []
* @return: void
* @Author: david
* @Date: 2023/2/9
*/
@Test
public void search4() throws IOException {
// 创建请求
SearchSourceBuilder builder = new SearchSourceBuilder()
.sort("age", SortOrder.ASC);
//搜索
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("lol");
searchRequest.source(builder);
// 执行请求
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 解析查询结果
System.out.println(response.toString());
}
/**
* @Description: 多条件查询 + 排序 + 分页
* @Param: []
* @return: void
* @Author: david
* @Date: 2023/2/9
*/
@Test
public void search5() throws IOException {
// 创建请求
SearchSourceBuilder builder = new SearchSourceBuilder();
//条件搜索
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
//boolQueryBuilder.must(QueryBuilders.matchQuery("uName", "bb"));
boolQueryBuilder.must(QueryBuilders.rangeQuery("age").lte(30).gte(20));
builder.query(boolQueryBuilder);
//结果集合分页
builder.from(0).size(2);
//排序
builder.sort("age", SortOrder.ASC);
//搜索
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("lol");
searchRequest.source(builder);
// 执行请求
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 解析查询结果
System.out.println(response.toString());
}
/**
* @Description: 求和
* @Param: []
* @return: void
* @Author: david
* @Date: 2023/2/9
*/
@Test
public void search6() throws IOException {
// 创建请求
SearchSourceBuilder builder = new SearchSourceBuilder();
//条件搜索
builder.query(QueryBuilders.matchAllQuery());
//聚合查询
AggregationBuilder aggregation = AggregationBuilders.sum("sum_age").field("age");
builder.aggregation(aggregation);
//搜索
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("lol");
searchRequest.source(builder);
// 执行请求
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 解析查询结果
System.out.println(response.toString());
}
/**
* @Description: 平均值
* @Param: []
* @return: void
* @Author: david
* @Date: 2023/2/9
*/
@Test
public void search7() throws IOException {
// 创建请求
SearchSourceBuilder builder = new SearchSourceBuilder();
//条件搜索
builder.query(QueryBuilders.matchAllQuery());
//聚合查询
AggregationBuilder aggregation = AggregationBuilders.avg("avg_age").field("age");
builder.aggregation(aggregation);
//搜索
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("lol");
searchRequest.source(builder);
// 执行请求
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 解析查询结果
System.out.println(response.toString());
}
}
2.注:response 中的索引值存在于 SearchHit[]中 可以如下取值
SearchHits hits = response.getHits();
if (null != hits) {
SearchHit[] hits1 = hits.getHits();
for (SearchHit hit : hits) {
//取值
LoLEs loLEs = new LoLEs();
loLEs.setId(Long.valueOf(String.valueOf(hit.getSourceAsMap().get("id"))));
loLEs.sethName(hit.getSourceAsMap().get("hName") + "");
loLEs.setuName(hit.getSourceAsMap().get("uName") + "");
objects.add(loLEs);
}
}
五.使用kibana可视化界面对es 进行增删改查操作
1.启动kibana 解压 kibana 双击 kibana.bat 如下图启动成功
2.访问kibana 操作es
http://localhost:5601
3.常用的一些查询语句
//查询所有
GET lol/_search
{
"query": {
"match_all": {}
}
}
//查询总数
GET lol/_count
{
"query": {
"match_all": {}
}
}
//增加数据
POST lol/_doc
{
"hName":"kibana增加",
"uName":"test",
"age":30
}
//修改数据
PUT lol/_doc/1
{
"hName":"测试11",
"uName":"test",
"age":90
}
//准确查询
GET lol/_search?pretty
{
"query": {
"term": {
"uName": "cc"
}
}
}
//模糊查询
GET lol/_search?pretty
{
"query": {
"match": {
"hName": "测"
}
}
}
//分页查询
GET lol/_search?pretty
{
"from": 0,
"size": 2,
"query": {
"match": {
"hName": "测"
}
}
}
//过滤查询
gte 大于等于
lte 小于等于
e 等于
GET lol/_search?pretty
{
"query": {
"bool": {
"filter": {
"range": {
"age": {
"gte": 10,
"lte": 50
}
}
}
}
}
}
//age sort 排序
GET lol/_search
{
"query":{"match_all": {}},
"sort":[
{"age":{"order":"desc"}}
]
}
//最大值
可使用min、max、avg替代stats分别返回最小值、最大值、平均值
POST lol/_search
{
"aggs":{
"max_value":{
"max":{
"field":"age"
}
}
}
}