范圍查詢(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" } } } } } }