Es elasticsearch 十七 Java api 实现聚合 几个聚合示例 sql 开启许可 新特效 java 实现es7 sql 功能

目录

Java api 实现聚合

依赖

简单聚合按照颜色分组获取每个卖出数量

聚合每个颜色卖出数量,及平均价格(每个分桶子聚合)

按照颜色分组 ,获取销售数量,avg min max sum

按照600区间价格范围分组,算出每个区间销售总额

每个季度销售总额

Sql新特性

简单sql

 聚合sql

启动方式

其他展示方式 csv tsv json yaml

翻译实现 translate sql 怎么转成rest 请求

混合使用

Java 实现 es7 sql功能

许可管理开启白金版试用或购买

引入依赖pom

Java 代码


Java api 实现聚合

依赖


import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

简单聚合按照颜色分组获取每个卖出数量

//private RestHighLevelClient client  = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://localhost:9200")));

@Test
public void jh1() throws IOException {
    SearchRequest searchRequest = new SearchRequest("tvs");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.size(0);
    searchSourceBuilder.query(QueryBuilders.matchAllQuery());
    TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("group_color").field("color");
    searchSourceBuilder.aggregation(termsAggregationBuilder);

    searchRequest.source(searchSourceBuilder);

    SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);

    Aggregations aggregations = response.getAggregations();
    Terms group_color = aggregations.get("group_color");
    List<?extends Terms.Bucket> buckets = group_color.getBuckets();
    for (Terms.Bucket bucKey : buckets){
        System.out.println(bucKey.getKeyAsString()+"  == "+ bucKey.getDocCount());
    }
}

获取关注 buckets 获取所有分桶 -=分组

聚合每个颜色卖出数量,及平均价格(每个分桶子聚合)

@Test
public void jh2() throws IOException {
    SearchRequest searchRequest = new SearchRequest("tvs");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.size(0);
    searchSourceBuilder.query(QueryBuilders.matchAllQuery());
    TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("group_color").field("color");

    //增加子聚合
    AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avg_price").field("price");
    termsAggregationBuilder.subAggregation(avgAggregationBuilder);

    searchSourceBuilder.aggregation(termsAggregationBuilder);

    searchRequest.source(searchSourceBuilder);

    SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);

    Aggregations aggregations = response.getAggregations();
    Terms group_color = aggregations.get("group_color");
    List<?extends Terms.Bucket> buckets = group_color.getBuckets();
    for (Terms.Bucket bucKey : buckets){

        //获取子聚合
        Aggregations aggregations9= bucKey.getAggregations();
        Avg avg_price = aggregations9.get("avg_price");

        System.out.println(bucKey.getKeyAsString()+"  == "+ bucKey.getDocCount() +"  ;  avg = "+avg_price.getValue());
    }
}

查询增加子聚合  返回 通过子聚合获取值

按照颜色分组 ,获取销售数量,avg min max sum

@Test
public void jh3() throws IOException {
    SearchRequest searchRequest = new SearchRequest("tvs");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.size(0);
    searchSourceBuilder.query(QueryBuilders.matchAllQuery());
    TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("group_color").field("color");

    //增加子聚合
    AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avg_price").field("price");
    termsAggregationBuilder.subAggregation(avgAggregationBuilder);

    SumAggregationBuilder sumAggregationBuilder = AggregationBuilders.sum("sum_price").field("price");
    termsAggregationBuilder.subAggregation(sumAggregationBuilder);

    MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("max_price").field("price");
    termsAggregationBuilder.subAggregation(maxAggregationBuilder);

    MinAggregationBuilder minAggregationBuilder = AggregationBuilders.min("min_price").field("price");
    termsAggregationBuilder.subAggregation(minAggregationBuilder);

    searchSourceBuilder.aggregation(termsAggregationBuilder);
    searchRequest.source(searchSourceBuilder);

    SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);

    Aggregations aggregations = response.getAggregations();
    Terms group_color = aggregations.get("group_color");
    List<?extends Terms.Bucket> buckets = group_color.getBuckets();
    for (Terms.Bucket bucKey : buckets){

        //获取子聚合
        Aggregations aggregations9= bucKey.getAggregations();
        Avg avg_price = aggregations9.get("avg_price");
        Sum sum_price = aggregations9.get("sum_price");
        Min min_price = aggregations9.get("min_price");
        Max max_price = aggregations9.get("max_price");

        System.out.println(bucKey.getKeyAsString()+"  == "+ bucKey.getDocCount() +"  ;  avg = "+avg_price.getValue()
                +"  ;  sum_price = "+sum_price.getValue()
                +"  ;  min_price = "+min_price.getValue()
                +"  ;  max_price = "+max_price.getValue());
    }
}

