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

目录

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

依赖 SpringBoot版本:2.4.2
org.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-data-elasticsearchorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-devtoolstruetruecom.alibabafastjson1.2.47org.springframework.cloudspring-cloud-dependencies2020.0.1pomimportcom.alibaba.cloudspring-cloud-alibaba-dependencies2021.1pomimport

先了解一下curl方式操作es
SpringBoot框架集成ElasticSearch实现过程示例详解
文章图片


与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; @Configurationpublic class ElasticsearchConfig extends AbstractElasticsearchConfiguration {@Override@Beanpublic 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"@Idprivate 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@RequestMappingpublic class TestESController {@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate; @ResourceProductMapper productMapper; @GetMappingpublic void createIndex() {//创建索引,系统初始化会自动创建索引System.out.println("创建索引"); }@DeleteMappingpublic void deleteIndex() {//创建索引,系统初始化会自动创建索引boolean flg = elasticsearchRestTemplate.deleteIndex(Product.class); System.out.println("删除索引 = " + flg); }@PostMappingpublic void save(){Product product = new Product(); product.setId(1L); product.setTitle("华为手机"); product.setCategory("手机"); product.setPrice(2999.0); product.setImages("http://www.atguigu/hw.jpg"); productMapper.save(product); }@PutMappingpublic void update(){Product product = new Product(); product.setId(1L); product.setTitle("小米 2 手机"); product.setCategory("手机"); product.setPrice(9999.0); product.setImages("http://www.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(product); }//批量新增@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://www.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进行了封装 */@Slf4jpublic 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(); }}


文档操作
@Slf4jpublic 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(); }}


检索操作
@Slf4jpublic 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")); // boolQueryBuilder.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://www.bilibili.com/video/BV1hh411D7sb?p=62
【SpringBoot框架集成ElasticSearch实现过程示例详解】以上就是SpringBoot集成ElasticSearch实现过程示例详解的详细内容,更多关于SpringBoot框架集成ES的资料请关注脚本之家其它相关文章!

    推荐阅读