Elasticsearch详解mapping之range
1 简介
- 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 实验
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_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"
}
}
}
}