elasticsearch range中基础查询和聚合(aggs)查询

摘要1:https://www.jianshu.com/p/81a2c3032079

摘要2:ES 使用range时间查询:https://blog.csdn.net/yrx0619/article/details/90203776

Lucene查询的类型取决于字段类型,对于字符串字段,查询是TermRangeQuery,对于数字/日期字段,查询是NumericRangeQuery

基础查询Query

执行前提条件 POST请求 _search
必须在query请求体中

  • FIELD 你的字段名
  • gte 大于等于
  • gt 大于
  • lte小于等于
  •  lt 小于
  "query": {
    "range": {
      "FIELD": {
        "gte": 10,
        "lte": 20
      }
    }
  }

date类型格式化

"format": "field||yyyy"来格式化type为date型的字段

  "query": {
    "range": {
      "FIELD": {
        "gte": "2020-01-01",
        "lte": "2020-12-30",
         "format":"created_time||yyyy-MM-dd" 
      }
    }
  }

range与bool查询

可以完美嵌入must、 not_must中作为指定条件

"query": {
    "bool": {
        "must": [{
            "range": {
                "FIELD": {
                    "gte": 1,   # 注意01写法会引发语法异常
                    "lte": 20
                }
            }
        }]
    }
}

可以与match、term等灵活组合

{
    "query": {
        "bool": {
            "must": [{
                    "match": {
                        "FIELD": "TEXT"
                    }
                },
                {
                    "term": {
                        "FIELD": {
                            "value": ""
                        }
                    }
                },
                {
                    "range": {
                        "delivery_amount": {
                            "gte": 1,
                            "lte": 20
                        }
                    }
                }
            ]
        }
    }
}

range与filter查询

使用filter过滤器的大部分原因是希望es进行缓存以及不计算评分

{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "FIELD": {
            "gte": 10,
            "lte": 20
          }
        }
      }
    }
  }
}

range聚合查询

Elasticsearch提供了多种聚合方式,能帮助用户快速的进行信息统计与分类,本篇主要讲解下如何使用Range区间聚合。
最简单的例子,想要统计一个班级考试60分以下、60到80分、80到100分,在ES中只要一个命令就可以轻松统计....
更多资料参考:Elasticsearch文档翻译
注意:to不带有包含的意思 而from是有

1.简单应用

{
    "aggs":{
        "grade_ranges":{
            "range":{
                "field":"grade",
                "ranges":[
                    {"to":60},
                    {"from":60,"to":80},
                    {"from":80}]
                }
            }
        }
}

得到如下结果:
{
    "aggregations":{
        "price_ranges":{
            "buckets":[
                {
                    "to":60,
                    "doc_count":2
                },
                {
                    "from":60,
                    "to":80,
                    "doc_count":32
                },
                {
                    "from":80,
                    "doc_count":14
                }
            ]
        }
    }
}

2.返回聚合结果一个特定的名字

可以通过设置keyed:true,使每个区间都返回一个特定的名字(默认会按照区间命名)。

{
    "aggs":{
        "price_ranges":{
            "range":{
                "field":"price",
                "keyed":true,
                "ranges":[
                    {"to":50},
                    {"from":50,"to":100},
                    {"from":100}
                ]
            }
        }
    }
}

# 得到如下结果:
{
    "aggregations":{
        "price_ranges":{
            "buckets":{
                "*-50.0":{
                    "to":50,
                    "doc_count":2
                },
                "50.0-100.0":{
                    "from":50,
                    "to":100,
                    "doc_count":4
                },
                "100.0-*":{
                    "from":100,
                    "doc_count":4
                }
            }
        }
    }
}

也可以指定区间的名字:

{
    "aggs":{
        "price_ranges":{
            "range":{
                "field":"price",
                "keyed":true,
                "ranges":[
                    {"key":"cheap","to":50},
                    {"key":"average","from":50,"to":100},
                    {"key":"expensive","from":100}
                ]
            }
        }
    }
}

3.使用脚本

与其他的聚合类似,Range聚合支持脚本的使用:

{
    "aggs":{
        "price_ranges":{
            "range":{
                "script":"doc['price'].value",
                "ranges":[
                    {"to":50},
                    {"from":50,"to":100},
                    {"from":100}
                ]
            }
        }
    }
}

range聚合嵌套查询

通常在区间聚合中,都会嵌套子聚合,比如我们在每个区间中做统计stats聚合:

{
    "aggs":{
        "price_ranges":{
            "range":{
                "field":"price",
                "ranges":[
                    {"to":50},
                    {"from":50,"to":100},
                    {"from":100}
                ]},
                "aggs":{
                    "price_stats":{
                        "stats":{
                            "field":"price"
                        }
                    }
                }
            }
        }
    }

