ElasticSearch学习笔记十六 Range数据类型和检索

ElasticSearch学习笔记十六 Range数据类型和检索

Range数据类型

Elasticsearch支持以下范围数据类型:

数据类型 说明
integer_range 有符号32位整数范围 2-32 ~ 232-1
float_range 单精度32位IEEE 754 浮点数范围
long_range 有符号64位整数范围 2-64 ~ 264-1
double_range 双精度64位IEEE 754 浮点数范围
date_range 自系统历元以来无符号64位整数范围内的毫秒数范围
ip_range 支持 IPv4 或者 IPv6 (or mixed) 地址的IP范围

数据和日期

假设我们有一个纪录会议室相关范围要求的索引

PUT range_index
{
  "mappings": {
    "metting": {
      "properties": {
        "expected_attendees_age_range": {
          "type": "integer_range"
        },
        "time_frame_range": {
          "type": "date_range", 
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
      }
    }
  }
}

例如我们假如一个要求只有10岁到20岁可以参加,参加会议的时间在11月31号中午12点到凌晨。

PUT range_index/metting/1?refresh
{
  "expected_attendees_age_range" : { 
    "gte" : 10,
    "lte" : 20
  },
  "time_frame_range" : { 
    "gte" : "2015-10-31 12:00:00", 
    "lte" : "2015-11-01"
  }
}

此时又一位15岁的同学跑过来询问有没有我合适参加的会议呢,我们应该怎么查询呢?

GET range_index/metting/_search?
{
  "query" : {
    "term" : {
      "expected_attendees_age_range" : {
        "value": 12
      }
    }
  }
}

结果如下

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "range_index",
        "_type": "metting",
        "_id": "1",
        "_score": 1,
        "_source": {
          "expected_attendees_age_range": {
            "gte": 10,
            "lte": 20
          },
          "time_frame_range": {
            "gte": "2015-10-31 12:00:00",
            "lte": "2015-11-01"
          }
        }
      }
    ]
  }
}

此时我们需要判断一个时间范围呢,有没有会议开展呢?

GET range_index/metting/_search
{
  "query" : {
    "range" : {
      "time_frame_range" : { 
        "gte" : "2015-10-31",
        "lte" : "2015-11-01",
        "relation" : "within" 
      }
    }
  }
}

结果如下:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "range_index",
        "_type": "metting",
        "_id": "1",
        "_score": 1,
        "_source": {
          "expected_attendees_age_range": {
            "gte": 10,
            "lte": 20
          },
          "time_frame_range": {
            "gte": "2015-10-31 12:00:00",
            "lte": "2015-11-01"
          }
        }
      }
    ]
  }
}

IP范围

此时假如我们需要纪录一系列IP白名单

PUT ip_range_index
{
  "mappings":{
    "_doc":{
      "properties": {
        "ip_whitelist": {
        "type": "ip_range"
        }
      }
    }
  }
}

加入纪录:

PUT ip_range_index/_doc/2
{
  "ip_whitelist" : "192.168.0.0/16"
}

查询IP是否在白名单里面

GET ip_range_index/_doc/_search
{
  "query" : {
    "term" : {
      "ip_whitelist" : {
        "value": "192.168.0.12"
      }
    }
  }
}

没有更多推荐了,返回首页