在 Golang Phase,我們已經寫好 SearchService 介面,並用 Fake + Smoke Test 打通基本 API 流程。接下來,我們要讓服務真正依靠 Elasticsearch 來存取資料。今天的目標是使用 Docker 啟動單節點 Elasticsearch,建立一個固定 mapping(避免動態 mapping 出錯),並且驗證能插入與查詢
新增一個 docker-compose.yml:
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
container_name: es01
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- ES_JAVA_OPTS=-Xms512m -Xmx512m
ports:
- "9200:9200"
volumes:
- esdata:/usr/share/elasticsearch/data
volumes:
esdata:
啟動:
docker compose up -d es01
檢查是否正常:
curl http://localhost:9200/
應該能看到 cluster 名稱與版本。
Elasticsearch 預設是 dynamic mapping,會自動判斷欄位型別,例如:
long
double
text 或 keyword
這在 Demo 時很方便,但在生產環境容易出問題:
title 有些是英文,有些是數字,ES 可能會誤判因此,我們要手動建立固定 mapping。
假設我們的文件結構是:
{
"id": "1",
"title": "Golang 101",
"tags": ["programming", "golang"],
"published_at": "2025-01-01T12:00:00Z"
}
那我們就定義一個 mapping:
curl -X PUT "http://localhost:9200/books" \
-H 'Content-Type: application/json' \
-d '{
"mappings": {
"properties": {
"title": { "type": "text" },
"tags": { "type": "keyword" },
"published_at": { "type": "date" }
}
}
}'
檢查 mapping:
curl http://localhost:9200/books/_mapping?pretty
curl -X POST "http://localhost:9200/books/_doc/1" \
-H 'Content-Type: application/json' \
-d '{"title":"Golang 101","tags":["programming","golang"],"published_at":"2025-01-01T12:00:00Z"}'
curl -X POST "http://localhost:9200/books/_doc/2" \
-H 'Content-Type: application/json' \
-d '{"title":"Elasticsearch入門","tags":["search","elasticsearch"],"published_at":"2025-02-01T09:00:00Z"}'
curl -X POST "http://localhost:9200/books/_refresh"
curl "http://localhost:9200/books/_search?q=golang&pretty"
輸出結果應該會包含 Golang 101。
今天我們完成了:
到這裡,Elasticsearch 已經能跑起來了。
明天,我們會開始 查詢打底,包含 match、bool、terms 等常見 query,讓 /search 可以支援更靈活的檢索。