范围字段类型编辑

范围字段类型表示上限和下限之间的连续值范围。例如,范围可以表示*10 月份的任何日期*或*0 到 9 之间的任何整数*。它们使用运算符 gtgte 定义下限,使用 ltlte 定义上限。它们可用于查询,并对聚合提供有限的支持。唯一支持的聚合是 直方图基数

支持以下范围类型

integer_range

一个有符号 32 位整数范围,最小值为 -231,最大值为 231-1

float_range

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

long_range

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

double_range

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

date_range

一个 date 值范围。日期范围通过 format 映射参数支持各种日期格式。无论使用哪种格式,日期值都会被解析为一个无符号 64 位整数,表示自 Unix 纪元以来以 UTC 为单位的毫秒数。不支持包含 now 日期数学 表达式的值。

ip_range

一个 IP 值范围,支持 IPv4IPv6(或混合)地址。

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

response = client.indices.create(
  index: 'range_index',
  body: {
    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'
        }
      }
    }
  }
)
puts response

response = client.index(
  index: 'range_index',
  id: 1,
  refresh: true,
  body: {
    expected_attendees: {
      gte: 10,
      lt: 20
    },
    time_frame: {
      gte: '2015-10-31 12:00:00',
      lte: '2015-11-01'
    }
  }
)
puts response
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,
    "lt" : 20
  },
  "time_frame" : {
    "gte" : "2015-10-31 12:00:00", 
    "lte" : "2015-11-01"
  }
}

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

示例索引一个有 10 到 20 名与会者(不包括 20 名)的会议。

使用日期时间戳的示例日期范围。

以下是在名为“expected_attendees”的 integer_range 字段上进行 词条查询 的示例。12 是范围内的值,因此它将匹配。

response = client.search(
  index: 'range_index',
  body: {
    query: {
      term: {
        expected_attendees: {
          value: 12
        }
      }
    }
  }
)
puts response
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",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "expected_attendees" : {
            "gte" : 10, "lt" : 20
          },
          "time_frame" : {
            "gte" : "2015-10-31 12:00:00", "lte" : "2015-11-01"
          }
        }
      }
    ]
  }
}

以下是在名为“time_frame”的 date_range 字段上进行 date_range 查询的示例。

response = client.search(
  index: 'range_index',
  body: {
    query: {
      range: {
        time_frame: {
          gte: '2015-10-31',
          lte: '2015-11-01',
          relation: 'within'
        }
      }
    }
  }
)
puts response
GET range_index/_search
{
  "query" : {
    "range" : {
      "time_frame" : { 
        "gte" : "2015-10-31",
        "lte" : "2015-11-01",
        "relation" : "within" 
      }
    }
  }
}

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

对范围 字段 的范围查询支持 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",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "expected_attendees" : {
            "gte" : 10, "lt" : 20
          },
          "time_frame" : {
            "gte" : "2015-10-31 12:00:00", "lte" : "2015-11-01"
          }
        }
      }
    ]
  }
}

IP 范围编辑

除了上述范围格式外,还可以使用 CIDR 表示法提供 IP 范围

response = client.indices.put_mapping(
  index: 'range_index',
  body: {
    properties: {
      ip_allowlist: {
        type: 'ip_range'
      }
    }
  }
)
puts response

response = client.index(
  index: 'range_index',
  id: 2,
  body: {
    ip_allowlist: '192.168.0.0/16'
  }
)
puts response
PUT range_index/_mapping
{
  "properties": {
    "ip_allowlist": {
      "type": "ip_range"
    }
  }
}

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

范围字段的参数编辑

范围类型接受以下参数

coerce

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

index

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

store

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