Range query
Returns documents that contain terms within a provided range.
Example request
The following search returns documents where the age field contains a term between 10 and 20.
resp = client.search(
query={
"range": {
"age": {
"gte": 10,
"lte": 20,
"boost": 2
}
}
},
)
print(resp) response = client.search(
body: {
query: {
range: {
age: {
gte: 10,
lte: 20,
boost: 2
}
}
}
}
)
puts response res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"range": {
"age": {
"gte": 10,
"lte": 20,
"boost": 2.0
}
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err) const response = await client.search({
query: {
range: {
age: {
gte: 10,
lte: 20,
boost: 2,
},
},
},
});
console.log(response); GET /_search
{
"query": {
"range": {
"age": {
"gte": 10,
"lte": 20,
"boost": 2.0
}
}
}
} Top-level parameters for range
-
<field> -
(Required, object) Field you wish to search.
Parameters for <field>
-
gt - (Optional) Greater than.
-
gte - (Optional) Greater than or equal to.
-
lt - (Optional) Less than.
-
lte - (Optional) Less than or equal to.
-
format -
(Optional, string) Date format used to convert
datevalues in the query.By default, Elasticsearch uses the date
formatprovided in the<field>'s mapping. This value overrides that mapping format.For valid syntax, see
format.If a format or date value is incomplete, the range query replaces any missing components with default values. See Missing date components.
-
relation -
(Optional, string) Indicates how the range query matches values for
rangefields. Valid values are:-
INTERSECTS(Default) - Matches documents with a range field value that intersects the query’s range.
-
CONTAINS - Matches documents with a range field value that entirely contains the query’s range.
-
WITHIN - Matches documents with a range field value entirely within the query’s range.
-
-
time_zone -
(Optional, string) Coordinated Universal Time (UTC) offset or IANA time zone used to convert
datevalues in the query to UTC.Valid values are ISO 8601 UTC offsets, such as
+01:00or -08:00, and IANA time zone IDs, such asAmerica/Los_Angeles.For an example query using the
time_zoneparameter, see Time zone inrangequeries.The
time_zoneparameter does not affect the date math value ofnow.nowis always the current system time in UTC.However, the
time_zoneparameter does convert dates calculated usingnowand date math rounding. For example, thetime_zoneparameter will convert a value ofnow/d. -
boost -
(Optional, float) Floating point number used to decrease or increase the relevance scores of a query. Defaults to
1.0.You can use the
boostparameter to adjust relevance scores for searches containing two or more queries.Boost values are relative to the default value of
1.0. A boost value between0and1.0decreases the relevance score. A value greater than1.0increases the relevance score.
Notes
Using the range query with text and keyword fields
Range queries on text or keyword fields will not be executed if search.allow_expensive_queries is set to false.
Using the range query with date fields
When the <field> parameter is a date field data type, you can use date math with the following parameters:
-
gt -
gte -
lt -
lte
For example, the following search returns documents where the timestamp field contains a date between today and yesterday.
resp = client.search(
query={
"range": {
"timestamp": {
"gte": "now-1d/d",
"lte": "now/d"
}
}
},
)
print(resp) response = client.search(
body: {
query: {
range: {
timestamp: {
gte: 'now-1d/d',
lte: 'now/d'
}
}
}
}
)
puts response const response = await client.search({
query: {
range: {
timestamp: {
gte: "now-1d/d",
lte: "now/d",
},
},
},
});
console.log(response); GET /_search
{
"query": {
"range": {
"timestamp": {
"gte": "now-1d/d",
"lte": "now/d"
}
}
}
} Missing date components
For range queries and date range aggregations, Elasticsearch replaces missing date components with the following values. Missing year components are not replaced.
MONTH_OF_YEAR: 01 DAY_OF_MONTH: 01 HOUR_OF_DAY: 23 MINUTE_OF_HOUR: 59 SECOND_OF_MINUTE: 59 NANO_OF_SECOND: 999_999_999
For example, if the format is yyyy-MM, Elasticsearch converts a gt value of 2099-12 to 2099-12-01T23:59:59.999_999_999Z. This date uses the provided year (2099) and month (12) but uses the default day (01), hour (23), minute (59), second (59), and nanosecond (999_999_999).
Numeric date range value
When no date format is specified and the range query is targeting a date field, numeric values are interpreted representing milliseconds-since-the-epoch. If you want the value to represent a year, e.g. 2020, you need to pass it as a String value (e.g. "2020") that will be parsed according to the default format or the set format.
Date math and rounding
Elasticsearch rounds date math values in parameters as follows:
-
gt -
Rounds up to the first millisecond not covered by the rounded date.
For example,
2014-11-18||/Mrounds up to2014-12-01T00:00:00.000, excluding the entire month of November. -
gte -
Rounds down to the first millisecond.
For example,
2014-11-18||/Mrounds down to2014-11-01T00:00:00.000, including the entire month. -
lt -
Rounds down to the last millisecond before the rounded value.
For example,
2014-11-18||/Mrounds down to2014-10-31T23:59:59.999, excluding the entire month of November. -
lte -
Rounds up to the latest millisecond in the rounding interval.
For example,
2014-11-18||/Mrounds up to2014-11-30T23:59:59.999, including the entire month.
Example query using time_zone parameter
You can use the time_zone parameter to convert date values to UTC using a UTC offset. For example:
$params = [
'body' => [
'query' => [
'range' => [
'timestamp' => [
'time_zone' => '+01:00',
'gte' => '2020-01-01T00:00:00',
'lte' => 'now',
],
],
],
],
];
$response = $client->search($params); resp = client.search(
query={
"range": {
"timestamp": {
"time_zone": "+01:00",
"gte": "2020-01-01T00:00:00",
"lte": "now"
}
}
},
)
print(resp) response = client.search(
body: {
query: {
range: {
timestamp: {
time_zone: '+01:00',
gte: '2020-01-01T00:00:00',
lte: 'now'
}
}
}
}
)
puts response res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"range": {
"timestamp": {
"time_zone": "+01:00",
"gte": "2020-01-01T00:00:00",
"lte": "now"
}
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err) const response = await client.search({
query: {
range: {
timestamp: {
time_zone: "+01:00",
gte: "2020-01-01T00:00:00",
lte: "now",
},
},
},
});
console.log(response); GET /_search
{
"query": {
"range": {
"timestamp": {
"time_zone": "+01:00",
"gte": "2020-01-01T00:00:00",
"lte": "now"
}
}
}
} | Indicates that | |
| With a UTC offset of | |
| The |
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/query-dsl-range-query.html