好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Elasticsearch查询Range Query语法示例

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

查看更多关于Elasticsearch查询Range Query语法示例的详细内容...

  阅读:21次