按照600区间价格范围分组,算出每个区间销售总额

@Test
public void jh4() throws IOException {
    SearchRequest searchRequest = new SearchRequest("tvs");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.size(0);
    searchSourceBuilder.query(QueryBuilders.matchAllQuery());
    HistogramAggregationBuilder termsAggregationBuilder =  AggregationBuilders.histogram("group_histogram").field("price").interval(600);

    //增加子聚合
    SumAggregationBuilder sumAggregationBuilder = AggregationBuilders.sum("sum_price").field("price");
    termsAggregationBuilder.subAggregation(sumAggregationBuilder);

    searchSourceBuilder.aggregation(termsAggregationBuilder);
    searchRequest.source(searchSourceBuilder);

    SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);

    Aggregations aggregations = response.getAggregations();
    Histogram group_color = aggregations.get("group_histogram");
    List<?extends Histogram.Bucket> buckets = group_color.getBuckets();
    for (Histogram.Bucket bucKey : buckets){
        //获取子聚合
        Aggregations aggregations9= bucKey.getAggregations();
        Sum sum_price = aggregations9.get("sum_price");

        System.out.println(bucKey.getKeyAsString()+"  == "+ bucKey.getDocCount()
                +"  ;  sum_price = "+sum_price.getValue());
    }
}

每个季度销售总额

@Test
public void jh5() throws IOException {
    SearchRequest searchRequest = new SearchRequest("tvs");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.size(0);
    searchSourceBuilder.query(QueryBuilders.matchAllQuery());

    DateHistogramAggregationBuilder termsAggregationBuilder =AggregationBuilders.dateHistogram("group_histogram")
            .field("sold_date").format("yyyy-MM-dd").minDocCount(0).calendarInterval(DateHistogramInterval.QUARTER)
            .extendedBounds(new ExtendedBounds("2019-01-01","2023-01-01"));

    //增加子聚合
    SumAggregationBuilder sumAggregationBuilder = AggregationBuilders.sum("sum_price").field("price");
    termsAggregationBuilder.subAggregation(sumAggregationBuilder);

    searchSourceBuilder.aggregation(termsAggregationBuilder);
    searchRequest.source(searchSourceBuilder);

    SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);

    Aggregations aggregations = response.getAggregations();
    ParsedDateHistogram group_color = aggregations.get("group_histogram");

    List<?extends Histogram.Bucket> buckets = group_color.getBuckets();
    for (Histogram.Bucket bucKey : buckets){
        //获取子聚合
        Aggregations aggregations9= bucKey.getAggregations();
        Sum sum_price = aggregations9.get("sum_price");

        System.out.println(bucKey.getKeyAsString()+"  == "+ bucKey.getDocCount()
                +"  ;  sum_price = "+sum_price.getValue());
    }
}

Sql新特性

简单sql

post /_sql?format=txt
{
  "query":" select * from tvs "
}

 聚合sql

post /_sql?format=txt
{
  "query":" select color,avg(price),sum(price) from tvs group by color "
}

启动方式

elasticsearch-sql-cli.bat

 

其他展示方式 csv tsv json yaml

post /_sql?format=csv
{
  "query":" select * from tvs "
}

post /_sql?format=tsv
{
  "query":" select * from tvs "
}

post /_sql?format=json
{
  "query":" select * from tvs "
}

post /_sql?format=yaml
{
  "query":" select * from tvs "
}

翻译实现 translate sql 怎么转成rest 请求


post /_sql/translate
{
  "query":" select * from tvs "
}

混合使用


post /_sql?format=txt
{
  "query":" select * from tvs ",
  "filter":{
    "range": {
      "price": {
        "gte": 1110,
        "lte": 2220
      }
    }
  }
}


     brand     |     color     |     price     |       sold_date        
