iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 10
2
Elastic Stack on Cloud

Elastic 戰台股系列 第 10

[Day10] 技術指標計算 - 搜尋練習 using Kibana

為了烤雞上了這條不歸路,年輕人終究是年輕人…

現在我的 ES Cloud 上有一大堆台股資料等著讓我分析,今天我要來看看如何找資料找出來。

Request Body Search

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 看看結果:
https://ithelp.ithome.com.tw/upload/images/20200922/20129624TjUrRIRLYa.png
上圖揭露了一些有用的資訊:

  • total.value: 這次的搜尋找到 220 筆資料
  • _score: 搜尋結果的 relevance socre,es 經過計算後,把分數最高的結果依序列出來
  • _source: 完全的 Document
    在預設的情況下,ES 會反回頭 10 筆資料,除非使用者指定分頁 (Pagination) 相關參數。

透過這個簡單的例子,可以發現 ES 的 Query DSL 有非常高的閱讀性啊!

Filters and Queries

在一個 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 把我要的時間區段過濾出來。搜尋結果如下圖:
https://ithelp.ithome.com.tw/upload/images/20200922/20129624hvoTunU9b4.png
酷! 
但實際上有個小問題,因為台股週末不開盤,所以用查詢當下的時間去計算區間,其實找到的不是交易日,所以盤後資料只有 6 筆。不過因為是示範用,真正要分析時再想辦法處理吧!

今天都是在的 Kibana 上進行搜尋演練,明天就回到 Python client 來試試看吧。


上一篇
[Day09] 選股系統架構修改 - 歷史資料移轉 ES Cloud
下一篇
[Day11] 技術指標計算 - 用 Python-client 搜尋
系列文
Elastic 戰台股30

尚未有邦友留言

立即登入留言