SpringBoot框架集成ElasticSearch实现过程示例详解

网友投稿 1055 2022-11-26

SpringBoot框架集成ElasticSearch实现过程示例详解

SpringBoot框架集成ElasticSearch实现过程示例详解

目录依赖与SpringBoot集成配置类实体类测试例子RestHighLevelClient直接操作索引操作文档操作检索操作

依赖

SpringBoot版本:2.4.2

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-data-elasticsearch

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-devtools

true

true

com.alibaba

fastjson

1.2.47

org.springframework.cloud

spring-cloud-dependencies

2020.0.1

pom

import

com.alibaba.cloud

spring-cloud-alibaba-dependencies

2021.1

pom

import

先了解一下curl方式操作es

与SpringBoot集成

配置类

import org.elasticsearch.client.RestHighLevelClient;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.elasticsearch.client.ClientConfiguration;

import org.springframework.data.elasticsearch.client.RestClients;

import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;

@Configuration

public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {

@Override

@Bean

public RestHighLevelClient elasticsearchClient() {

final ClientConfiguration clientConfiguration = ClientConfiguration.builder()

.connectedTo("localhost:9200")

.build();

return RestClients.create(clientConfiguration).rest();

}

}

实体类

import lombok.Data;

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;

@Data

@Document(indexName = "product", shards = 3, replicas = 1)

public class Product {

//必须有 id,这里的 id 是全局唯一的标识,等同于 es 中的"_id"

@Id

private Long id;//商品唯一标识

/**

* type : 字段数据类型

* analyzer : 分词器类型

* index : 是否索引(默认:true)

* Keyword : 短语,不进行分词

*/

@Field(type = FieldType.Text, analyzer = "ik_max_word")

private String title;//商品名称

@Field(type = FieldType.Keyword)

private String category;//分类名称

@Field(type = FieldType.Double)

private Double price;//商品价格

@Field(type = FieldType.Keyword, index = false)

private String images;//图片地址

}

测试例子

@RestController

@RequestMapping

public class TestESController {

@Autowired

private ElasticsearchRestTemplate elasticsearchRestTemplate;

@Resource

ProductMapper productMapper;

@GetMapping

public void createIndex() {

//创建索引,系统初始化会自动创建索引

System.out.println("创建索引");

}

@DeleteMapping

public void deleteIndex() {

//创建索引,系统初始化会自动创建索引

boolean flg = elasticsearchRestTemplate.deleteIndex(Product.class);

System.out.println("删除索引 = " + flg);

}

@PostMapping

public void save(){

Product product = new Product();

product.setId(1L);

product.setTitle("华为手机");

product.setCategory("手机");

product.setPrice(2999.0);

product.setImages("http://atguigu/hw.jpg");

productMapper.save(product);

}

@PutMapping

public void update(){

Product product = new Product();

product.setId(1L);

product.setTitle("小米 2 手机");

product.setCategory("手机");

product.setPrice(9999.0);

product.setImages("http://atguigu/xm.jpg");

productMapper.save(product);

}

@GetMapping("/findById")

public void findById(){

Product product = productMapper.findById(1L).get();

System.out.println(product);

}

@GetMapping("/findAll")

public void findAll(){

Iterable products = productMapper.findAll();

for (Product product : products) {

System.out.println(product);

}

}

//删除

@DeleteMapping("/delDocument")

public void delete(){

Product product = new Product();

product.setId(1L);

productMapper.delete(produchttp://t);

}

//批量新增

@PostMapping("/addBatch")

public void saveAll(){

List productList = new ArrayList<>();

for (int i = 0; i < 10; i++) {

Product product = new Product();

product.setId(Long.valueOf(i));

product.setTitle("["+i+"]小米手机");

product.setCategory("手机");

product.setPrice(1999.0+i);

product.setImages("http://atguigu/xm.jpg");

productList.add(product);

}

productMapper.saveAll(productList);

}

//分页查询

@GetMapping("/findByPageable")

public void findByPageable(){

//设置排序(排序方式,正序还是倒序,排序的 id)

Sort sort = Sort.by(Sort.Direction.DESC,"id");

int currentPage=0;//当前页,第一页从 0 开始, 1 表示第二页

int pageSize = 5;//每页显示多少条

//设置查询分页

PageRequest pageRequest = PageRequest.of(currentPage, pageSize,sort);

//分页查询

Page productPage = productMapper.findAll(pageRequest);

for (Product Product : productPage.getContent()) {

System.out.println(Product);

}

}

}

RestHighLevelClient直接操作

这些操作,就是javaApi,和上图中,通过http方式和es交互式类似的

索引操作

/**

* 这里时测试,开发时:通过 ESTemplate操作。Spring进行了封装

*/

@Slf4j

public class ESIndexTestCase {

public static void main(String[] args) throws IOException {

// 创建客户端

RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200)));

// 创建索引

// CreateIndexRequest indexRequest = new CreateIndexRequest("book");

// CreateIndexResponse indexResponse = esClient.indices().create(indexRequest, RequestOptions.DEFAULT);

// boolean acknowledged = indexResponse.isAcknowledged();

// log.error("响应{}",acknowledged);

// 查询索引

// GetIndexRequest getIndexRequest = new GetIndexRequest("book");

// GetIndexResponse getIndexResponse = esClient.indices().get(getIndexRequest, RequestOptions.DEFAULT);

// log.info("getAliases:{}",getIndexResponse.getAliases());

// log.info("getMappings:{}",getIndexResponse.getMappings());

