คุณเคยสงสัยไหมว่าเว็บไซต์ใหญ่ๆ ค้นหาข้อมูลได้เร็วและแม่นยำขนาดไหน? คำตอบคือพวกเขาใช้เทคโนโลยีที่เรียกว่า Elasticsearch ร่วมกับ Vector Search วันนี้เราจะมาสอนคุณทำแบบง่ายๆ พร้อมใช้งานจริงได้เลย

Elasticsearch คืออะไร?

ลองนึกภาพห้องสมุดขนาดใหญ่มาก ที่มีหนังสือนับล้านเล่ม Elasticsearch ก็เหมือนระบบค้นหาอัจฉริยะที่ช่วยให้คุณหาหนังสือที่ต้องการได้ภายในเสี้ยววินาที มันสามารถค้นหาข้อความ ตัวเลข วันที่ หรือแม้แต่รูปภาพได้อย่างรวดเร็ว

Vector Search ทำงานอย่างไร?

แทนที่จะค้นหาแบบตรงๆ เช่น พิมพ์ "แมว" แล้วได้แมว การค้นหาเวกเตอร์จะเข้าใจความหมาย เช่น ค้นหา "สัตว์เลี้ยงขนฟู" ก็อาจได้ผลลัพธ์เป็นรูปแมว กระต่าย หรือหมีพูได้ เพราะมันเข้าใจว่าสิ่งเหล่านี้มีความหมายคล้ายกัน

เตรียมพร้อมก่อนเริ่มต้น

สิ่งที่คุณต้องมี:

ขั้นตอนที่ 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("ของกินเล่นทำเองได้")

เมื่อรันโค้ดนี้ คุณจะเห็นว่าการค้นหา "เครื่องดื่มร้อน" จะได้ผลลัพธ์เป็นกาแฟลาเต้ และ "ของกินเล่นทำเองได้" อาจได้ชานมไข่มุกหรือขนมปัง เพราะระบบเข้าใจความหมายว่าเป็นสิ่งที่ทำได้ที่บ้าน

ประโยชน์ที่คุณจะได้รับ

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

กรณีที่ 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 — รับเครดิตฟรีเมื่อลงทะเบียน