【Elasticsearch教程14】Mapping字段类型之range

一、简介

  • range字段类型表示一个字段的值是一个数值范围
  • 例如一个range类型的字段的值是[10, 20],用12来匹配该字段,则会命中该文档.

range字段类型如下:

类型说明
integer_range[-231, 231-1 ]
long_range[-263, 263-1]
float_range单精度、符合IEEE 754标准的浮点数的范围
double_range双精度、符合IEEE 754标准的浮点数的范围
date_range日期范围, 在es内部,日期以64位long类型表示的毫秒数存储
ip_rangeIP范围, 支持IPv4和IPv6的范围

1.1 区间的开闭

设定一个范围可以有多种选择, 可以包含边界值,也可以不包含边界值,还可以一个边界是无界限的。
定义的时候可以用gtgteltlte表示左右界限的开闭。
下面举例说明:

类型说明表达
左闭, 右闭[10, 20]gte: 10, lte: 20
左闭, 右开[10, 20)gte: 10, lt: 20
左闭, 右无限大[10, +∞)gte: 10

二、实验

2.1 创建一个新的索引

PUT pigg_test_range
{
  "mappings": {
    "properties": {
      "range_of_integer": {
        "type": "integer_range"
      },
      "range_of_date": {
        "type": "date_range", 
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}

2.2 新增测试文档

PUT pigg_test_range/_doc/1
{
  "range_of_integer": {
    "gte": 10,
    "lte": 20
  },
  "range_of_date": {
    "gte": "2020-09-01 10:20:00",
    "lte": "2020-09-02"
  }
}

PUT pigg_test_range/_doc/2
{
  "range_of_integer": {
    "gt": 10,
    "lt": 20
  },
  "range_of_date": {
    "gt": "2020-09-01 10:20:00",
    "lt": "2020-09-02"
  }
}

PUT pigg_test_range/_doc/3
{
  "range_of_integer": {
    "gt": 20
  },
  "range_of_date": {
    "gt": "2020-09-01 10:20:00"
  }
}

2.3 使用term查询匹配

查询包含10的文档,
GET pigg_test_range/_search
{
  "query": {
    "term": {
      "range_of_integer": {
        "value": 10
      }
    }
  }
}

查询日期范围包含"2020-09-01 10:20:00"的数据
GET pigg_test_range/_search
{
  "query": {
    "term": {
      "range_of_date": {
        "value": "2020-09-01 10:20:00"
      }
    }
  }
}

上面2个查询返回都是如下:
{
...省略...
    "_source":{
        "range_of_integer":{
            "gte":10,
            "lte":20
        },
        "range_of_date":{
            "gte":"2020-09-01 10:20:00",
            "lte":"2020-09-02"
        }
    }
}

2.4 使用range查询匹配

range查询有个参数relation,它可以有3个值INTERSECTSCONTAINSWITHIN

类型说明
INTERSECTS默认设置, 有交集的文档才匹配
CONTAINS目标文档的值的范围包含查询条件
WITHIN查询条件的范围包含目标文档的值的范围
GET pigg_test_range/_search
{
  "query": {
    "range": {   # 注意这里是range,不再是term了
      "range_of_integer": {
        "gte": 18,
        "lte": 20,
        "relation" : "INTERSECTS"
      }
    }
  }
}


GET pigg_test_range/_search
{
  "query": {
    "range": {
      "range_of_integer": {
        "gte": 18,
        "lte": 20,
        "relation" : "CONTAINS"
      }
    }
  }
}

GET pigg_test_range/_search
{
  "query": {
    "range": {
      "range_of_integer": {
        "gte": 18,
        "lte": 20,
        "relation" : "WITHIN"
      }
    }
  }
}

如果本文对您有帮助,就给亚瑟王点个赞👍吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑟 王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值