简介
Spring Data Elasticsearch是Spring Data项目的子项目,提供了Elasticsearch与Spring的集成,让你轻松进行Elasticsearch客户端开发。
依赖引入及配置
只需要引入下面的依赖就可以集成Elasticsearch :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
关于配置有两种一种面向传统的Restful:
spring:
elasticsearch:
rest:
# 逗号分隔的Elasticsearch实例使用的列表
uris: http://localhost:9200
# 链接超时时间
connection-timeout:
# 读取超时时间
read-timeout:
# ES 用户名
username:
# ES 密码
password:
如果你都采用默认的配置,可以什么都不配置,包括uris。
另一种面向反应式:
spring:
data:
elasticsearch:
client:
# 反应式相关的配置
reactive:
# 端点
endpoints:
connection-timeout:
max-in-memory-size:
socket-timeout:
use-ssl:
username:
password:
这里配合的是Spring Webflux反应式框架,我个人其实更加倾向于此
操作
Query
java - Query有3个实现类
- CriteriaQuery 简单的查询
- NativeSearchQuery 较复杂的查询(聚合等)
- StringQuery 原生的DSL字符串查询
ElasticsearchRestTemplate
这里演示进行复杂的NativeSearchQuery 查询
@Autowired
ReactiveElasticsearchTemplate reactiveElasticsearchTemplate;
public Flux<org.elasticsearch.search.aggregations.Aggregation> getDrivingTrendModel(Search search) {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// 构建布尔查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//精确查询
boolQueryBuilder.must(QueryBuilders.termQuery("tenantId", search.getTenantId()));
//过滤时间范围
boolQueryBuilder.filter(QueryBuilders.rangeQuery("ts").lte(Instant.now()));
nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
// 构建聚合查询(dateHistogram 按照日期分组)
DateHistogramAggregationBuilder dateHistogramAggregationBuilder = AggregationBuilders.dateHistogram("actions_per_day").field("ts").calendarInterval(DateHistogramInterval.DAY).format("yyyy-MM-dd");
//再求基数(其实相当于该字段互不相同的值有多少类,输出的是种类数,相当于mysql去重计数)
CardinalityAggregationBuilder cardinalityAggregationBuilder = AggregationBuilders.cardinality("group_by_user").field("username.keyword");
//是一个子聚合
dateHistogramAggregationBuilder.subAggregation(cardinalityAggregationBuilder);
nativeSearchQueryBuilder.addAggregation(dateHistogramAggregationBuilder);
return reactiveElasticsearchTemplate.aggregate(nativeSearchQueryBuilder.build(), org.elasticsearch.search.aggregations.Aggregation.class, IndexCoordinates.of("taurus-log.tauaction"));
}