elasticsearch实现根据某一个字段去重后并求总数

版本说明:

elasticsearch:elasticsearch-7.12.1

kibana:kibana-7.12.1-windows-x86_64

原始数据:

_index_type_id_scoreaddressagebiridname

jason_doc_10

_doc

L2aqNoABfXKo_Zq7BPkO

1

中国深圳

69

1650184553376

daZhaoLiu

大赵六

jason_doc_10

_doc

MGaqNoABfXKo_Zq7mfma

1

中国上海市宝山区

20

1649862303342

user001

大张三

jason_doc_10

_doc

MWaqNoABfXKo_Zq7mfma

1

中国上海市浦东区

50

1649862303342

user00100

小张三

jason_doc_10

_doc

MmaqNoABfXKo_Zq7mfma

1

中国上海市黄埔

34

1649862303342

00user1

李四

jason_doc_10

_doc

M2aqNoABfXKo_Zq7mfma

1

上海普陀区

45

1649862303342

user0011

大李四

jason_doc_10

_doc

NGaqNoABfXKo_Zq7mfma

1

中国北京市朝阳区

62

1649862303342

user2201

小李四

jason_doc_10

_doc

NWaqNoABfXKo_Zq7mfma

1

中国北京市东城

42

1649862303342

78user01

王五

jason_doc_10

_doc

NmaqNoABfXKo_Zq7mfma

1

中国北京市西城区

12

1649862303342

22

大王五

jason_doc_10

_doc

N2aqNoABfXKo_Zq7mfma

1

北京市海淀区

18

1649862303342

user01

小王五

jason_doc_10

_doc

OGasNoABfXKo_Zq77Pkx

1

10

test_save_01

测试save用户

jason_doc_10

_doc

OWasNoABfXKo_Zq77Pmu

1

20

test_save_02

测试save用户_02

jason_doc_10

_doc

OmasNoABfXKo_Zq77Pmu

1

30

test_save_03

测试save用户_03

jason_doc_10

_doc

Q2aeO4ABfXKo_Zq7TvlP

1

广东省广州市天河区

55

1650267672018

daZhaoLiu

王海

 因为数据的原因,我这里只有年龄age字段有重复的,所以根据age去重。

DSL请求:

GET /jason_doc_10/_search
{
  "size": 0,
  "aggs": {
    "distic_age": {
      "cardinality": {
        "field": "age"
      }
    } 
  }
}

响应结果:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 13,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "distic_age" : {
      "value" : 12
    }
  }
}

java中的实现:

首先pom依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <version>2.6.6</version>
        </dependency>
<!--  注意:这里使用的ES版本是7.12.1,所以我本地安装的ES和kibana也是7.12.1 -->

 配置的客户端:HighLevelClient

@SpringBootConfiguration
public class RestHingLevelClient {

    @Bean
    public RestClientBuilder restClientBuilder() {
        return RestClient.builder(createHttpHost("127.0.0.1:9200"));
    }

    @Bean
    public RestHighLevelClient restHighLevelClient(@Autowired RestClientBuilder restClientBuilder) {
        return new RestHighLevelClient(restClientBuilder);
    }

    private HttpHost createHttpHost(String ipPort) {
        String[] split = ipPort.split(":");
        String ip = split[0];
        int port = Integer.parseInt(split[1]);
        return new HttpHost(ip, port, "http");
    }
}

测试类:

@SpringBootTest
public class TestQueryDocument {

    @Autowired
    @Qualifier(value = "restHighLevelClient")
    RestHighLevelClient client;

    @Test
    public void testDistinctByAge() throws IOException {
        // 创建查询请求
        SearchRequest request = new SearchRequest();
        request.indices("jason_doc_10");
        // 创建查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        // 根据年龄去重,并起别名为:distic_age
        builder.aggregation(AggregationBuilders.cardinality("distic_age").field("age"));
        request.source(builder);
        // 查询
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        Aggregations aggregations = response.getAggregations();
        ParsedCardinality cardinality = (ParsedCardinality) aggregations.asList().get(0);
        long count = cardinality.getValue();
        System.out.println("去重后的总数:" + count);
    }

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值