Elasticsearch 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_range | IP范围, 支持IPv4和IPv6的范围 |
1.1 区间的开闭
设定一个范围可以有多种选择, 可以包含边界值,也可以不包含边界值,还可以一个边界是无界限的。
定义的时候可以用gt
、gte
、lt
、lte
表示左右界限的开闭。
下面举例说明:
类型 | 说明 | 表达 |
---|---|---|
左闭, 右闭 | [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个值INTERSECTS
、CONTAINS
、WITHIN
类型 | 说明 |
---|---|
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"
}
}
}
}
如果本文对您有帮助,就给亚瑟王点个赞👍吧。