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
:非官方,更新慢RestTemplate
、HttpClient
:模拟发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
发布评论