ElasticSearch分组统计查询

这篇具有很好参考价值的文章主要介绍了ElasticSearch分组统计查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ES 分组查询

maven依赖:

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

构建配置类:

package cn.com.newcapec.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "sl")
public class EsServiceConfig {
    private String publickey;
    private String esUserName;
    private String esPassword;
    private String esHost;
    private String esPort;
    private String esScheme;

    public String getEsUserName() {
        return esUserName;
    }

    public void setEsUserName(String esUserName) {
        this.esUserName = esUserName;
    }

    public String getEsPassword() {
        return esPassword;
    }

    public void setEsPassword(String esPassword) {
        this.esPassword = esPassword;
    }

    public String getEsHost() {
        return esHost;
    }

    public void setEsHost(String esHost) {
        this.esHost = esHost;
    }

    public String getEsPort() {
        return esPort;
    }

    public void setEsPort(String esPort) {
        this.esPort = esPort;
    }

    public String getEsScheme() {
        return esScheme;
    }

    public void setEsScheme(String esScheme) {
        this.esScheme = esScheme;
    }

    public String getPublickey() {
        return publickey;
    }

    public void setPublickey(String publickey) {
        this.publickey = publickey;
    }
}

package cn.com.newcapec.config;

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;

@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
    @Autowired
    private EsServiceConfig esServiceConfig;

    @Override
    public RestHighLevelClient elasticsearchClient() {
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    //访问用户名和密码为您创建阿里云Elasticsearch实例时设置的用户名和密码,也是Kibana控制台的登录用户名和密码。
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(esServiceConfig.getEsUserName(), esServiceConfig.getEsPassword()));
        // 通过builder创建rest client,配置http client的HttpClientConfigCallback。
        // 单击所创建的Elasticsearch实例ID,在基本信息页面获取公网地址,即为ES集群地址。
        RestClientBuilder builder = RestClient.builder(new HttpHost(esServiceConfig.getEsHost(), Integer.valueOf(esServiceConfig.getEsPort()), esServiceConfig.getEsScheme())).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
            @Override
            public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
            }
        });
        // RestHighLevelClient实例通过REST low-level client builder进行构造。
        return new RestHighLevelClient(builder);
    }
    @Bean
    public ElasticsearchRestTemplate restTemplate() {
        return new ElasticsearchRestTemplate(elasticsearchClient());
    }
}

根据两个字段进行统计:

--- 注入
 @Autowired
 private ElasticsearchRestTemplate restTemplate;
--- 方法
{
//构建查询条件
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
//第一个参数是别名 第二个参数要统计的字段名称
TermsAggregationBuilder agg1 = AggregationBuilders.terms("countArea").field("qy_area").size(10000);
TermsAggregationBuilder agg2 = AggregationBuilders.terms("countXueli").field("xueli").size(10000);
// qy_area是求和字段名称,num是结果别名
SumAggregationBuilder sb = AggregationBuilders.sum("qy_area").field("num");
// 通过qy_area字段分组统计总数
agg1.subAggregation(sb);
// 通过xueli字段分组统计总数
agg2.subAggregation(sb);
// 合并
agg1.subAggregation(agg2);
NativeSearchQuery build = new       NativeSearchQueryBuilder().withQuery(queryBuilder).addAggregation(agg1).build();
SearchHits<RegionalDirectionDoc> searchHits = restTemplate.search(build,RegionalDirectionDoc.class);
Aggregations aggregations1 = searchHits.getAggregations();
// 取出聚合结果
Terms terms = (Terms) aggregations1.asMap().get("countArea");
//记录统计结果
List<Map<String, Object>> mapList = new ArrayList<>();
for (Terms.Bucket bucket : terms.getBuckets())
{
    Map<String, Object> map = new HashMap<>(16);
    // 聚合字段列的值
    String keyAsString = bucket.getKeyAsString();
    // 聚合字段对应的数量
    long docCount = bucket.getDocCount();
    map.put("qy_area", keyAsString);
    map.put("number", docCount);
    //解析城市下学历统计
    Aggregations aggregations2 = bucket.getAggregations();
    Terms terms2 = (Terms) aggregations2.asMap().get("countXueli");
    List<Map<String, Object>> mapList2 = new ArrayList<>();
    for (Terms.Bucket bucket2 : terms2.getBuckets())
    {
        Map<String, Object> map2 = new HashMap<>(16);
        // 聚合字段列的值
        String keyAsString2 = bucket2.getKeyAsString();
        // 聚合字段对应的数量
        long docCount2 = bucket2.getDocCount();
        map2.put("xueli", keyAsString2);
        map2.put("number", docCount2);
        mapList2.add(map2);
    }
    map.put("xueliList", mapList2);
    mapList.add(map);
}
}

