一、范围数据类型

数据类型 说明
integer_range 有符号32位整数范围2 ~ 2-1
float_range 单精度32位IEEE 754 浮点数范围
long_range 有符号64位整数范围2 ~ 2-1
double_range 双精度64位IEEE 754 浮点数范围
date_range 自系统纪元以来无符号64位整数范围内的毫秒数范围
ip_range 支持 IPv4 或者 IPv6 地址的IP范围

二、应用实例

假设我们有一张会议表。我们知道实际党政机关会议都有一个出席率的问题,需要出席率在某个点或某个区间内才能算作是有效的。所以我们的映射结构来了。

1、字段映射定义

  1. PUT range_index
  2. {
  3. "settings": {
  4. "number_of_shards": 2
  5. },
  6. "mappings": {
  7. "_doc": {
  8. "properties": {
  9. "expected_attendees": {
  10. "type": "integer_range"
  11. },
  12. "time_frame": {
  13. "type": "date_range",
  14. "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
  15. }
  16. }
  17. }
  18. }
  19. }

2. 添加数据

假如我们需要添加一个10-20人参与,并且在2020-01-01到2020-05-02期间举行的会议记录到ES中。

  1. PUT range_index/_doc/1?refresh
  2. {
  3. "expected_attendees" : {
  4. "gte" : 10,
  5. "lte" : 20
  6. },
  7. "time_frame" : {
  8. "gte" : "2020-01-01 00:00:00",
  9. "lte" : "2020-05-02 23:59:59"
  10. }
  11. }

3. 数据查询

假如我们需要查询参会人数满足12人的会议记录

  1. GET range_index/_search
  2. {
  3. "query" : {
  4. "term" : {
  5. "expected_attendees" : {
  6. "value": 12
  7. }
  8. }
  9. }
  10. }

可以按照日期进行筛选,查询指定时间内的会议记录
relation字段上的范围查询支持一个关系参数,该参数可以是WITHINCONTAINSINTERSECTS之一(默认)。

  1. GET range_index/_search
  2. {
  3. "query" : {
  4. "range": {
  5. "time_frame": {
  6. "gte": "2019-12-30 00:00:00",
  7. "lte": "2020-05-03 23:59:59",
  8. "relation": "within"
  9. }
  10. }
  11. }
  12. }

三、ip范围查询

IP范围可以用CIDR符号表示法查询ip范围数据。

  1. PUT range_index/_mapping/_doc
  2. {
  3. "properties": {
  4. "ip_whitelist": {
  5. "type": "ip_range"
  6. }
  7. }
  8. }
  9. PUT range_index/_doc/2
  10. {
  11. "ip_whitelist" : "192.168.0.0/16"
  12. }