---------------+---------------+---------------+------------------------
天虹2            |红色2            |2000           |2019-12-06T00:00:00.000Z
天虹             |红色             |1800           |2022-12-06T00:00:00.000Z

Java 实现 es7 sql功能

许可管理开启白金版试用或购买

引入依赖pom


    <dependency>
        <groupId>org.elasticsearch.plugin</groupId>
        <artifactId>x-pack-sql-jdbc</artifactId>
        <version>7.3.0</version>
    </dependency>

</dependencies>
<repositories>
    <repository>
        <id>elastic.co</id>
        <url>https://artifacts.elastic.co/maven</url>
    </repository>
</repositories>

Java 代码

package com.esbase.fintech.ais;

import java.sql.*;

public class TestJdbc {

    public static void main(String[] args) throws SQLException {
        //链接
       Connection connection =  DriverManager.getConnection("jdbc:es://http://localhost:9200");
        //创建 statement
        Statement statement = connection.createStatement();
        //执行sql
        ResultSet resultSet = statement.executeQuery("select * from tvs");
        //获取结果
        while (resultSet.next()){
            System.out.println(resultSet.getString(1));
            System.out.println(resultSet.getString(2));
            System.out.println(resultSet.getString(3));
            System.out.println(resultSet.getString(4));
            System.out.println("==========");
        }

    }
}

ok

持续更新