实体定义:

package cn.com.newcapec.entity;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

@Document(indexName = "regional_direction_entity")
public class RegionalDirectionDoc {
    /**
     * 唯一标识
     */
    @Id
    private String id;
    /**
     * 学历
     */
    @Field(type = FieldType.Keyword)
    private String xueli;
    /**
     * 区编号
     */
    @Field(type = FieldType.Keyword)
    private String code;
    /**
     * 困难生类别
     */
    @Field(type = FieldType.Keyword)
    private String kunnansheng_id;
    /**
     * 师范生类别
     */
    @Field(type = FieldType.Keyword)
    private String shifansheng_id;
    /**
     * 学生类别
     */
    @Field(type = FieldType.Keyword)
    private String xueshengliebie_id;
    /**
     * 学制
     */
    @Field(type = FieldType.Keyword)
    private String xuezhi;
    /**
     * 政治面貌
     */
    @Field(type = FieldType.Keyword)
    private String political;
    /**
     * 毕业
     */
    @Field(type = FieldType.Keyword)
    private String biye;
    /**
     * 班级
     */
    @Field(type = FieldType.Keyword)
    private String class_id;
    /**
     * 专业
     */
    @Field(type = FieldType.Keyword)
    private String professional_id;
    /**
     * 院系
     */
    @Field(type = FieldType.Keyword)
    private String department_id;
    /**
     * 毕业去向状态  11校本级通过
     */
    @Field(type = FieldType.Keyword)
    private String byqx_status;
    /**
     * 学校id
     */
    @Field(type = FieldType.Keyword)
    private String school_id;
    /**
     * 企业所在区
     */
    @Field(type = FieldType.Keyword)
    private String qy_area;
    /**
     * 所在省
     */
    @Field(type = FieldType.Keyword)
    private String shengyuan;


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getXueli() {
        return xueli;
    }

    public void setXueli(String xueli) {
        this.xueli = xueli;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getKunnansheng_id() {
        return kunnansheng_id;
    }

    public void setKunnansheng_id(String kunnansheng_id) {
        this.kunnansheng_id = kunnansheng_id;
    }

    public String getShifansheng_id() {
        return shifansheng_id;
    }

    public void setShifansheng_id(String shifansheng_id) {
        this.shifansheng_id = shifansheng_id;
    }

    public String getXueshengliebie_id() {
        return xueshengliebie_id;
    }

    public void setXueshengliebie_id(String xueshengliebie_id) {
        this.xueshengliebie_id = xueshengliebie_id;
    }

    public String getXuezhi() {
        return xuezhi;
    }

    public void setXuezhi(String xuezhi) {
        this.xuezhi = xuezhi;
    }

    public String getPolitical() {
        return political;
    }

    public void setPolitical(String political) {
        this.political = political;
    }

    public String getBiye() {
        return biye;
    }

    public void setBiye(String biye) {
        this.biye = biye;
    }

    public String getClass_id() {
        return class_id;
    }

    public void setClass_id(String class_id) {
        this.class_id = class_id;
    }

    public String getProfessional_id() {
        return professional_id;
    }

    public void setProfessional_id(String professional_id) {
        this.professional_id = professional_id;
    }

    public String getDepartment_id() {
        return department_id;
    }

    public void setDepartment_id(String department_id) {
        this.department_id = department_id;
    }

    public String getByqx_status() {
        return byqx_status;
    }

    public void setByqx_status(String byqx_status) {
        this.byqx_status = byqx_status;
    }

    public String getSchool_id() {
        return school_id;
    }

    public void setSchool_id(String school_id) {
        this.school_id = school_id;
    }

    public String getQy_area() {
        return qy_area;
    }

    public void setQy_area(String qy_area) {
        this.qy_area = qy_area;
    }

    public String getShengyuan() {
        return shengyuan;
    }

    public void setShengyuan(String shengyuan) {
        this.shengyuan = shengyuan;
    }
}

创建索引文件:

PUT regional_direction_entity
{
  "mappings": {
      "properties": {
        "biye": {
          "type": "keyword"
        },
        "byqx_status": {
          "type": "keyword"
        },
        "class_id": {
          "type": "keyword"
        },
        "code": {
          "type": "keyword"
        },
        "department_id": {
          "type": "keyword"
        },
        "id": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "kunnansheng_id": {
          "type": "keyword"
        },
        "political": {
          "type": "keyword"
        },
        "professional_id": {
          "type": "keyword"
        },
        "qy_area": {
          "type": "keyword"
        },
        "school_id": {
          "type": "keyword"
        },
        "shengyuan": {
          "type": "keyword"
        },
        "shifansheng_id": {
          "type": "keyword"
        },
        "type": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "xueli": {
          "type": "keyword"
        },
        "xueshengliebie_id": {
          "type": "keyword"
        },
        "xuezhi": {
          "type": "keyword"
        }
      }
    }
}

文章来源地址https://www.toymoban.com/news/detail-787210.html

到了这里,关于ElasticSearch分组统计查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ES】脚本截取字段分组查询统计

