為了烤雞上了這條不歸路,年輕人終究是年輕人…
現在我的 ES Cloud 上有一大堆台股資料等著讓我分析,今天我要來看看如何找資料找出來。
ES 有兩種主要的搜尋方式:Search Lite 以及 Request Body Search。前者就是將搜尋字串帶在 URL 後面,是一種產品化的程式不建議的使用方式,因為容易讓使用者對伺服器打了錯誤的 API,另外為了安全性,開發者會將搜尋字串編碼,也讓易讀性降低。今天我先專注在後者。
ES 的 Request Body 是以 Query DSL (domain-specific language; 領域特定語言) 構成的 JSON 物件。簡單的說,就是 ES 針對搜尋功能,定義的一種使用者與 ES 溝通的語言。來看一個簡單的例子:
GET /history-prices-python/_search
{
"query" : {
"match" : {
"stock_id": "1101"
}
}
}
在 ES Cloud Kibana 的 Dev Tools 看看結果:
上圖揭露了一些有用的資訊:
透過這個簡單的例子,可以發現 ES 的 Query DSL 有非常高的閱讀性啊!
在一個 Query 請求中可以包含:
- Filters: 對搜尋的資料進行 Yes/No 的判定
- Query Clauses: 根據 Relevance Score 返回資料
儘量使用 Filter,因為它速度快且可以被 Cache。事不宜遲,馬上來試試看,首先定義一個搜尋目標:取回股票代號 2030 過去 10 天的收盤資料,並且最新的資料要在最上面。
GET /history-prices-python/_search
{
"sort" : [
{ "date" : {"order" : "desc"}}
],
"query" : {
"bool": {
"must": {
"match": {
"stock_id": "2030"
}
},
"filter": {
"range": {
"date": {
"gte": "now-10d/d",
"lt": "now/d"
}
}
}
}
}
}
在上面的查詢中,我使用了 Bool Query,意思是我可以將不同的語句 (Query Clauses) 組合起來,上面的例子我即是 match 和 filter 語句的組合結果。Bool Query 接受三種參數:must, must_not 以及 should。以 must 來說,就是指查詢語句的結果「必須」符合查詢條件。而 Filter 把我要的時間區段過濾出來。搜尋結果如下圖:
酷!
但實際上有個小問題,因為台股週末不開盤,所以用查詢當下的時間去計算區間,其實找到的不是交易日,所以盤後資料只有 6 筆。不過因為是示範用,真正要分析時再想辦法處理吧!
今天都是在的 Kibana 上進行搜尋演練,明天就回到 Python client 來試試看吧。