<think>好的,我现在需要帮助用户了解Elasticsearch的基本语法。首先,我得回顾一下用户提供的引用内容,看看有哪些相关信息可以用上。用户提到了几个引用,其中引用[1]比较了Elasticsearch和MySQL的概念,引用[2]提到基础语法和搜索功能,引用[4]强调语法教程和与MySQL的对比,引用[5]给出了一个桶聚合的例子。 用户的问题是关于Elasticsearch的基本语法教程,所以我要从基础操作开始,比如索引管理、文档操作、查询语句等。根据引用[4],用户可能更喜欢直接的语法示例,而不是原理性的解释。同时,用户提供的引用中有提到与MySQL的类比,所以用这种对比的方式可能更容易让用户理解。 首先,我需要整理Elasticsearch的核心操作,对应到MySQL的概念。比如索引对应数据库,类型对应表(虽然ES7之后类型逐渐被弃用),文档对应行。这部分在引用[1]中有说明,可以引用。 接下来,文档的CRUD操作。创建文档可以用PUT或POST,更用POST,删除用DELETE。需要给出具体的REST API示例,比如创建索引、插入文档、查询文档等。这些在引用[4]和引用[5]中可能有例子,比如桶聚合示例,但用户需要的是基础语法,所以先集中在简单的操作上。 然后,查询部分。用户提到Elasticsearch的全文搜索能力,包括布尔查询、短语查询等,引用[2]提到这些,所以需要包括match、term、bool查询的例子。同时,可能还需要分页和排序,这些在SQL中也有对应的LIMIT和ORDER BY,可以对比说明。 聚合分析部分,引用[5]给出了桶聚合的例子,这里需要解释聚合的基本语法,比如metrics和bucket聚合,可能用sum、avg、terms等。 最后,比较ES和MySQL的语法差异,帮助用户迁移或理解。比如SELECT对应GET,WHERE对应query,GROUP BY对应aggs等。这部分在引用[4]中强调,所以需要详细对比。 需要注意,用户提供的引用中有几个链接,比如引用[3]是官网的keyword类型文档,可能涉及字段类型,但用户的问题是关于基础语法,所以可能不需要深入这点,除非在示例中提到字段类型时引用。 现在需要检查是否有遗漏的部分,比如索引的设置、映射(mapping)的定义,或者分词器的使用?用户可能作为初学者,需要知道如何创建索引和定义字段类型,比如在创建索引时指定映射,这可能涉及到引用[3]中的内容,比如keyword类型。因此,在索引管理部分,可能需要包含创建索引时定义映射的例子,并引用[3]来说明字段类型的重要性。 另外,用户可能对REST API的格式不太熟悉,所以需要给出具体的HTTP方法和URI,以及请求体的JSON结构。例如,创建索引的PUT请求,插入文档的POST请求等。 在组织内容时,按照从基础到高级的顺序,先索引和文档操作,再查询,最后聚合。每个部分都给出ES的语法和对应的MySQL语句,帮助用户对比理解。同时,在适当的地方添加引用标记,比如在类比概念时引用[1],在查询语法时引用[2]和[4],在聚合时引用[5]。 最后,生成相关问题,可能涉及性能优化、高级查询、实际应用场景等,基于用户之前的示例问题结构。 现在需要确保所有示例语法正确,使用正确的LaTeX格式,行内公式用$...$,独立公式单独成段用$$...$$,但可能在这个回答中公式较少,更多的是代码块。但根据系统指令,数学表达式如变量等需要用LaTeX,比如提到字段名时用$field$,不过可能这里更多是代码示例,而非数学公式。需要检查是否有需要LaTeX的地方,比如可能涉及到的算术表达式,比如聚合中的sum,可以用$sum$,但可能在代码块中更合适。 最后,确保回答结构清晰,分点说明,使用代码块展示示例,并在引用处添加标记。同时,生成的相关问题要围绕Elasticsearch语法展开,比如如何优化查询、如何进行复杂聚合、与MySQL的其他区别等。</think>以下是与MySQL对比的Elasticsearch基础语法教程,包含核心操作和代码示例: ### 一、核心概念对比 | MySQL | Elasticsearch | 关系说明 | |--------------|------------------|---------------------------------| | Database | Index | 数据存储容器,如`products`索引[^1] | | Table | Type (7.x已废弃) | 数据分类方式,现用`_doc`默认类型 | | Row | Document | 单条数据记录,JSON格式存储 | | Column | Field | 数据字段,如`price` | | Schema | Mapping | 字段类型定义规则 | | SQL | Query DSL | 查询语言 | ### 二、文档CRUD操作 #### 1. 创建索引(类比建库) ```json PUT /products { "mappings": { "properties": { "name": { "type": "text" }, "price": { "type": "double" }, "tags": { "type": "keyword" } // keyword类型适合精确匹配[^3] } } } ``` #### 2. 插入文档(类比INSERT) ```json POST /products/_doc/1 // 指定ID=1 { "name": "无线蓝牙耳机", "price": 299.0, "tags": ["数码", "促销"] } ``` #### 3. 查询文档(类比SELECT) ```json GET /products/_doc/1 ``` #### 4.文档(类比UPDATE) ```json POST /products/_update/1 { "doc": { "price": 259.0 // 修改价格字段 } } ``` #### 5. 删除文档(类比DELETE) ```json DELETE /products/_doc/1 ``` ### 三、查询语法 #### 1. 全文搜索(MATCH查询) ```json GET /products/_search { "query": { "match": { "name": "降噪耳机" // 自动分词查询[^2] } }, "from": 0, // 分页起始 "size": 10, // 每页数量 "sort": [{ "price": "desc" }] // 排序 } ``` #### 2. 精确查询(TERM查询) ```json { "query": { "term": { "tags": "促销" // 精确匹配keyword字段 } } } ``` #### 3. 复合查询(BOOL查询) ```json { "query": { "bool": { "must": [{ "match": { "name": "耳机" }}], "filter": [{ "range": { "price": { "lte": 300 }}}] } } } ``` ### 四、聚合分析 #### 1. 指标聚合(类比统计函数) ```json GET /products/_search { "size": 0, "aggs": { "avg_price": { "avg": { "field": "price" } } // 计算平均价格 } } ``` #### 2. 分桶聚合(类比GROUP BY) ```json { "aggs": { "tag_groups": { "terms": { "field": "tags" }, // 按标签分组 "aggs": { "total_sales": { "sum": { "field": "sales" } } // 每组销售额求和[^5] } } } } ``` ### 五、常用语法对照表 | MySQL语法 | ES Query DSL | |---------------------------|---------------------------------------| | `SELECT * FROM products` | `GET /products/_search` | | `WHERE price > 100` | `"range": { "price": { "gt": 100 }}` | | `ORDER BY price DESC` | `"sort": [{ "price": "desc" }]` | | `LIMIT 10 OFFSET 5` | `"from": 5, "size": 10` | | `GROUP BY category` | `"terms": { "field": "category" }` |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值