Elasticsearch中如何進行數值範圍查詢? 日期範圍查詢又是怎麼實現的?關於日期的數學表達式、四捨五入規則都是什麼? 還有怎樣根據不同的時區查詢?本篇文章告訴你答案O(∩_∩)O~ ...
目錄
1 範圍查詢的符號
符號 | 含義 |
---|---|
gte | greater-than or equal to, 大於或等於 |
gt | greater-than, 大於 |
lte | less-than or equal to, 小於或等於 |
lt | less-than, 小於 |
2 數值範圍查詢
需求: 查詢商品中40 <= price <= 80
的文檔:
GET book_shop/_search
{
"query": {
"range": {
"price": {
"gte": 40,
"lte": 80,
"boost": 2.0 // 設置得分的權重值(提升值), 預設是1.0
}
}
}
}
3 時間範圍查詢
3.1 簡單查詢示例
需求: 查詢網站中最近一天發佈的博客:
GET website/_search
{
"query": {
"range": {
"post_date": {
"gte": "now-1d/d", // 當前時間的上一天, 四捨五入到最近的一天
"lt": "now/d" // 當前時間, 四捨五入到最近的一天
}
}
}
}
3.2 關於時間的數學表達式(date-math)
Elasticsearch中時間可以表示為now
, 也就是系統當前時間, 也可以是以||
結尾的日期字元串表示.
在日期之後, 可以選擇一個或多個數學表達式:
+1h
—— 加1小時;-1d
—— 減1天;/d
—— 四捨五入到最近的一天.
下麵是Elasticsearch支持數學表達式的時間單位:
表達式 | 含義 | 表達式 | 含義 |
---|---|---|---|
y |
年 | M |
月 |
w |
星期 | d |
天 |
h |
小時 | H |
小時 |
m |
分鐘 | s |
秒 |
說明: 假設系統當前時間now = 2018-10-01 12:00:00
:
now+1h
: now的毫秒值 + 1小時, 結果是:2018-10-01 13:00:00
.now-1h
: now的毫秒值 - 1小時, 結果是:2018-10-01 11:00:00
.now-1h/d
: now的毫秒值 - 1小時, 然後四捨五入到最近的一天的起始, 結果是:2018-10-01 00:00:00
.2018.10.01||+1M/d
:2018-10-01
的毫秒值 + 1月, 再四捨五入到最近一天的起始, 結果是:2018-11-01 00:00:00
.
3.3 關於時間的四捨五入
對日期中的日、月、小時等 進行四捨五入時, 取決於範圍的結尾是包含(include)還是排除(exclude).
向上舍入: 移動到舍入範圍的最後一毫秒;
向下舍入: 一定到舍入範圍的第一毫秒.
舉例說明:
① "gt": "2018-12-18||/M" —— 大於日期, 需要向上舍入, 結果是2018-12-31T23:59:59.999
, 也就是不包含整個12月.
② "gte": "2018-12-18||/M" —— 大於或等於日期, 需要向下舍入, 結果是 2018-12-01
, 也就是包含整個12月.
③ "lt": "2018-12-18||/M" —— 小於日期, 需要向上舍入, 結果是2018-12-01
, 也就是不包含整個12月.
④ "lte": "2018-12-18||/M" —— 小於或等於日期, 需要向下舍入, 結果是2018-12-31T23:59:59.999
, 也就是包含整個12月.
4 日期格式化範圍查詢(format)
格式化日期查詢時, 將預設使用日期field中指定的格式進行解析, 當然也可以通過format參數來覆蓋預設配置.
示例:
GET website/_search
{
"query": {
"range": {
"post_date": {
"gte": "2/1/2018",
"lte": "2019",
"format": "dd/MM/yyyy||yyyy"
}
}
}
}
註意: 如果日期中缺失了部分年、月、日, 缺失的部分將被填充為unix系統的初始值, 也就是1970年1月1日.
比如, 將dd
指定為format, 像"gte": 10
將轉換為1970-01-10T00:00:00.000Z
.
5 時區範圍查詢(time_zone)
如果日期field的格式允許, 也可以通過在日期值本身中指定時區, 從而將日期從另一個時區的時間轉換為UTC時間, 或者為其指定特定的time_zone
參數.
示例:
GET website/_search
{
"query": {
"range": {
"post_date": {
"gte": "2018-01-01 00:00:00",
"lte": "now",
"format": "yyyy-MM-dd hh:mm:ss",
"time_zone": "+1:00"
}
}
}
}
ES中的日期類型必須按照UTC時間格式存儲, 所以, 上述的2018-01-01 00:00:00
將被轉換為2017-12-31T23:00:00 UTC
.
另外需要註意的是, now
是不受time_zone
影響的.
參考資料
版權聲明