iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0

在 Golang Phase,我們已經寫好 SearchService 介面,並用 Fake + Smoke Test 打通基本 API 流程。接下來,我們要讓服務真正依靠 Elasticsearch 來存取資料。今天的目標是使用 Docker 啟動單節點 Elasticsearch,建立一個固定 mapping(避免動態 mapping 出錯),並且驗證能插入與查詢


Step 1:用 Docker 啟動 ES

新增一個 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 名稱與版本。


Step 2:為什麼要固定 mapping?

Elasticsearch 預設是 dynamic mapping,會自動判斷欄位型別,例如:

  • 整數 → long
  • 浮點數 → double
  • 字串 → textkeyword

這在 Demo 時很方便,但在生產環境容易出問題:

  • title 有些是英文,有些是數字,ES 可能會誤判
  • schema 不固定,之後很難調優

因此,我們要手動建立固定 mapping。


Step 3:建立固定 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

Step 4:插入測試資料

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"

Step 5:最小查詢驗證

curl "http://localhost:9200/books/_search?q=golang&pretty"

輸出結果應該會包含 Golang 101


Step 6:小結

今天我們完成了:

  1. 用 Docker 啟動單節點 Elasticsearch
  2. 建立固定 mapping,避免動態 mapping 問題
  3. 插入測試資料,完成最小查詢

到這裡,Elasticsearch 已經能跑起來了。
明天,我們會開始 查詢打底,包含 matchboolterms 等常見 query,讓 /search 可以支援更靈活的檢索。


上一篇
Day 16 - Recap:複習 Golang 內容
下一篇
Day 18 - 查詢打底:`match` / `bool` / `terms`
系列文
用 Golang + Elasticsearch + Kubernetes 打造雲原生搜尋服務30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言