ElasticSearch与SpringBoot集成-ReactiveElasticsearchTemplate

简介

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"));
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值