// log.info("getSettings:{}",getIndexResponse.getSettings());

// 删除索引

AcknowledgedResponse deleteRes = esClient.indices().delete(new DeleteIndexRequest("book"), RequestOptions.DEFAULT);

boolean delAck = deleteRes.isAcknowledged();

log.error("delAck:{}",delAck);

esClient.close();

}

}

文档操作

@Slf4j

public class ESDocmentTestCase {

public static void main(String[] args) throws IOException {

// 创建客户端

RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200)));

// 新增文档

// IndexRequest indexRequest = new IndexRequest("user");

// indexRequest.id("1001");

// // 准备文档

// User user = new User();

// user.setName("张三");

// user.setAge(22);

// user.setSex("男");

// String userJson = JSONObject.toJSONString(user);

// indexRequest.source(userJson, XContentType.JSON);

// IndexResponse indexResponse = esClient.index(indexRequest, RequestOptions.DEFAULT);

// log.error("getResult:==========>:{}",indexResponse.getResult());

// 批量新增文档

BulkRequest bulkRequest = new BulkRequest();

bulkRequest.add(new IndexRequest("user").id("2001").source(XContentType.JSON,"name","张三","age","40","sex","男"));

bulkRequest.add(new IndexRequest("user").id("2002").source(XContentType.JSON,"name","222","age","10","sex","女"));

bulkRequest.add(new IndexRequest("user").id("2003").source(XContentType.JSON,"name","33333","age","20","sex","男"));

bulkRequest.add(new IndexRequest("user").id("2004").source(XContentType.JSON,"name","111","age","30","sex","男"));

bulkRequest.add(new IndexRequest("user").id("2005").source(XContentType.JSON,"name","2222","age","31","sex","女"));

BulkResponse bulkResponse = esClient.bulk(bulkRequest, RequestOptions.DEFAULT);

log.error("getResult:==========>:{}",bulkResponse.getTook());

// 更新文档(全量更新,局部更新)

// UpdateRequest updateRequest = new UpdateRequest("user", "1001");

// updateRequest.doc("sex","dddddd");

// UpdateResponse updateResponse = esClient.update(updateRequest, RequestOptions.DEFAULT);

// log.error("getResult:==========>:{}",updateResponse.getResult());

// 根据_id查询文档

// GetRequest getRequest = new GetRequest("user", "1001");

// GetResponse getResponse = esClient.get(getRequest, RequestOptions.DEFAULT);

// log.error("getResult:==========>:{}",getResponse.getSource());

// 根据_id 删除数据

// DeleteRequest deleteRequest = new DeleteRequest("user", "1001");

// DeleteResponse deleteResponse = esClient.delete(deleteRequest, RequestOptions.DEFAULT);

// log.error("getResult:==========>:{}",deleteResponse.getResult());

// 批量删除(和批量新增类似)

esClient.close();

}

}

检索操作

@Slf4j

public class EsSearchTest {

public static void main(String[] args) throws IOException {

// 创建客户端

RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200)));

// 查询所有

// SearchRequest searchRequest = new SearchRequest("user");

// SearchSourceBuilder queryBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());

// queryBuilder.from(0);

// queryBuilder.size(4);

// queryaBuilder.sort("age", SortOrder.DESC);

// SearchRequest sourceRequest = searchRequest.source(queryBuilder);

// SearchResponse searchResponse = esClient.search(sourceRequest, RequestOptions.DEFAULT);

// log.error("getHits:======>{}", searchResponse.getHits().getTotalHits());

// searchResponse.getHits().forEach(hit -> System.out.println(hit.getSourceAsString()));

// 2-组合查询

// SearchRequest searchRequest = new SearchRequest("user");

// BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

// // 这里就是组合条件。和mysql where 组合类似

// boolQueryBuilder.should(QueryBuilders.matchQuery("age","30"));

// boolQueryBhttp://uilder.should(QueryBuilders.matchQuery("age","40"));

// SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(boolQueryBuilder);

// searchRequest.source(sourceBuilder);

// SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);

// searchResponse.getHits().forEach(hit -> System.err.println(hit.getSourceAsString()));

// 3-范围查询

// SearchRequest searchRequest = new SearchRequest("user");

// SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

// RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");

// rangeQuery.gte("30");

// sourceBuilder.query(rangeQuery);

// searchRequest.source(sourceBuilder);

// SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);

// searchResponse.getHits().forEach(hit -> System.out.println(hit.getSourceAsString()));

//4-模糊查询+高亮

SearchRequest searchRequest = new SearchRequest("user");

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

FuzzyQueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery("name", "张三");

sourceBuilder.query(fuzzyQuery);

HighlightBuilder highlightBuilder = new HighlightBuilder();

highlightBuilder.preTags("");

highlightBuilder.postTags("");

highlightBuilder.field("name");

sourceBuilder.highlighter(highlightBuilder);

searchRequest.source(sourceBuilder);

SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);

searchResponse.getHits().forEach(System.out::println);

// 5-聚合查询

esClient.close();

}

}

内容来自B站

https://bilibili.com/video/BV1hh411D7sb?p=62

以上就是SpringBoot集成ElasticSearch实现过程示例详解的详细内容,更多关于SpringBoot框架集成ES的资料请关注我们其它相关文章!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:day06---基础优化之防火墙,yum源,字符集,vim补充,echo命令
下一篇:linux下jdk安装
相关文章

 发表评论

暂时没有评论,来抢沙发吧~