https://unsplash.com/photos/_DyUcJalGAc
當我們使用 Google 查詢資料,或是在購物網站尋找商品,都會輸入「關鍵字」,讓伺服器上的後端程式找出符合使用者需求的結果,甚至按照相關度來排序。ElasticSearch 是一種全文檢索引擎,它除了能夠像資料庫般儲存資料,也可做到搜尋引擎的效果。
本文將介紹 ElasticSearch(以下簡稱 ES),並解說在 Windows 系統上透過 Docker 來安裝與啟動的方式。最後介紹 GUI 工具,便於後續的練習。
一、ElasticSearch 的用途
依照筆者工作經驗所見到的部份,ES 主要有以下三大用途。
(一)儲存資料
在進行後端開發時,會搭配資料庫來儲存資料,我們分為關聯式資料庫(如 MySQL)與非關聯式資料庫 (如 MongoDB)。若查詢時,想將其他表的資料也加進來,在 MySQL 會使用 JOIN;在 MongoDB 則使用 aggregate 的 lookup。
以社群平台為例,一個貼文列表可能要呈現標題、會員名稱與留言數量。我們預期會從貼文資料表查詢,再 JOIN 會員資料表與留言資料表,甚至以留言數來排序。
然而一旦牽涉到越多表,查詢效能也就越低落。此時可考慮將 JOIN 好的資料整個放到 ES,並直接對其發出查詢請求。ES 的資料是以 JSON 結構來儲存,與 NoSQL 相近。這意味著,我們能夠將程式中自己設計的物件(裡面可以有字串、數字或物件欄位等)儲存到 ES。
(二)全文檢索
站內搜尋是一個網站常見的功能。所謂「全文檢索」,是指從資料庫中,不限定欄位地找出符合的資料。
以前面的貼文列表為例,假設使用者輸入「蛋糕 食譜」關鍵字做搜尋,我們可以讓 ES 找出「標題」、「內文」或「發文者名稱」等其中一個欄位包含「蛋糕」或「食譜」關鍵字的資料。
(三)相關度評分
ES 會給搜尋到的每筆資料都給予一個分數,分數越高,代表與當下查詢條件的相關度越高。例如在 OR 的邏輯中,符合越多條件,就越相關;包含越多關鍵字,也越相關。
我們還能額外定義分數的計算方式,並透過分數來排序,達到「推薦」的效果。再次以貼文列表為例,以下是假想的分數計算方式:
- 發文者為付費會員 + 0.5 分
- 3 天內的貼文 + 0.7 分
- 4 ~ 7 天內的貼文 + 0.4 分
- 每多一則留言 + 0.1 分
- 每多一個讚 + 0.1 分
二、安裝並啟動 ElasticSearch
本節讓我們在 Windows 系統上使用 Docker 運行 ES 的服務。由於 Docker 方面的操作不是本文的重點,因此筆者不會著墨太多。請讀者先安裝 Docker Desktop。安裝後,若有看到相關提示,再接續安裝 WSL。
成功啟動 Docker 後,請在命令提示字元(CMD)執行以下指令,下載 ES 的 image。本文的版本為 8.3.1,其他版本可至 ES 的 Docker Hub 查看。
docker pull elasticsearch:8.3.1
下載好 image 後,可在 Docker Desktop 中找到 Image ID 為「75082a00ae85」。
接著執行以下指令,即可將 image 建立成 container,並立即運行。
docker run -d --name "ES_8.3.1" -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "xpack.security.enabled=false" 75082a00ae85
以下說明指令中用到的參數。
- -d:在 CMD 背景運行 container。
- --name "ES_8.3.1":將 container 命名為「ES_8.3.1」。
- -p 9200:9200:將伺服器在 9200 port(冒號左邊)收到的請求,轉發到 container 的 9200 port(冒號右邊)。
- -e "discovery.type=single-node":以單節點的模式啟動。
- -e "xpack.security.enabled=false":停用安全設定,不需帳密即可存取 ES 服務。
- 75082a00ae85:指定要使用的 Image ID。
從 Docker Desktop 中,能確實看到 container 正在運行,點一下還可查看 log。
稍等一段時間後,在瀏覽器前往「localhost:9200」,便能看到 ES 的相關資訊,代表服務啟動完成了。
若服務因為虛擬記憶體區域(VMA)的數量不足而無法啟動,可在 log 中看見如下的訊息:
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
此時請在 CMD 先後執行以下指令,透過 WSL 對 Docker Desktop 執行 Linux 指令,將數量從預設的 65530 改為 262144(這會套用到往後運行的 container),最後再離開。
wsl -d docker-desktop sysctl -w vm.max_map_count=262144 exit
三、使用 GUI 工具
若要對 ES 進行如查詢、新增資料等操作,會根據 ES 提供的 REST API 發出請求。雖然在練習時使用 Postman 之類的工具就可做到,但為了方便,不妨透過 GUI 工具來輔助。筆者推薦一款叫做 Elasticvue 的瀏覽器附加元件,在 Chrome、Edge 與 Firefox 都能使用。
開啟附加元件後,輸入 ES 服務的 IP 與 port 號即可連上。
Elasticvue 提供了便於操作的介面,以下的畫面是對 ES 發出查詢所有資料的請求。
而以下的畫面是單獨查看一筆現有的資料,讀者可看到資料是以 JSON 格式儲存與呈現。
留言
張貼留言