Elasticsearch教程(23) 详解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"
      }
    }
  }
}

猜你喜欢

转载自blog.csdn.net/winterking3/article/details/108358266