因為 elasticsearch 要打很多字,寫文苦手如我決定縮寫它,所以會用 ES 代稱。
Kibana Dev Tool
相信在讀這篇文章的你,很大機率會使用過 RDB(relation database),例如 oracle db,MSSQL server,postgresql 等。 在 RDB 內,會用 table 來擺放具有相同欄位的資料,在 ES 內 index 是類似的概念(只是類似,不完全等同)。在一個 Index 內的一筆資料稱為 Document,是以 JSON 的格式貯存的;JSON 內的欄位(fields),可以類比於 RDB 的欄(columns),只是 fields 可以巢狀貯存(field 內還有 field)。
如果相比於 RDB ,你比較熟悉的是 MongoDB 這種 NoSql 資料庫,應該會有很多類似的設計。
在第二天的內容中有提到 elasticsearch 是 RESTful 的,因此接下來跟 es 溝通,都可以使用 API request 執行,但既然 Kibana 都架好了,我們也可以用 kibana 的 Develop Tools 工具來 query ES 的資料。
請點選 Menu Bar 上的漢堡,往下滑動到 Management 區塊,找到 Dev Tool 點入,會看到類似下圖畫面,大致一分為二,左邊有一些預填好的 demo query,右邊是空白的。
這個頁面左邊就是可以自由撰寫 query 跟 es 溝通的簡易編輯器,每一個片段都是可以直接選取並執行的,例如你把游標放在第 10 行,在第 10 行的最末,會出現播放鍵三角形 icon 可以點選或是使用快捷鍵 (mac: cmd + Enter,win: ctl + Enter) 執行者一段程式碼(如果你有用過 Jupyter Notebook,這裡的一段程式碼就是一個 block)。
Demo Query
右邊的 query 是一個簡單的教學,註解文字(# 為註解)中說明的很清楚,告訴你從創建 index(第 10 行)、寫一個 document 入這個 index(第14~19 行)、搜尋這個 index 的包含 rocky mountain 字詞的文件(第 23 行)等。這邊簡單說明一下:
創建 index
PUT /<index_name>
沒錯就這麼簡單,好像沒什麼好說的。
如果成功,會得到以下的回應
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "my-index"
}
寫入文件
POST /<index_name>/_doc
<document as json format>
如果成功會得到以下回應
{
"_index": "my-index",
"_id": "Ehw64JEBwHSv4ArTo1PU",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
範例提供的是寫入單一筆資料可以使用的 endpoint(_doc)。
如果想要一次多筆,可以使用 bulk endpoint,要特別注意的是這個 endpoint 的資料需要是 newline separate json,也就是不同的 doc 中要透過換行來區別,同一 document 內不能存在換行。
POST /_bulk
{ "index" : { "_index" : "my-index" } }
{"id": "es_add_single","title": "Add a single document","description": "Submit the following indexing request to add a single document to the books index. The request automatically creates the index."}
...
{ "index" : { "_index" : <index_name> } }
<document_content_in_new_line_separate_format>
如果成功,會得到以下的回應:
{
"errors": false,
"took": 100635550,
"items": [
{
"index": {
"_index": "my-index",
"_id": "Exyh4JEBwHSv4ArTl1PQ",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1,
"status": 201
}
},
{
"index": {
"_index": "my-index",
"_id": "FByh4JEBwHSv4ArTl1PQ",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1,
"status": 201
}
}
]
}
全文搜尋
GET /my-index/_search?q="rocky-mountain"
使用 _search api,並使用 q 參數指定搜尋的關鍵字;也可以使用 match query 搜尋特定的欄位,API request 如下:
GET /my_index/_search
{
"query": {
"match": {
"title": "Add"
}
}
}
# query 說明
# {
# "query": {
# "match": {
# "<要搜尋的欄位>": "<要搜尋的字>"
# }
# }
# }
看到這邊,刪除 document的方法應該不難猜到
DELETE /my-index/_doc/<document_id>
如果成功會得到以下結果:
{
"_index": "my-index",
"_id": "es_add_single",
"_version": 1,
"result": "not_found",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 4,
"_primary_term": 1
}
以上是透過 kibana console 簡單的資料 ingest、search、delete 示範,前面有提到,ES 的操作 RESTful 的 API,因此任何可以操作 API 的工具,都可以操作 elasticsearch。此外,ES 也有 python、JS、Ruby、GO 等 API 可以使用。
接下來會簡單說明在 insert document、search 時在 es 背後發生的事,包含被自動化判斷的 schema、文本 reverse-index 過程等。