Range 查询(范围查询)

通过某一个包含项的字段匹配文档。 Lucene查询的类型取决于字段类型,对于string (字符串字段),查询是个TermRangeQuery,而对于number / date字段,查询是一个 NumericRangeQuery 。下面这个示例返回age1020之间的所有文档。

GET _search
{
    "range" : {
        "age" : {
            "gte" : 10,
            "lte" : 20,
            "boost" : 2.0
        }
    }
}

范围查询接受以下参数:

参数

说明

gte

大于或等于

gt

大于

lte

小于或等于

lt

小于

boost

设置查询的boost值,默认为1.0

date (日期)字段的范围查询

对类型为date(日期)的字段运行range (范围)查询时,可以使用Date Math部分指定范围:

GET _search
{
    "query": {
        "range" : {
            "date" : {
                "gte" : "now-1d/d",
                "lt" :  "now/d"
            }
        }
    }
}

Date math 和 rounding (四舍五入)

当使用date math将日期round(四舍五入)到最近的日,月,小时等时,舍入日期取决于范围的结束是包含还是排除。

向上舍入移动到舍入范围的最后一个毫秒,并向下舍入到舍入范围的第一个毫秒。

例如:

参数

说明

gt

大于向上舍入的日期:2014-11-18 || / M变成2014-11-30T23:59:59.999,即不包括整个月。

gte

大于或等于向下舍入的日期:2014-11-18 || / M即成为2014-11-01,即包括整个月。

lt

小于向下舍入的日期:2014-11-18 || / M成为2014-11-01,即不包括整个月。

lte

小于或等于向上舍入的日期:2014-11-18 || / M成为2014-11-30T23:59:59.999,即包括整个月。

Range (范围)查询中的日期格式化

格式化的日期将使用指定的默认format(格式)解析date(日期)字段,但可以通过将格式参数传递到range (范围)查询来覆盖默认格式:

GET _search
{
    "query": {
        "range" : {
            "born" : {
                "gte": "01/01/2012",
                "lte": "2013",
                "format": "dd/MM/yyyy||yyyy"
            }
        }
    }
}

Range (范围)查询中的时区

通过在日期值本身指定时区(如果format允许),日期可以从另一个时区转换为UTC,或者可以将其指定为time_zone参数:

GET _search
{
    "query": {
        "range" : {
            "timestamp" : {
                "gte": "2015-01-01 00:00:00", ①
                "lte": "now", ②
                "time_zone": "+01:00"
            }
        }
    }
}

①此日期将转换为2014-12-31T23:00:00 UTC

now不受time_zone参数的影响(日期必须存储为UTC)。

Last updated