    有个需求为:统计一个月内每天的降雨量,时间格式为text类型,如:2022-02-22 08:09:09 需要提取出字符2022-02-22来分组,即截取字符串的前10位 ES查询语句如下: 参考文章 Es-脚本截取分组聚合_今日全糖加冰的博客-CSDN博客_es 脚本聚合

    2024年02月11日
    浏览(60)
  • MYSQL之查询按日期分组统计

    1.1、dayofyear、dayofmonth、dayofweek dayofyear(date) 函数返回日期位于所在年份的第几天,范围是1 ~ 366 dayofmonth(date) 函数返回日期位于所在月份的第几天,范围是1 ~ 31 dayofweek(date) 函数返回日期位于所在周的第几天,范围是1 ~ 7 查询语句 查询结果    需要注意的是,如果是 dayofmon

    2024年02月02日
    浏览(43)
  • Mysql的分组查询和统计计算

    1.聚合函数 聚合函数实现数据的统计计算,用于计算表中的数据,返回单个计算结果。聚合函数包括COUNT、SUM、AVG、MAX、MIN等函数,下面分别介绍。 (1)COUNT函数 COUNT函数用于计算组中满足条件的行数或总行数。 语法格式: COUNT ( { [ ALL | DISTINCT ] 表达式 } | * ) 其中,ALL表示

    2024年02月16日
    浏览(39)
  • 使用Elasticsearch进行分组聚合统计

    要使用Elasticsearch进行分组聚合统计,可以使用聚合(aggregation)功能。聚合操作允许您根据指定的条件对文档进行分组,并计算每个分组的聚合结果。 针对普通类型的字段,DSL构建语法: aggs: aggregations的别名,代表着分组 agg_name: 这个是自定义的名字,可以针对你自己

    2024年02月15日
    浏览(46)
  • ElasticSearch 分组统计,每组取最新数据

    ElasticSearch按任务id分组统计 查询方法: 任务ID一个,网站ID若干 求: 按网站ID分组,crawTotal最大,且时间为最新的一条数据。

    2024年02月10日
    浏览(48)
  • MySQL根据出生日期查询年龄,以及对年龄进行分组统计

    表stu数据如下 1. 根据出生日期查询年龄 返回结果: 函数DATE():提取日期或日期/时间表达式的日期部分; 函数CURDATE():返回当前的日期; 函数TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2):计算两个日期的时间差,unit是计算时间差的单位,可以是SECOND秒、MINUTE分钟、HOUR小时、DAY天

    2024年02月11日
    浏览(63)
  • elasticsearch中的聚合分组查询

    分组聚合及嵌套查询 聚合查询可以理解为SQL中的求和、求最大值、最小值以及求均值的需求 嵌套可以理解为es存值的某一个字段为对象属性的值做处理. Elasticsearch Java API分组与聚合结合 其中对字段field_one进行分组,分组的别名为fieldOne,取2^31-1组数据.如果不设置size,查询的结果

    2024年02月11日
    浏览(47)
  • Java Elasticsearch多条件分组聚合查询

    需求         在项目开发中,需要从elasticsearch中查询日志数据,先统计每一天的日志调用量,然后在每一天的分组聚合基础上,再分组聚合统计成功和失败的日志调用量。 代码

    2024年02月08日
    浏览(55)
  • 五、浅析[ElasticSearch]底层原理与分组聚合查询

    集群节点介绍 es配置文件夹中 客户端节点 当主节点和数据节点配置都设置为false的时候,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节

    2024年02月16日
    浏览(47)
  • mysql查询一周内的数据(起始日期为星期一)、根据一周不同星期进行分组统计

    其中YEARWEEK ( time, 1) 获取的是时间的年以及是该年内的第几周,而其中的1则代表以星期一为一周的第一天。 不加1的情况就是,获取的数据是以星期日为一周的第一天的,与我们的需求不符。 直接在YEARWEEK ( now(), 1) 加上-1即是减一周,也就是上周。 数字1则代表星期一,2代表

    2024年02月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包