Elasticsearch区间匹配规则

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24228375/article/details/82529682

Elasticsearch区间匹配规则

先从官网看看range datatypes的类型简介:

这里写图片描述

一、数字类型

1、通过kibana创建integer_range类型索引字段

PUT integer_range_example
{
  "mappings": {
    "integerIndex": {
      "properties": {
        "num": {
          "type": "integer_range"
        }
      }
    }
  }
}

2、索引中加入数据(项目中,可利用datax脚本导入)

PUT integer_range_example/integerIndex/1?refresh
{
  "num" : { 
    "gte" : 10,
    "lte" : 20
  }
}

其中 gte(大于等于),lte(小于等于),也可以结合使用gt(大于),lt(小于)
也可以以数组的形式put进去,进而达到多区间匹配

PUT integer_range_example/integerIndex/1?refresh
{
  "num" : [
    { 
    "gte" : 10,
    "lte" : 20
  },{ 
    "gt" : 30,
    "lt" : 40
  },{ 
    "gte" : 50,
    "lt" : 60
  },{ 
    "gt" : 70,
    "lte" : 80
  }
    ]
}

3、根据num检索结果

GET integer_range_example/_search
{
  "query" : {
    "term" : {
      "num" : {
        "value": 12
      }
    }
  }
}

结果如下:

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "integer_range_example",
        "_type": "integerIndex",
        "_id": "1",
        "_score": 1,
        "_source": {
          "num": {
            "gte": 10,
            "lte": 20 }
        }
      }
    ]
  }
}

其他数字类型也基本类似,date_range和ip_range有些不一样

二、日期类型date_range

1、通过kibana创建date_range类型索引字段

PUT date_range_example
{
  "mappings": {
    "dateIndex": {
      "properties": {
        "time_frame": {
          "type": "date_range",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
      }
    }
  }
}

2、索引中加入数据(项目中,可利用datax脚本导入)

PUT date_range_example/dateIndex/1?refresh
{
  "time_frame" : {
    "gte" : "2018-07-01 12:00:00", 
    "lte" : "2018-09-01"
  }
}

数组插入

PUT date_range_example/dateIndex/1?refresh
{
  "time_frame" : [
    {
    "gte" : "2018-01-01 12:00:00", 
    "lte" : "2018-02-01"
  },{
    "gt" : "2018-03-01 12:00:00", 
    "lt" : "2018-04-01"
  },{
    "gte" : "2018-05-01 12:00:00", 
    "lt" : "2018-06-01"
  },{
    "gt" : "2018-07-01 12:00:00", 
    "lte" : "2018-08-01"
  }
    ]
}

3、检索


GET date_range_example/_search
{
  "query" : {
    "range" : {
      "time_frame" : { 
        "gte" : "2018-05-31",
        "lte" : "2018-09-02",
        "relation" : "within" 
      }
    }
  }
}

这里的relation参数是个可选参数,WITHIN, CONTAINS, INTERSECTS (默认)。该参数可用于任何range类型,不仅仅是date_range。
结果

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "date_range_example",
        "_type": "dateIndex",
        "_id": "1",
        "_score": 1,
        "_source": {
          "time_frame": [
            {
              "gte": "2018-01-01 12:00:00",
              "lte": "2018-02-01" },
            {
              "gt": "2018-03-01 12:00:00",
              "lt": "2018-04-01" },
            {
              "gte": "2018-05-01 12:00:00",
              "lt": "2018-06-01" },
            {
              "gt": "2018-07-01 12:00:00",
              "lte": "2018-08-01" }
          ]
        }
      }
    ]
  }
}
三、ip类型ip_range
PUT ip_range_example
{
  "mappings": {
    "ipIndex": {
      "properties": {
        "ip_whitelist": {
          "type": "ip_range"
        }
      }
    }
  }
}

PUT ip_range_example/ipIndex/1
{
  "ip_whitelist" : "192.168.151.0/16"
}

GET ip_range_example/_search

猜你喜欢

转载自blog.csdn.net/qq_24228375/article/details/82529682