# 得到的结果如下:
{
    "aggregations":{
        "price_ranges":{
            "buckets":[
                {
                    "to":50,
                    "doc_count":2,
                    "price_stats":{
                        "count":2,
                        "min":20,
                        "max":47,
                        "avg":33.5,
                        "sum":67
                    }
                },
                {
                    "from":50,
                    "to":100,
                    "doc_count":4,
                    "price_stats":{
                        "count":4,
                        "min":60,
                        "max":98,
                        "avg":82.5,
                        "sum":330
                    }
                },
                {
                    "from":100,
                    "doc_count":4,
                    "price_stats":{
                        "count":4,
                        "min":134,
                        "max":367,
                        "avg":216,
                        "sum":864
                    }
                }
            ]
        }
    }
}

如果不指定聚合的字段,那么默认会按照Range聚合的字段来做统计:

{
    "aggs":{
        "price_ranges":{
            "range":{
                "field":"price",
                "ranges":[
                    {"to":50},
                    {"from":50,"to":100},
                    {"from":100}
                ]
            },
            "aggs":{
                "price_stats":{
                    "stats":{}
                }
            }
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Elasticsearch,可以使用聚合(Aggregations)来按照某个字段进行分组,以实现数据分析或统计的目的。具体来说,可以使用Elasticsearch提供的各种聚合类型,例如terms、date_histogram、range等,通过指定要聚合的字段,来进行聚合查询。 例如,假设有一个名为“products”的索引,其包含了商品名称(name)、商品分类(category)和商品销量(sales)等字段,可以使用如下的聚合查询语句,来按照商品分类(category)字段进行分组,并统计每个分类下的销量总和: ``` GET /products/_search { "size": 0, "aggs": { "group_by_category": { "terms": { "field": "category" }, "aggs": { "total_sales": { "sum": { "field": "sales" } } } } } } ``` 这个查询语句,“size”参数指定了返回结果的文档数量(这里设置为0,表示只返回聚合结果),而“aggs”参数用来指定聚合操作。在这个聚合查询,“group_by_category”是聚合操作的名称,而“terms”表示按照某个字段进行分组,这里指定为“category”字段。在“group_by_category”内部,使用了另外一个聚合操作“total_sales”,来计算每个分类下的销量总和。 ### 回答2: 在Elasticsearch,可以使用聚合(Aggregation)来根据某个字段进行聚合查询聚合查询可以帮助我们对数据进行分析和统计,以便了解数据的特征和趋势。 首先,我们需要使用聚合查询的API来实现按照某个字段进行聚合查询。在查询,我们可以指定要聚合的字段,并选择不同的聚合类型(如求和、平均值、最大值、最小值等)。例如,假设我们有一个名为"age"的字段,我们可以通过以下方式进行聚合查询: ``` GET /index/_search { "size": 0, "aggs": { "age_agg": { "terms": { "field": "age", "size": 10 } } } } ``` 上述查询将按照"age"字段进行聚合,并返回前10个聚合桶(bucket),每个桶包含相同age值的文档数量。这样,我们可以通过聚合查询了解不同age值的文档分布情况。 除了terms聚合Elasticsearch还提供了许多其他类型的聚合,如range、date_histogram、histogram等,可以根据不同的需求选择合适的聚合类型。 总之,使用Elasticsearch聚合查询功能,我们可以方便地按照某个字段进行聚合,以便实现数据分析和统计的需求。 ### 回答3: es是Elasticsearch的简称,是一种开源的分布式搜索和分析引擎。它可以通过聚合查询来按照某个字段进行数据的聚合分析。 在进行聚合查询时,首先需要创建一个查询请求。查询请求包含了一些基本信息,如索引名称、查询条件等。然后,通过指定聚合字段,即按照哪个字段进行聚合,来定义聚合查询的具体内容。 在进行聚合查询时,常用的聚合函数包括sum、avg、min、max、count等。这些聚合函数可以对指定的字段进行统计和计算。 例如,假设我们有一个存储了用户信息的索引,其包含了用户的姓名、年龄、性别等字段。我们想要按照性别进行统计,得到每个性别的用户数量。则可以使用terms聚合来实现。 具体的聚合查询请求如下所示: { "size": 0, "aggs": { "gender_count": { "terms": { "field": "gender.keyword" } } } } 以上查询请求,size设置为0表示不返回具体的检索结果,只返回聚合结果。aggs表示进行聚合操作,gender_count是聚合的名称,terms表示使用terms函数进行聚合,field字段指定了要进行聚合的字段。 通过执行以上聚合查询请求,可以得到按照性别聚合统计的结果,例如: { "aggregations": { "gender_count": { "buckets": [ { "key": "男", "doc_count": 100 }, { "key": "女", "doc_count": 80 } ] } } } 以上结果表示,按照性别进行聚合统计后,男性用户有100个,女性用户有80个。 总之,通过使用Elasticsearch聚合查询功能,可以按照指定的字段对数据进行聚合分析,从而得到有关字段的统计结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值