Elasticsearch(四):SpringBoot整合ES

编程入门 行业动态 更新时间:2024-10-27 18:32:24

<a href=https://www.elefans.com/category/jswz/34/1770454.html style=Elasticsearch(四):SpringBoot整合ES"/>

Elasticsearch(四):SpringBoot整合ES

文章目录

  • 一、说明
  • 二、使用SpringBoot Data(6.x及以下)
  • 三、Elasticsearch-Rest-Clint(7.x以上)

一、说明

通常我们使用SpringData整合组件都会非常的容易,SpringData也提供了对Elasticsearch的整合方案spring-data-elasticsearch
spring-data-elasticsearch的核心包是transport-api.jar,由于springboot版本不同,ransport-api.jar不同,不能适配es版本,7.x已经不建议使用,8以后就要废弃,因为8版本以后将舍弃9300TCP请求。

而使用9200HTTP请求的方案有如下:

  • JestClient:非官方,更新慢
  • RestTemplateHttpClient:模拟发HTTP请求,ES很多操作需要自己封装,麻烦
  • Elasticsearch-Rest Client推荐):官方RestClient,封装了ES操作,API层次分明,上手简单

二、使用SpringBoot Data(6.x及以下)

① 添加 Maven 依赖

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-elasticsearch</artifactId>  
</dependency>

② 添加配置

spring:data:elasticsearch:cluster-name: es  #集群名cluster-nodes: 192.168.182.200:9300  #节点地址repositories:enabled: true

③ Dao 层接口继承 ElasticSearchRepository

@Repository
public interface UserDao extends ElasticsearchRepository<User,Long> {}

④ 实体添加 @Document 注解

//索引名和类型均为小写
@Document(indexName = "company",type = "user")
public class User implements Serializable {private static final long serialVersionUID = 1L;private int id;private String name;
}

⑤ controller 层接口代码的编写

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserDao userDao;/*** 查询*/@RequestMapping("/search")public Iterable<User> search(@RequestParam String name) {//查询所有文档
//        MatchAllQueryBuilder queryBuilder = QueryBuilders.matchAllQuery();//根据条件查询MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("name", name);Iterable<User> result = userDao.search(queryBuilder);return result;}/*** 新增*/@RequestMapping("/insert")public String insert(@RequestParam String name) {User user = new User();user.setName(name);userDao.save(user);return "success";}}

⑥ 进行接口的测试

插入数据的测试:

查询的测试:

相对于注入JestClient去写DSL语句,SpringBoot data ES提供的方法要简单了许多。在使用SpringBoot data ES的时候需要注意和ElasticSearch版本的对应。

QueryBuilders的详细使用

三、Elasticsearch-Rest-Clint(7.x以上)

参考官方API.x/java-rest-high-getting-started.html

① 引入依赖

同时需要指定elasticsearch.version,因为SpringBoot版本中指定了elasticsearch版本会冲突。

    <properties><java.version>1.8</java.version><elasticsearch.version>7.4.2</elasticsearch.version></properties><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.4.2</version></dependency><!--引入fastjson是为了方便Json数据的封装--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.72</version></dependency>

RestHighLevelClient的配置

RequestOptions的说明:我们可以创建一个单例实例在所有请求中共享,就是对通用请求的配置,比如给请求添加header

@Configuration
public class ElasticSearchHighClientConfig {public static final RequestOptions COMMON_OPTIONS;static {RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();COMMON_OPTIONS = builder.build();}@Beanpublic RestHighLevelClient restHighLevelClient() {RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.182.150", 9200, "http")
//                        new HttpHost("192.168.182.151", 9200, "http")));return restHighLevelClient;}}

③ 新增 Index

@RunWith(SpringRunner.class)
@SpringBootTest
public class Es7ClientApplicationTests {@Resourceprivate RestHighLevelClient client;@Testpublic void testIfExistClient() {System.err.println(client);}@Data@AllArgsConstructor@NoArgsConstructorclass User {private String userName;private String gender;private Integer age;}@Testpublic void testIndex() throws IOException {CreateIndexRequest request = new CreateIndexRequest("users").source(JSON.toJSONString(new User()), XContentType.JSON);client.indices().create(request, RequestOptions.DEFAULT);}}

④ 新增 Document

    @Testpublic void testDocument() throws IOException {User user = new User("zs", "M", 13);IndexRequest request = new IndexRequest("users").id("1").source(JSON.toJSONString(user), XContentType.JSON);client.index(request, RequestOptions.DEFAULT);}

我们可以发现在7.x的版本Elasticsearch正在弱化type的存在,而在8.x的版本ElasticSearch会正式删除type,因为相同的index不同的type底层的存储方式也是一样的。


⑤ 查询 Document

    @Testpublic void testGetDocument() throws IOException {GetRequest request = new GetRequest("users", "1");GetResponse response = client.get(request, RequestOptions.DEFAULT);System.out.println(response);}


⑥ 复杂检索

只要会写DSL,复杂检索API基本会用,几乎一样

#查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资
GET bank/_search
{"query": {"match_all": {}},"aggs": {"ageAgg": {"terms": {"field": "age","size": 100},"aggs": {"genderAgg": {"terms": {"field": "gender.keyword","size": 2},"aggs": {"balanceAvg": {"avg": {"field": "balance"}}}},"balanceAvg2": {"avg": {"field": "balance"}}}}}
}

代码实现:

    @Testpublic void testSearch() throws IOException {SearchRequest searchRequest = new SearchRequest();searchRequest.indices("bank");//封装检索条件SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()).aggregation(AggregationBuilders.terms("ageAgg").field("age").size(100).subAggregation(AggregationBuilders.terms("genderAgg").field("gender.keyword").size(2).subAggregation(AggregationBuilders.avg("balanceAvg").field("balance"))).subAggregation(AggregationBuilders.avg("balanceAvg2").field("balanceAvg2")));System.err.println(builder);searchRequest.source(builder);SearchResponse search = client.search(searchRequest, ElasticSearchHighClientConfig.COMMON_OPTIONS);System.out.println(search);}

更多推荐

Elasticsearch(四):SpringBoot整合ES

本文发布于:2024-02-17 07:18:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1693165.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Elasticsearch   SpringBoot   ES

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!