温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SpringBoot框架如何集成ElasticSearch

发布时间:2021-11-02 11:44:44 来源:亿速云 阅读:253 作者:小新 栏目:开发技术

这篇文章主要为大家展示了“SpringBoot框架如何集成ElasticSearch”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot框架如何集成ElasticSearch”这篇文章吧。

依赖

SpringBoot版本:2.4.2

 <dependencies>         <!--lombok-->         <dependency>             <groupId>org.projectlombok</groupId>             <artifactId>lombok</artifactId>             <optional>true</optional>         </dependency>	  <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-devtools</artifactId>             <optional>true</optional>             <scope>true</scope>         </dependency>         <dependency>             <groupId>com.alibaba</groupId>             <artifactId>fastjson</artifactId>             <version>1.2.47</version>         </dependency>     </dependencies>     <dependencyManagement>         <dependencies>             <dependency>                 <groupId>org.springframework.cloud</groupId>                 <artifactId>spring-cloud-dependencies</artifactId>                 <version>2020.0.1</version>                 <type>pom</type>                 <scope>import</scope>             </dependency>             <dependency>                 <groupId>com.alibaba.cloud</groupId>                 <artifactId>spring-cloud-alibaba-dependencies</artifactId>                 <version>2021.1</version>                 <type>pom</type>                 <scope>import</scope>             </dependency>         </dependencies>     </dependencyManagement>

先了解一下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; @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://www.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://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<Product> 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<Product> 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<Product> 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"));         // 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("<font color='red'>");         highlightBuilder.postTags("</font>");         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();     } }

以上是“SpringBoot框架如何集成ElasticSearch”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI