Elasticsearch Range

1. Range Query

将文档与具有一定范围内字词的字段进行匹配。 Lucene查询的类型取决于字段类型,对于字符串字段,TermRangeQuery,对于数字/日期字段,查询是NumericRangeQuery

基础查询Query下

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

执行前提条件 POST请求 _search
必须在query请求体中
FIELD 你的字段名
gte 大于等于gt 大于
lte小于等于 lt 小于

在rang请求体中还可以加入
"format": "dd/MM/yyyy||yyyy"来格式化type为date型的字段

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

2.rang for 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
                        }
                    }
                }
            ]
        }
    }
}

3.rang for filter

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

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

4. rang for aggs

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

聚合例子
按照前言中的例子,可以执行下面的命令:

{
    "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
                }
            ]
        }
    }
}

复杂点的例子,指定每个区间的名字
可以通过设置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}
                ]
            }
        }
    }
}

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

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

聚合嵌套 rang

通常在区间聚合中,都会嵌套子聚合,比如我们在每个区间中做统计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":{}
                }
            }
        }
    }
}

你可能感兴趣的:(Elasticsearch Range)