摘要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":{}
}
}
}
}
}