Elasticsearch 范圍查詢


范圍查詢(range query)
范圍查詢用於匹配某些字段的字段值位於特定范圍內的文檔。Lucene查詢的類型依賴於字段的類型,對於字符串字段,是TermRangeQuery,而對於數字/日期字段,查詢是NumericRangeQuery。

GET _search
{
  "query": {
    "range": {
      "age": {
          "gte": 25,
          "lte": 30
      }
    }
  }
}
note:查詢age字段大於等於25小於等於30的文檔。

范圍查詢接收以下參數:

gte:大於等於
gt:大於
lte:小於等於
lt:小於
boost:設置查詢的推動值(boost),默認為1.0
日期字段的范圍
當范圍查詢運行在日期類型的字段上時,可以通過日期數學指定范圍。

GET _search
{
    "query": {
        "range" : {
            "date" : {
                "gte" : "now-1d/d",
                "lt" :  "now/d"
            }
        }
    }
}
日期數學與舍入
當使用日期數學將日期舍入到最近的天、月、小時等時,舍入后的日期依賴於范圍的邊界是否被包含。

向上舍入移動到舍入范圍的最后一毫秒,向下舍入移動到舍入范圍的第一毫秒。

gt:大於舍入的日期,2014-11-18||/M變為2014-11-30T23:59:59.999,即不包括整個月。
gte:大於等於舍入的日期,2014-11-18||/M變為2014-11-01,即包括整個月。
lt:小於舍入的日期,204-11-18||/M變為2014-11-01,即不包括整個月。
lte:小於等於舍入的日期,2014-11-18||/M變為2014-11-30T23:59:59.999,即包含整個月。
范圍查詢中的日期格式
默認使用設置在日期字段中的format參數解析格式化日期,但是,此參數可以通過在范圍查詢中設置format參數來進行覆蓋。

GET _search
{
    "query": {
        "range" : {
            "born" : {
                "gte": "01/01/2012",
                "lte": "2013",
                "format": "dd/MM/yyyy||yyyy"
            }
        }
    }
}
范圍查詢中的時區
通過在日期值中指定時區或使用time_zone參數指定時區,可以轉換日期時區。

GET _search
{
    "query": {
        "range" : {
            "timestamp" : {
                "gte": "2015-01-01 00:00:00", 
                "lte": "now", 
                "time_zone": "+01:00"
            }
        }
    }
}

note:gte參數的日期值將會被轉化為2014-12-31T23:00:00 UTC
note:now不會被time_zone參數影響(日期必須存儲為UTC)

 

 

范圍搜索案例
2.1 制造數據
POST /forum/article/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"view_cnt" : 30} }
{ "update": { "_id": "2"} }
{ "doc" : {"view_cnt" : 50} }
{ "update": { "_id": "3"} }
{ "doc" : {"view_cnt" : 100} }
{ "update": { "_id": "4"} }
{ "doc" : {"view_cnt" : 80} }
復制代碼
2.2 搜索瀏覽量在30~60之間的帖子
GET /forum/article/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "view_cnt": {
            "gt": 30,
            "lt": 60
          }
        }
      }
    }
  }
}
復制代碼
2.3 搜索發帖日期在最近1個月的帖子
POST /forum/article/_bulk
{ "index": { "_id": 5 }}
{ "articleID" : "DHJK-B-1395-#Ky5", "userID" : 3, "hidden": false, "postDate": "2017-03-01", "tag": ["elasticsearch"], "tag_cnt": 1, "view_cnt": 10 }
 
GET /forum/article/_search 
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "postDate": {
            "gt": "2017-03-10||-30d"
          }
        }
      }
    }
  }
}
 
GET /forum/article/_search 
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "postDate": {
            "gt": "now-30d"
          }
        }
      }
    }
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM