ติดตั้ง Meilisearch Search Engine บน VPS

ติดตั้ง Meilisearch Search Engine บน VPS

กรกฎาคม 2026 · อ่าน 7 นาที

Meilisearch คือเครื่องมือค้นหาที่เขียนด้วยภาษา Rust มีความเร็วสูง typo-tolerant และเป็น open-source สามารถเลือกใช้งานได้ด้วยตัวเอง (self-hosted) บน VPS เว็บไซต์หรือแอปพลิเคชันส่วนใหญ่ต้องการระบบค้นหาที่ตอบสนองเร็ว รองรับการพิมพ์ผิดเล็กน้อย และไม่ต้องพึ่ง third-party service ที่มีค่าใช้จ่ายรายเดือน Meilisearch ช่วยเรื่องเหล่านี้ได้ดีมาก เพราะเป็น API ที่เรียบง่ายและเก็บข้อมูลไว้ในเครื่องของเราเอง

ติดตั้ง Meilisearch

วิธีง่ายที่สุดคือใช้ binary official ที่ build มาแล้ว ดาวน์โหลดจากเว็บ หรือใช้ docker container

# ดาวน์โหลด binary Linux 64-bit
mkdir -p ~/meilisearch
cd ~/meilisearch
curl -L https://github.com/meilisearch/meilisearch/releases/download/v1.13.0/meilisearch-linux-amd64 -o meilisearch
chmod +x meilisearch

# ทดสอบ
./meilisearch --version

หรือใช้ Docker (ถ้าติดตั้ง Docker แล้ว):

docker run -it --rm \
  -p 7700:7700 \
  -v ~/meilisearch_data:/meili_data \
  getmeili/meilisearch:latest

ตั้ง Meilisearch เป็น Systemd Service

เพื่อให้ Meilisearch ทำงานอย่างต่อเนื่องและ restart อัตโนมัติ ให้สร้าง systemd unit file:

sudo nano /etc/systemd/system/meilisearch.service

ใส่เนื้อหาดังนี้:

[Unit]
Description=Meilisearch search engine
After=network.target

[Service]
Type=simple
User=meilisearch
WorkingDirectory=/opt/meilisearch
ExecStart=/opt/meilisearch/meilisearch --db-path /var/lib/meilisearch
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
# สร้าง directory และ copy binary
sudo mkdir -p /opt/meilisearch /var/lib/meilisearch
sudo cp ~/meilisearch/meilisearch /opt/meilisearch/
sudo chown -R meilisearch:meilisearch /opt/meilisearch /var/lib/meilisearch

# เปิดใช้งาน service
sudo systemctl daemon-reload
sudo systemctl enable meilisearch
sudo systemctl start meilisearch

ตั้ง Master Key เพื่อความปลอดภัย

ตั้งแต่ Meilisearch โดย default ไม่มี authentication เพิ่มการป้องกัน ด้วยการสร้าง master key ยาวๆ:

# สร้าง random string สำหรับ master key
openssl rand -base64 32

แก้ไข systemd service เพื่อใช้ master key:

sudo nano /etc/systemd/system/meilisearch.service

# แก้ ExecStart บรรทัดดังนี้:
ExecStart=/opt/meilisearch/meilisearch --db-path /var/lib/meilisearch --master-key YOUR_GENERATED_KEY

sudo systemctl restart meilisearch
Tip: Master key ต้องส่งให้ client ทั้งสำหรับการเขียน (indexing) และการค้นหา ถ้าไม่ใส่ master key ใคร ๆ ก็สามารถอัปเดต index ได้ ซึ่งเสี่ยงต่อการสูญเสียข้อมูล

สร้าง Index และเพิ่มเอกสาร

Index คือที่เก็บข้อมูลค้นหา แต่ละ index มีโครงสร้างเฉพาะ สร้าง index ใช้ curl:

# สร้าง index ชื่อ "products"
curl -X POST http://localhost:7700/indexes \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_MASTER_KEY" \
  -d '{
    "uid": "products",
    "primaryKey": "id"
  }'

เพิ่มเอกสาร (documents) เข้า index:

curl -X POST http://localhost:7700/indexes/products/documents \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_MASTER_KEY" \
  -d '[
    {"id": 1, "name": "Laptop", "price": 999, "category": "electronics"},
    {"id": 2, "name": "Mouse", "price": 25, "category": "electronics"},
    {"id": 3, "name": "Keyboard", "price": 75, "category": "electronics"}
  ]'

ค้นหาข้อมูล

ทำการค้นหา (query) ใช้ GET request ไป endpoint /search:

# ค้นหาคำว่า "laptop"
curl http://localhost:7700/indexes/products/search \
  -H "Content-Type: application/json" \
  -d '{"q": "laptop"}'

