Range Query
Range查询可以查询一个范围内的文档。它可以用来查询数值型字段、日期型字段、字符串型字段等等。
我们可以使用range查询来查询符合一定范围内的数据,如查询某个价格区间、某个时间段内的数据等等。
查询语法示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
GET /{index}/_search { "query" : { "range" : { "{field}" : { "gte" : "{lowerBound}" , "lte" : "{upperBound}" , "gt" : "{lowerBound}" , "lt" : "{upperBound}" , "boost" : {boostValue}, "format" : "{dateFormat}" , "time_zone" : "{timezone}" } } } } |
其中,{field}
表示要查询的字段,{lowerBound}
和{upperBound}
表示要查询的范围,gte
表示大于等于,lte
表示小于等于,gt
表示大于,lt
表示小于。
boost
是用来提高查询的重要性,可以设置一个浮点数。
format
是用来设置日期格式,如果要查询日期类型的字段,可以设置这个参数。
time_zone
是用来设置时区。
查询数字范围
1
2
3
4
5
6
7
8
9
10
11
|
GET /products/_search { "query" : { "range" : { "price" : { "gte" : 100 , "lte" : 200 } } } } |
查询日期范围
1
2
3
4
5
6
7
8
9
10
11
12
|
GET /logs/_search { "query" : { "range" : { "timestamp" : { "gte" : "2022-01-01" , "lte" : "2022-01-31" , "format" : "yyyy-MM-dd" } } } } |
查询字符串范围
针对字符串类型的字段,使用range
查询需要注意以下几点:
-
字符串类型的字段,必须使用
keyword
类型,才能使用range
查询。 - 在查询字符串的区间时,需要使用字符串类型的区间边界值。
下面是一个使用range
查询查询字符串区间的示例:
查询age
字段值在"20"
到"30"
之间(包括边界值)的文档:
1
2
3
4
5
6
7
8
9
10
11
|
GET /user_info/_search { "query" : { "range" : { "age" : { "gte" : "20" , "lte" : "30" } } } } |
注意
即使字段类型为字符串,如果该字段的值可以按照一定的顺序进行比较,那么就可以进行范围查询。比如日期、数字、版本号等等。但是对于不可比较的字符串值,如名称、描述等等,就无法进行范围查询了。
JavaAPI查询示例
1
2
3
4
5
6
7
8
|
SearchRequest searchRequest = new SearchRequest( "user_info" ); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery( "age" ) .gte( "20" ) .lte( "30" ); searchSourceBuilder.query(rangeQueryBuilder); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); |
总结
- Range查询可以用于数值型、日期型和字符串型的字段。
- 对于字符串型的字段,其值需要具备可排序的特性,以便进行范围查询。
- 如果字符串的格式无法排序,需要将其转换为可以排序的格式,如时间戳。
- 范围查询可以指定包含边界或者不包含边界,以及包含哪些边界。
- 范围查询可以使用GTE、GT、LTE和LT参数来指定范围的边界。
- 范围查询可以使用日期时间格式或者UNIX时间戳来查询日期型字段。
以上就是Elasticsearch查询Range Query语法示例的详细内容,更多关于Elasticsearch查询Range Query的资料请关注服务器之家其它相关文章!
原文链接:https://juejin.cn/post/7224858596298653754