原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/range.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/range.html

range(范围)数据类型

支持以下几种范围类型:

integer_range

32位整数范围,最小值为-231,最大值为231-1

float_range

单精度32位 IEEE 754 浮点值范围。

long_range

64位有符号整数,最小值为-263,最大值为263-1

double_range

64位双精度 IEEE 754 浮点值范围。

date_range

自系统纪元以来,以无符号64位整数毫秒表示的日期值范围。

ip_range

支持IPv4IPv6(或混合)地址的IP值范围。

下面是一个使用各种范围字段配置映射的示例,后面是一个索引多个范围类型的示例。

PUT range_index
{
  "settings": {
    "number_of_shards": 2
  },
  "mappings": {
    "properties": {
      "expected_attendees": {
        "type": "integer_range"
      },
      "time_frame": {
        "type": "date_range", 
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}

PUT range_index/_doc/1?refresh
{
  "expected_attendees" : { 
    "gte" : 10,
    "lte" : 20
  },
  "time_frame" : { 
    "gte" : "2015-10-31 12:00:00", 
    "lte" : "2015-11-01"
  }
}

date_range类型接受由date类型定义的相同的字段参数。

为10~20名与会者的会议编制索引的示例。

日期范围接受与日期范围查询中所述相同的格式。

使用日期时间戳的日期范围示例。 还可以接受date math格式。 请注意,在索引时不能使用“now”。

以下是对名为“expected_attendees”的integer_range字段进行term 查询的示例。

GET range_index/_search
{
  "query" : {
    "term" : {
      "expected_attendees" : {
        "value": 12
      }
    }
  }
}

上述查询产生的结果:

{
  "took": 13,
  "timed_out": false,
  "_shards" : {
    "total": 2,
    "successful": 2,
    "skipped" : 0,
    "failed": 0
  },
  "hits" : {
    "total" : {
        "value": 1,
        "relation": "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "range_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "expected_attendees" : {
            "gte" : 10, "lte" : 20
          },
          "time_frame" : {
            "gte" : "2015-10-31 12:00:00", "lte" : "2015-11-01"
          }
        }
      }
    ]
  }
}

下面是对名为“time_frame”的date_range字段进行date_range查询的示例:

GET range_index/_search
{
  "query" : {
    "range" : {
      "time_frame" : { 
        "gte" : "2015-10-31",
        "lte" : "2015-11-01",
        "relation" : "within" 
      }
    }
  }
}

范围查询的工作方式与范围查询中描述的相同。

range 字段上的范围查询支持参数relation,该参数可以是WITHINCONTAINSINTERSECTS(默认)之一。

该查询产生类似的结果:

{
  "took": 13,
  "timed_out": false,
  "_shards" : {
    "total": 2,
    "successful": 2,
    "skipped" : 0,
    "failed": 0
  },
  "hits" : {
    "total" : {
        "value": 1,
        "relation": "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "range_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "expected_attendees" : {
            "gte" : 10, "lte" : 20
          },
          "time_frame" : {
            "gte" : "2015-10-31 12:00:00", "lte" : "2015-11-01"
          }
        }
      }
    ]
  }
}

IP 范围

除了上述范围格式,IP 范围还可以用CIDR符号表示:

PUT range_index/_mapping
{
  "properties": {
    "ip_whitelist": {
      "type": "ip_range"
    }
  }
}

PUT range_index/_doc/2
{
  "ip_whitelist" : "192.168.0.0/16"
}

range字段的参数

range类型接受以下参数:

coerce

尝试将字符串转换为数字,并截断整数的小数部分。 接受true(默认) 和 false

boost

映射字段级查询时提升。接受一个浮点数,默认为1.0

index

该字段应该是可搜索的吗?接受true(默认) 和 false

store

字段值是否应该与_source字段分开存储和检索。接受 truefalse(默认)。