# ค้นหา typo-tolerant "lapto" จะเจอ "laptop" ได้
curl http://localhost:7700/indexes/products/search \
  -H "Content-Type: application/json" \
  -d '{"q": "lapto"}'

# ตัวอย่างผลลัพธ์ JSON
# {"hits":[{"id":1,"name":"Laptop","price":999,"category":"electronics"}]}

ตรวจสอบว่า Meilisearch ทำงานถูกต้อง

# ตรวจ systemd service status
sudo systemctl status meilisearch

# ตรวจ health endpoint (ไม่ต้องใส่ master key)
curl http://localhost:7700/health

# ดู version
curl http://localhost:7700/version

# ดูรายการ index ทั้งหมด
curl http://localhost:7700/indexes \
  -H "Authorization: Bearer YOUR_MASTER_KEY"

# ดู stats (จำนวน documents เป็นต้น)
curl http://localhost:7700/stats \
  -H "Authorization: Bearer YOUR_MASTER_KEY"
Tip: ถ้า health endpoint ตอบด้วย {"status":"available"} แสดงว่า Meilisearch ทำงานปกติ ถ้า curl timeout หรือ connection refused แสดงว่า service ยังไม่เปิดหรือ port ผิด

แก้ปัญหาที่พบบ่อย

Error: Authorization header is invalid

ส่ง master key ผิดหรือขาด การเขียนข้อมูล (POST/PUT) ต้องมี master key ในทุก request แก้โดยเพิ่ม Authorization header:

# ตรวจ master key ที่ตั้งใน service
sudo grep "master-key" /etc/systemd/system/meilisearch.service

# ใส่ให้ถูกใน curl
curl -X POST http://localhost:7700/indexes/products/documents \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_EXACT_KEY" \
  -d '[...]'

Error: Connection refused port 7700

Meilisearch ไม่ได้ running หรือ listen port ผิด ตรวจสอบ:

# ตรวจ service status
sudo systemctl status meilisearch

# ดู logs
sudo journalctl -u meilisearch -n 20

# ตรวจว่า port 7700 เปิดแล้ว
sudo lsof -i :7700
# หรือ
netstat -tuln | grep 7700

# ถ้าไม่เห็น ให้ restart
sudo systemctl restart meilisearch

Error: Index not found

พยายามค้นหาใน index ที่ยังไม่สร้าง หรือชื่อ index ผิด:

# ตรวจดู index ทั้งหมด
curl http://localhost:7700/indexes \
  -H "Authorization: Bearer YOUR_MASTER_KEY"

# ถ้าไม่เห็น index ต้องสร้างก่อน
curl -X POST http://localhost:7700/indexes \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_MASTER_KEY" \
  -d '{"uid": "products", "primaryKey": "id"}'

Meilisearch ใช้พื้นที่ disk เยอะ

Meilisearch เก็บ full index ในหน่วยความจำและ disk เพื่อให้ query เร็ว ถ้า documents หลายล้านตัวหรือ field เยอะอาจใช้ GB หลายตัว ลดขนาด index ได้โดยลบ fields ที่ไม่ค้นหา หรือ delete index เก่า:

# ลบ index ทั้งหมด
curl -X DELETE http://localhost:7700/indexes/old_index \
  -H "Authorization: Bearer YOUR_MASTER_KEY"

คำถามที่พบบ่อย

Meilisearch กับ Elasticsearch ต่างกันอย่างไร?

Meilisearch ตั้งค่าง่ายกว่ามาก และเน้นที่ UX การค้นหา (typo-tolerant ตามค่า default) Elasticsearch ซับซ้อนกว่าแต่ scale ไปยัง dataset ขนาดใหญ่มากได้ดีกว่า Meilisearch จึงเหมาะกับเว็บไซต์และแอปทั่วไปที่ต้องการ search box ที่เร็วและตั้งค่าง่าย ส่วน Elasticsearch เหมาะกับงาน analytics, logging และ dataset ขนาดใหญ่ระดับ enterprise มากกว่า

Meilisearch ทำงานเร็วแค่ไหน?

ปกติ query respond ใน 1-10 ms ขึ้นอยู่กับขนาด index และ complexity ของ query Meilisearch เขียนด้วย Rust จึงไว กว่า Python-based solution และทำงานใน-memory จึง latency ต่ำ

ต้องให้ Meilisearch access จากภายนอก VPS ไหม?

ถ้า Meilisearch ใช้ internal เช่น web server บน VPS เดียวกัน ให้ bind ที่ localhost (127.0.0.1) เท่านั้น ห้ามเปิด port 7700 สาธารณะ ถ้าต้อง client หลายตัวเข้า ใช้ reverse proxy (Nginx) หน้า Meilisearch และ limit ด้วย IP whitelist หรือ authentication