คุณเคยสงสัยไหมว่าเว็บไซต์ใหญ่ๆ ค้นหาข้อมูลได้เร็วและแม่นยำขนาดไหน? คำตอบคือพวกเขาใช้เทคโนโลยีที่เรียกว่า Elasticsearch ร่วมกับ Vector Search วันนี้เราจะมาสอนคุณทำแบบง่ายๆ พร้อมใช้งานจริงได้เลย
Elasticsearch คืออะไร?
ลองนึกภาพห้องสมุดขนาดใหญ่มาก ที่มีหนังสือนับล้านเล่ม Elasticsearch ก็เหมือนระบบค้นหาอัจฉริยะที่ช่วยให้คุณหาหนังสือที่ต้องการได้ภายในเสี้ยววินาที มันสามารถค้นหาข้อความ ตัวเลข วันที่ หรือแม้แต่รูปภาพได้อย่างรวดเร็ว
Vector Search ทำงานอย่างไร?
แทนที่จะค้นหาแบบตรงๆ เช่น พิมพ์ "แมว" แล้วได้แมว การค้นหาเวกเตอร์จะเข้าใจความหมาย เช่น ค้นหา "สัตว์เลี้ยงขนฟู" ก็อาจได้ผลลัพธ์เป็นรูปแมว กระต่าย หรือหมีพูได้ เพราะมันเข้าใจว่าสิ่งเหล่านี้มีความหมายคล้ายกัน
เตรียมพร้อมก่อนเริ่มต้น
สิ่งที่คุณต้องมี:
- บัญชี HolySheep AI — สมัครที่นี่ รับเครดิตฟรีเมื่อลงทะเบียน ราคาถูกมากเพียง $0.42/ล้านตัวอักษร
- เครื่องคอมพิวเตอร์ที่ติดตั้ง Python 3.8 ขึ้นไป
- ความรู้พื้นฐานเรื่องการติดตั้งโปรแกรม
ขั้นตอนที่ 1: ติดตั้งโปรแกรมที่จำเป็น
เปิดหน้าต่าง Terminal หรือ Command Prompt แล้วพิมพ์คำสั่งด้านล่างนี้:
pip install elasticsearch openai numpy sentence-transformers
รอสักครู่จนการติดตั้งเสร็จสมบูรณ์ โปรแกรมเหล่านี้จะช่วยให้คุณสื่อสารกับ Elasticsearch และสร้าง Vector จากข้อความได้
ขั้นตอนที่ 2: เชื่อมต่อกับ Elasticsearch
สร้างไฟล์ใหม่ชื่อ connect_elasticsearch.py แล้วเขียนโค้ดด้านล่างนี้:
import requests
ตั้งค่าการเชื่อมต่อ Elasticsearch
ES_HOST = "http://localhost:9200"
INDEX_NAME = "my_documents"
ตรวจสอบการเชื่อมต่อ
def check_connection():
try:
response = requests.get(ES_HOST)
if response.status_code == 200:
print("✅ เชื่อมต่อ Elasticsearch สำเร็จ!")
print(f"📦 เวอร์ชัน: {response.json()['version']['number']}")
else:
print("❌ ไม่สามารถเชื่อมต่อได้")
except Exception as e:
print(f"⚠️ เกิดข้อผิดพลาด: {e}")
if __name__ == "__main__":
check_connection()
วิธีทดสอบ: เปิด Elasticsearch บนเครื่องของคุณก่อน แล้วรันคำสั่ง python connect_elasticsearch.py ควรจะเห็นข้อความยืนยันการเชื่อมต่อสำเร็จ
ขั้นตอนที่ 3: สร้างดัชนีสำหรับการค้นหาแบบผสม
ต่อไปเราจะสร้างดัชนีที่รองรับทั้งการค้นหาข้อความปกติและการค้นหาเวกเตอร์พร้อมกัน:
import requests
import json
ES_HOST = "http://localhost:9200"
INDEX_NAME = "hybrid_search"
สร้างดัชนีที่รองรับทั้ง keyword และ vector search
def create_hybrid_index():
mapping = {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "standard"
},
"content": {
"type": "text",
"analyzer": "standard"
},
"title_vector": {
"type": "dense_vector",
"dims": 384,
"index": True,
"similarity": "cosine"
},
"content_vector": {
"type": "dense_vector",
"dims": 384,
"index": True,
"similarity": "cosine"
}
}
}
}
# ลบดัชนีเดิมถ้ามี
requests.delete(f"{ES_HOST}/{INDEX_NAME}")
# สร้างดัชนีใหม่
response = requests.put(
f"{ES_HOST}/{INDEX_NAME}",
headers={"Content-Type": "application/json"},
data=json.dumps(mapping)
)
if response.status_code == 200:
print("✅ สร้างดัชนี hybrid_search สำเร็จ!")
else:
print(f"❌ เกิดข้อผิดพลาด: {response.text}")
if __name__ == "__main__":
create_hybrid_index()
จุดสำคัญคือช่อง dense_vector ที่มีขนาด 384 มิติ ซึ่งเป็นมาตรฐานของโมเดล Sentence-Transformers ยอดนิยม
ขั้นตอนที่ 4: แปลงข้อความเป็นเวกเตอร์ด้วย HolySheep AI
ต่อไปเราจะใช้ HolySheep AI เพื่อแปลงข้อความเป็นตัวเลขที่คอมพิวเตอร์เข้าใจ วิธีนี้ทำให้การค้นหาของคุณเข้าใจความหมายได้ดีขึ้นมาก:
import openai
import numpy as np
ตั้งค่า HolySheep API
openai.api_key = "YOUR_HOLYSHEEP_API_KEY"
openai.api_base = "https://api.holysheep.ai/v1"
def get_embedding(text):
"""แปลงข้อความเป็น vector โดยใช้ HolySheep AI"""
response = openai.Embedding.create(
model="text-embedding-3-small",
input=text
)
return np.array(response['data'][0]['embedding'])
ทดสอบการสร้าง vector
test_text = "วิธีการทำกาแฟสดแบบง่ายๆ"
vector = get_embedding(test_text)
print(f"✅ สร้าง vector สำเร็จ!")
print(f"📊 ขนาด vector: {len(vector)} มิติ")
print(f"🔢 ค่าตัวอย่าง (5 ค่าแรก): {vector[:5]}")
ข้อดีของ HolySheep AI คือ ความเร็วในการตอบสนองน้อยกว่า 50 มิลลิวินาที และราคาถูกมากเพียง $0.42 ต่อล้านตัวอักษร ประหยัดได้มากกว่า 85% เมื่อเทียบกับบริการอื่น
ขั้นตอนที่ 5: บันทึกเอกสารพร้อม Vector
ตอนนี้เราจะเพิ่มเอกสารเข้าไปในระบบโดยมีทั้งข้อความปกติและ vector:
import requests
import json
import openai
import numpy as np
openai.api_key = "YOUR_HOLYSHEEP_API_KEY"
openai.api_base = "https://api.holysheep.ai/v1"
ES_HOST = "http://localhost:9200"
INDEX_NAME = "hybrid_search"
def get_embedding(text):
response = openai.Embedding.create(
model="text-embedding-3-small",
input=text
)
return response['data'][0]['embedding']
def add_document(title, content):
"""เพิ่มเอกสารพร้อมสร้าง vector อัตโนมัติ"""
doc = {
"title": title,
"content": content,
"title_vector": get_embedding(title),
"content_vector": get_embedding(content)
}
response = requests.post(
f"{ES_HOST}/{INDEX_NAME}/_doc",
headers={"Content-Type": "application/json"},
data=json.dumps(doc)
)
if response.status_code == 201:
print(f"✅ เพิ่มเอกสาร: {title}")
else:
print(f"❌ ผิดพลาด: {response.text}")
เพิ่มเอกสารตัวอย่าง
add_document(
"วิธีทำกาแฟลาเต้",
"กาแฟลาเต้ทำจากเมล็ดกาแฟคั่วเข้ม ผสมกับนมร้อน ให้รสชาติเข้มข้น"
)
add_document(
"วิธีทำชานมไข่มุก",
"ชานมไข่มุกเป็นเครื่องดื่มยอดนิยมจากไต้หวัน มีไข่มุกเคี้ยวหนึบสนุก"
)
add_document(
"สูตรขนมปังโฮมเมด",
"ขนมปังโฮมเมดทำจากแป้งสาลีอิตาเลียน ยีดจนเนียนนุ่ม"
รันคำสั่งนี้แล้วคุณจะมีเอกสาร 3 ชิ้นในระบบ พร้อมสำหรับการค้นหาแบบต่างๆ
ขั้นตอนที่ 6: ค้นหาแบบผสม (Hybrid Search)
นี่คือหัวใจของบทความนี้ การค้นหาที่รวมทั้ง keyword และ semantic search:
import requests
import json
import openai
import numpy as np
openai.api_key = "YOUR_HOLYSHEEP_API_KEY"
openai.api_base = "https://api.holysheep.ai/v1"
ES_HOST = "http://localhost:9200"
INDEX_NAME = "hybrid_search"
def get_embedding(text):
response = openai.Embedding.create(
model="text-embedding-3-small",
input=text
)
return response['data'][0]['embedding']
def hybrid_search(query, top_k=3):
"""ค้นหาแบบผสม ทั้ง keyword และ vector"""
# สร้าง vector จากคำถาม
query_vector = get_embedding(query)
# ค้นหาแบบผสม
search_body = {
"size": top_k,
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": query,
"fields": ["title^2", "content"]
}
},
{
"knn": {
"field": "content_vector",
"vector": query_vector,
"k": top_k,
"num_candidates": 10
}
}
]
}
}
}
response = requests.post(
f"{ES_HOST}/{INDEX_NAME}/_search",
headers={"Content-Type": "application/json"},
data=json.dumps(search_body)
)
if response.status_code == 200:
results = response.json()['hits']['hits']
print(f"🔍 ผลการค้นหา: '{query}'")
print("-" * 50)
for i, hit in enumerate(results, 1):
print(f"{i}. {hit['_source']['title']}")
print(f" ความเหมือน: {hit['_score']:.2f}")
return results
else:
print(f"❌ ผิดพลาด: {response.text}")
return []
ทดสอบการค้นหา
print("ทดสอบการค้นหาแบบต่างๆ:\n")
hybrid_search("เครื่องดื่มร้อน")
print()
hybrid_search("ของกินเล่นทำเองได้")
เมื่อรันโค้ดนี้ คุณจะเห็นว่าการค้นหา "เครื่องดื่มร้อน" จะได้ผลลัพธ์เป็นกาแฟลาเต้ และ "ของกินเล่นทำเองได้" อาจได้ชานมไข่มุกหรือขนมปัง เพราะระบบเข้าใจความหมายว่าเป็นสิ่งที่ทำได้ที่บ้าน
ประโยชน์ที่คุณจะได้รับ
- ค้นหาได้แม่นยำกว่า — เข้าใจความหมายไม่ใช่แค่คำที่พิมพ์
- รวดเร็ว — ค้นหาข้อมูลนับล้านรายการได้ในมิลลิวินาที
- ยืดหยุ่น — รองรับทั้งข้อความ รูปภาพ และเสียง
- ประหยัด — ใช้ HolySheep AI ราคาถูกมาก
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
กรณีที่ 1: ไม่สามารถเชื่อมต่อ Elasticsearch ได้
อาการ: ข้อความ "Connection refused" หรือ "Cannot connect to ES_HOST"
วิธีแก้: ตรวจสอบว่า Elasticsearch ทำงานอยู่หรือไม่ และพอร์ต 9200 ไม่ถูกบล็อก
# วิธีแก้ไข: ตรวจสอบสถานะ Elasticsearch
import requests
try:
response = requests.get("http://localhost:9200", timeout=5)
print(f"✅ Elasticsearch ทำงาน: {response.json()['version']['number']}")
except requests.exceptions.ConnectionError:
print("❌ Elasticsearch ไม่ทำงาน กรุณาเริ่มต้นด้วยคำสั่ง:")
print(" elasticsearch (Linux/Mac)")
print(" ./elasticsearch.bat (Windows)")
กรณีที่ 2: ขนาด Vector ไม่ตรงกับดัชนี
อาการ: ข้อผิดพลาด "dimension mismatch" เมื่อบันทึกเอกสาร
วิธีแก้: ตรวจสอบว่าโมเดลที่ใช้กับขนาด vector ในดัชนีตรงกัน
# วิธีแก้ไข: ตรวจสอบขนาด vector ของโมเดล
DIMENSION_MAP = {
"text-embedding-3-small": 1536,
"text-embedding-3-base": 3072,
"text-embedding-ada-002": 1536
}
def validate_vector_dimension(model_name, vector):
expected_dim = DIMENSION_MAP.get(model_name, 1536)
actual_dim = len(vector)
if expected_dim != actual_dim:
raise ValueError(
f"❌ ขนาดไม่ตรง! โมเดล {model_name} คาดหวัง {expected_dim} "
f"แต่ได้ {actual_dim}"
)
print(f"✅ ขนาด vector ถูกต้อง: {actual_dim} มิติ")
return True
ตัวอย่างการใช้งาน
validate_vector_dimension("text-embedding-3-small", [0.1] * 1536)
กรณีที่ 3: API Key ไม่ถูกต้องหรือหมดอายุ
อาการ: ข้อผิดพลาด "401 Unauthorized" หรือ "Invalid API Key"
วิธีแก้: ตรวจสอบ API key และตั้งค่า base_url ให้ถูกต้อง
# วิธีแก้ไข: ตั้งค่า API อย่างถูกต้อง
import openai
✅ วิธีที่ถูกต้อง
openai.api_key = "YOUR_HOLYSHEEP_API_KEY"
openai.api_base = "https://api.holysheep.ai/v1" # ต้องเป็น URL นี้เท่านั้น
ทดสอบการเชื่อมต่อ
try:
models = openai.Model.list()
print("✅ เชื่อมต่อ HolySheep API สำเร็จ!")
print(f"📦 API Base: {openai.api_base}")
except Exception as e:
if "401" in str(e):
print("❌ API Key ไม่ถูกต้อง กรุณาตรวจสอบที่")
print(" https://www.holysheep.ai/dashboard/api-keys")
else:
print(f"❌ เกิดข้อผิดพลาด: {e}")
กรณีที่ 4: การค้นหาแบบ KNN ไม่ทำงาน
อาการ: ข้อผิดพลาด "vector field is not indexed"
วิธีแก้: ตรวจสอบว่าดัชนีมีการตั้งค่า index: true สำหรับ vector field
# วิธีแก้ไข: สร้างดัชนีใหม่พร้อม vector indexing
import requests
import json
ES_HOST = "http://localhost:9200"
INDEX_NAME = "fixed_hybrid_search"
สร้างดัชนีใหม่ที่มีการ index vector
mapping = {
"settings": {
"index": {
"knn": True # เปิดใช้งาน KNN
}
},
"mappings": {
"properties": {
"content": {"type": "text"},
"content_vector": {
"type": "dense_vector",
"dims": 1536,
"index": True,
"algorithm": "hnsw", # ใช้ HNSW สำหรับค้นหาเร็ว
"metric": "cosine"
}
}
}
}
requests.delete(f"{ES_HOST}/{INDEX_NAME}", ignore=[404])
response = requests.put(
f"{ES_HOST}/{INDEX_NAME}",
headers={"Content-Type": "application/json"},
data=json.dumps(mapping)
)
if response.status_code == 200:
print("✅ สร้างดัชนีพร้อม KNN indexing สำเร็จ!")
else:
print(f"❌ ผิดพลาด: {response.text}")
สรุป
วันนี้คุณได้เรียนรู้วิธีการรวม Elasticsearch การค้นหาข้อความเต็มรูปแบบกับการค้นหาเวกเตอร์แล้ว ซึ่งเป็นเทคนิคที่ใช้กันอย่างแพร่หลายในอุตสาหกรรม คุณสามารถนำไปประยุกต์ใช้กับระบบค้นหาของเว็บไซต์ ฐานข้อมูลเอกสาร หรือแม้แต่แชทบอทอัจฉริยะได้
ข้อดีที่สำคัญคือ คุณสามารถเริ่มต้นได้เลยด้วย บัญชี HolySheep AI ฟรี รับเครดิตทดลองใช้งาน ราคาถูกมากเพียง $0.42/ล้านตัวอักษร และตอบสนองเร็วมากไม่ถึง 50 มิลลิวินาที รองรับการชำระเงินผ่าน WeChat และ Alipay สำหรับผู้ใช้ในประเทศจีนอีกด้วย
👉 สมัคร HolySheep AI — รับเครดิตฟรีเมื่อลงทะเบียน