欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Elasticsearch(018):es常见的字段映射类型之范围类型(range)

程序员文章站 2024-03-20 10:41:58
...

范围类型(range)是es中比较具有特色的数据类型。下面我们就先来看看官方对其的定义。

定义

数字范围类数据。主要类型及范围如下。

Elasticsearch(018):es常见的字段映射类型之范围类型(range)

数据范围类型的使用

映射定义

假设我们有一张会议表。我们知道实际中党政机关会议都有一个出席率的问题,需要出席率在某个点或某个区间内才能算作是有效的。所以我们的映射结构来了。

示例如下。

PUT example
PUT example/docs/_mapping
{
  "properties": {
    "expectedAttendees":{
      "type": "integer_range"
    },
    "time": {
      "type": "date_range",
      "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
    }
  }
}

数据新增

假如这时我们需要添加一个10-20人参与,并且在2019-12-01到2019-12-02期间举行的会议。

PUT example/docs/112313213?refresh
{
    "expectedAttendees": {
        "gte": 10,
        "lte": 20
    },
    "time": {
        "gte": "2019-12-01 12:00:00",
        "lte": "2019-12-02 17:00:00"
    }
}

数据查询

怎么查询呢?假如我们需要查询参会人数满足12人的会议记录。

GET example/docs/_search
{
    "query": {
        "term": {
            "expectedAttendees": {
                "value": 12
            }
        }
    }
}

结果如下

{
  "took": 13,
  "timed_out": false,
  "_shards" : {
    "total": 2,
    "successful": 2,
    "skipped" : 0,
    "failed": 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "range_index",
        "_type" : "my_type",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "expected_attendees" : {
            "gte" : 10, "lte" : 20
          },
          "time" : {
            "gte" : "2019-12-01 12:00:00", "lte" : "2019-12-02 17:00:00"
          }
        }
      }
    ]
  }
}

当然我们可以按照日期进行筛选。例如下面这个查询。

POST example/docs/_search
{
    "query": {
        "range": {
            "time": {
                "gte": "2019-12-01",
                "lte": "2019-12-02",
                "relation": "within"
            }
        }
    }
}

聪明的同学肯定注意到relation关键字。relation字段上的范围查询支持一个关系参数,该参数可以是WITHINCONTAINSINTERSECTS之一(默认)。

结果如下

{
  "took": 13,
  "timed_out": false,
  "_shards" : {
    "total": 2,
    "successful": 2,
    "skipped" : 0,
    "failed": 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "range_index",
        "_type" : "my_type",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "expected_attendees" : {
            "gte" : 10, "lte" : 20
          },
          "time" : {
            "gte" : "2019-12-01 12:00:00", "lte" : "2019-12-02 17:00:00"
          }
        }
      }
    ]
  }
}

基于ip的数据类型也有很有趣的用法,感兴趣的同学可以深入研究下,这里就不展开。