Skip to content

Báo cáo Lựa chọn Tìm kiếm Ngữ nghĩa

1. Tổng quan

Báo cáo này đánh giá các giải pháp tìm kiếm ngữ nghĩa cho hệ thống BANA POS. Mục tiêu là nâng cấp tìm kiếm Typesense dựa trên từ khóa hiện có để hỗ trợ hiểu ngữ nghĩa — cho phép truy vấn dựa trên ý định, đối sánh từ đồng nghĩa, tìm kiếm đa ngôn ngữ (Tiếng Việt + Tiếng Anh), gợi ý sản phẩm và tính năng "tương tự sản phẩm này".

Hiện trạng: Typesense v2.1.0 với Kafka CDC (Debezium) đồng bộ từ PostgreSQL. 6 collection được index: products, merchants, organizers, categories, devices, sale-channels.

Mục tiêu: Hybrid search kết hợp tìm kiếm theo từ khóa (BM25) + ngữ nghĩa (vector/embedding) trên tất cả các collection với hỗ trợ Tiếng Việt + Tiếng Anh xuất sắc.

Ngày đánh giá: Tháng 02/2026

2. Kiến trúc Tìm kiếm Hiện tại

2.1. Luồng Dữ liệu

2.2. Các Collection được Index

CollectionEntityQuery ByĐa ngôn ngữ
productsProductidentifier, info.name.en, info.name.vi, info.description.en, info.description.vi
merchantsMerchantname.en, name.vi, slug, identifier, status, type, currency
organizersOrganizername.en, name.vi, description.en, description.vi
categoriesCategoryname.en, name.vi
devicesDevicename, identifier, statusKhông
sale-channelsSaleChannelname.en, name.vi

2.3. Bối cảnh Hạ tầng

Thành phầnPhiên bảnTrạng tháiLiên quan đến tìm kiếm ngữ nghĩa
PostgreSQL18 AlpineĐang chạyNguồn dữ liệu chính (source of truth). Có sẵn extension pgvector
Typesense2.1.0Đang chạyĐã triển khai. Hỗ trợ vector search nguyên gốc
RedisMới nhấtĐang chạyCache (DB 0), BullMQ (DB 0), Pub/Sub (DB 0), WebSocket (DB 4). Redis 8+ hỗ trợ vector search
Kafka + Debezium3.x + 2.4Đang chạyPipeline CDC cho đồng bộ thời gian thực
Drizzle ORM0.45.1Đang chạyHỗ trợ pgvector nguyên gốc (vector(), cosineDistance())
Bun>= 1.3.2Đang chạyRuntime. Tương thích gần 100% với Node.js
BullMQ5.14.3Đang chạyHạ tầng queue (finance, payment). Có thể tái sử dụng cho pipeline embedding

2.4. Khoảng cách Năng lực

Năng lựcHiện tại (Từ khóa)Mục tiêu (Ngữ nghĩa)
Đối sánh chính xác (SKU, mã vạch)Có (đường keyword)
Khả năng dung sai lỗi chính tả
Hiểu từ đồng nghĩaKhông
Truy vấn theo ý địnhKhông
"Tương tự sản phẩm này"Không
Truy vấn ngôn ngữ tự nhiênKhông
Hiểu ngữ nghĩa Tiếng ViệtKhông
Gợi ý sản phẩmKhông
Tìm kiếm xuyên ngôn ngữ (truy vấn EN → kết quả VI)Không

3. Đánh giá Vector Database

3.1. Các Ứng viên

#Giải phápLoạiNgôn ngữLicenseGitHub StarsTrạng thái tại BANA
1TypesenseSearch engine + VectorC++GPL-322k+Đã triển khai
2PostgreSQL pgvectorExtensionCPostgreSQL14k+DB đã triển khai
3Redis StackIn-memory DB + VectorCRSALv267k+Đã triển khai
4QdrantVector DB chuyên dụngRustApache-223k+Chưa triển khai
5MeilisearchSearch engine + VectorRustMIT49k+Chưa triển khai
6WeaviateVector DB + VectorizersGoBSD-314k+Chưa triển khai
7LanceDBEmbedded vector DBRustApache-25k+Chưa triển khai
8Milvus/ZillizVector DB phân tánGo/C++Apache-240k+Chưa triển khai
9ElasticsearchSearch engine + VectorJavaSSPL/ELv272k+Chưa triển khai
10OpenSearchSearch engine + VectorJavaApache-210k+Chưa triển khai
11PineconeManaged vector DB-ProprietaryN/AChưa triển khai
12ChromaDBEmbedding DBPython/RustApache-218k+Chưa triển khai
13VespaSearch platformJava/C++Apache-26k+Chưa triển khai

3.2. Ma trận Tính năng

Tính năngTypesensepgvectorRedis StackQdrantMeilisearchWeaviateMilvusElasticsearch
Vector Index (HNSW)Có (Arroy)Có (Lucene)
Hybrid SearchNative (rank fusion)Manual (SQL)KNN + filterDense+sparse fusionsemanticRatioAlpha-blendNativeRetriever API
Embedding tích hợp sẵnCó (S-BERT, E5)Không (BYO)Không (BYO)Không (BYO)Có (OpenAI, HF)Có (20+ modules)Không (BYO)Có (ELSER)
API Embedding bên ngoàiOpenAI, PaLMN/AN/AN/AOpenAI, Cohere, HFOpenAI, Cohere, HFN/AOpenAI, HF
BYO VectorsCó (float[])Có (vector)Có (float32/64)
Lọc MetadataĐầy đủĐầy đủ (SQL)Tối đa 10 attrsĐầy đủ (payload)FacetedĐầy đủ (where)Đầy đủĐầy đủ
Faceted SearchKhôngKhôngKhôngKhôngKhông
Multi-tenancyFilter-basedRLS/WHERETag-basedTiered shardsTenant tokensShard-per-tenantDB/collection/partitionIndex-per-tenant
TypeScript SDKTuyệt vờiDrizzle nativeClient có sẵnOfficial RESTTốtv3 clientNode.js SDKOfficial
Tương thích BunĐã xác nhậnĐã xác nhậnĐã xác nhậnDự kiếnDự kiếnDự kiếnDự kiếnDự kiến
Self-hosted DockerExtensionCó (Compose)Có (+ etcd)
Chỉ CloudKhôngKhôngKhôngKhôngKhôngKhôngKhôngKhông

3.3. Benchmark Hiệu năng

Giải phápRPS (1M vectors)P50 LatencyP99 LatencyMemory (100K x 1024d)Tốc độ Insert
Typesense~5K-10K<10ms<50ms~600MB + 2-6GB modelReal-time (CDC)
pgvector~471 QPS (99% recall)<50ms<100ms~600MB (HNSW)Real-time (SQL)
Redis Stack~3.4x Qdrant~3ms<10ms~600MB (in-memory)~15K vec/sec
QdrantCao~31ms~37ms~600MB (lượng tử hóa xuống ~60MB)~50K vec/sec
Meilisearch~5K-10K<50ms<100ms~35x kích thước dữ liệu (RAM!)Batch
Weaviate~1.7x ít hơn Redis~10ms<50ms~3GB cho 1M vectorsTrung bình
MilvusCao nhất trong open-source<10ms<30ms~600MB~50K vec/sec
Elasticsearch~5x nhanh hơn OpenSearch<50ms<100msYêu cầu cluster 128-256GB RAMTrung bình

3.4. Phân tích Chi phí (Self-Hosted, Hàng tháng)

Giải phápHạ tầng mớiOverhead RAMĐộ phức tạp vận hànhChi phí Hàng tháng
Typesense (nâng cấp)Không+2-6GB (embedding model)Không (đã chạy)$0
pgvectorKhông (extension)+600MB (HNSW index)Tối thiểu (ALTER TABLE)$0
Redis Stack (nâng cấp lên v8+)Không+600MB (vector index)Tối thiểu (Redis có sẵn)$0
Qdrant1 Docker container2-8GBTrung bình (service mới)$50-150
Meilisearch1 Docker container4-16GB (nặng!)Trung bình$50-200
WeaviateDocker Compose (multi-container)8-16GBCao (modules, config)$100-300
MilvusDocker + etcd + MinIO8-16GBCao (phân tán)$150-400
ElasticsearchDocker cluster (3+ nodes)128-256GBRất cao (JVM, ops)$300-1000+

3.5. Các Lý do Loại trừ Quan trọng cho BANA

Ứng viênLý do loại trừMức độ nghiêm trọng
ElasticsearchYêu cầu cluster 128-256GB RAM. Dựa trên JVM. Overhead vận hành lớn. Quá mức cần thiết cho POS search.NGHIÊM TRỌNG
OpenSearchTương tự Elasticsearch. Chậm hơn ES 5x cho vector search.NGHIÊM TRỌNG
VespaKhông có TypeScript/JavaScript SDK. Cấu hình dựa trên XML. Phức tạp ở quy mô internet, hoàn toàn quá mức.NGHIÊM TRỌNG
PineconeChỉ có cloud, không có lựa chọn self-hosted. Định giá theo mức tiêu thụ (đắt ở quy mô lớn). Khóa nhà cung cấp.CAO
ChromaDBChỉ single-node. HNSW in-memory (10M x 1536d = 60GB RAM). Không có multi-tenancy. Chưa sẵn sàng production ở quy mô lớn.CAO
MilvusYêu cầu etcd + MinIO cho chế độ phân tán. Phức tạp không tương xứng với quy mô POS (<1M sản phẩm).TRUNG BÌNH
WeaviateMulti-container Docker Compose. 8-16GB RAM. Cấu hình module phức tạp. Đường cong học tập dốc hơn.TRUNG BÌNH
MeilisearchKiến trúc single-node. Sử dụng RAM = 35x kích thước dữ liệu. Không scale ngang.TRUNG BÌNH

3.6. Ma trận Chấm điểm

Chấm điểm có trọng số (1-10, cao hơn = tốt hơn cho BANA):

Tiêu chí (Trọng số)TypesensepgvectorRedis StackQdrantMeilisearchWeaviateMilvus
Mức độ Tích hợp (25%)101095443
Hybrid Search (20%)9678898
TypeScript/Bun SDK (15%)101097876
Chi phí Vận hành (10%)101097765
Hiệu năng (10%)88109779
Multi-tenancy (5%)79687910
Khả năng mở rộng (5%)77695810
Hỗ trợ Tiếng Việt (10%)7777777
Tổng có Trọng số9.058.458.306.906.356.355.95

3.7. Phân tích Vòng Chung kết

Nâng cấp Vector cho Typesense (Điểm: 9.05) — NGƯỜI CHIẾN THẮNG

Vì sao #1: Đã được triển khai cùng đồng bộ CDC. Thêm tìm kiếm ngữ nghĩa = thêm trường embed vào schema collection hiện có. Không cần hạ tầng mới, không có service mới.

Điểm mạnh:

  • Hybrid search rank fusion native với tham số alpha cấu hình được (0 = thuần keyword, 1 = thuần ngữ nghĩa)
  • Các mô hình embedding tích hợp sẵn: ts/all-MiniLM-L12-v2, ts/e5-small, ts/distiluse-base-multilingual-cased-v2
  • Hỗ trợ API bên ngoài: OpenAI, Google PaLM được hỗ trợ nguyên gốc
  • BYO embedding tính sẵn qua trường float[]
  • Pipeline Kafka CDC hiện có tiếp tục hoạt động không thay đổi
  • query_by của Typesense hỗ trợ trộn các trường text và trường embedding trong một truy vấn
  • rerank_hybrid_matches: true để cải thiện chất lượng kết quả
  • Chi phí: $0 thêm

Điểm yếu:

  • Mô hình đa ngôn ngữ tích hợp sẵn (distiluse) đã cũ, chất lượng Tiếng Việt ở mức trung bình
  • Tải mô hình embedding cần thêm 2-6GB RAM
  • Không được thiết kế cho quy mô tỷ vector (đủ cho POS với <10M sản phẩm)

Hybrid search hoạt động trong Typesense như thế nào:

json
{
  "q": "laptop gaming",
  "query_by": "name_en,name_vi,description_en,embedding",
  "prefix": "true,true,true,false",
  "vector_query": "embedding:([], id: *, alpha: 0.3)",
  "filter_by": "status:=active && merchantId:=12345"
}

PostgreSQL pgvector (Điểm: 8.45) — BỔ SUNG

Vì sao #2: Không cần hạ tầng mới. Drizzle ORM có hỗ trợ pgvector nguyên gốc với kiểu cột vector() và các hàm khoảng cách (cosineDistance(), l2Distance(), innerProduct()).

Điểm mạnh:

  • Không có service mới — chỉ cần kích hoạt extension pgvector trên PostgreSQL hiện có
  • Tích hợp Drizzle ORM mượt mà:
    typescript
    import { vector, index } from 'drizzle-orm/pg-core';
    const products = pgTable('products', {
      embedding: vector('embedding', { dimensions: 1024 }),
    });
    // Query
    db.select().from(products).orderBy(cosineDistance(products.embedding, queryVector)).limit(10);
  • Lọc SQL đầy đủ kết hợp với vector search (merchantId, organizerId, category, v.v.)
  • Kiểu halfvec tiết kiệm 50% lưu trữ mà không mất recall
  • HNSW index cho truy vấn dưới 100ms với <10M vectors
  • pgvectorscale đạt 471 QPS với 99% recall trên 50M vectors
  • Index real-time (vector được index ngay khi INSERT/UPDATE)

Điểm yếu:

  • Không có rank fusion tích hợp — hybrid search (keyword + vector) phải triển khai ở tầng ứng dụng
  • Không tạo embedding tích hợp (chỉ BYO)
  • HNSW index tiêu thụ bộ nhớ đáng kể với dataset lớn

Phù hợp nhất cho: Gợi ý sản phẩm, "tương tự sản phẩm này", truy vấn tương tự dạng phân tích, tra cứu vector xuyên service.

Redis Stack Vector Search (Điểm: 8.30) — REAL-TIME

Vì sao #3: Đã chạy Redis cho cache, BullMQ và pub/sub. Redis 8+ bao gồm vector search nguyên gốc (trước đây yêu cầu Redis Stack module).

Điểm mạnh:

  • Latency P50 3ms — vector search nhanh nhất trong tất cả các ứng viên
  • Đã được tích hợp sâu (caching, queues, pub/sub, WebSocket)
  • Sử dụng client Redis hiện có (node-redis)
  • Hỗ trợ index HNSW, FLAT và SVS-VAMANA
  • KNN + pre-filter trên các trường TAG, TEXT, NUMERIC, GEO
  • Hiệu năng in-memory lý tưởng cho gợi ý checkout POS thời gian thực

Điểm yếu:

  • Tối đa 10 thuộc tính cho mỗi vector index
  • Tất cả trong bộ nhớ — chi phí RAM tăng tuyến tính
  • Không có tạo embedding tích hợp
  • Hybrid search hạn chế (không có rank fusion thực sự)

Phù hợp nhất cho: Tra cứu tương tự thời gian thực tại POS ("khách hàng cũng đã mua"), gợi ý checkout, cache tìm kiếm độ trễ cực thấp.

4. Đánh giá Mô hình Embedding

4.1. Yêu cầu Quan trọng: Tiếng Việt + Tiếng Anh

BANA sử dụng các trường i18n ({ en: string, vi: string }) cho products, merchants, organizers và categories. Mô hình embedding bắt buộc phải xử lý hiệu quả cả Tiếng Việt và Tiếng Anh. Hỗ trợ Tiếng Việt kém là lý do loại trừ.

4.2. Các Ứng viên

#Mô hìnhNhà cung cấpDimensionsTham sốMax TokensNgôn ngữLoại
1BGE-M3BAAI1024568M8,192100+Open-source
2jina-embeddings-v3Jina AI1024 (32-1024)570M8,19289API + Self-host
3Typesense distiluse-multilingualTypesense built-in512~135M512Đa ngôn ngữTích hợp sẵn
4Cohere Embed v4Cohere1536 (cấu hình được)-128K100+Chỉ API
5OpenAI text-embedding-3-smallOpenAI1536 (cấu hình được)-8,191Đa ngôn ngữChỉ API
6multilingual-e5-largeMicrosoft1024560M512100+Open-source
7gte-multilingual-baseAlibaba768~300M8,19270+Open-source
8Google gemini-embedding-001Google3072 (cấu hình được)-8,192100+API
9nomic-embed-text-v2-moeNomic AI768475M (305M active)8,192~100Open-source
10Voyage voyage-3.5Voyage AI1024-32KĐa ngôn ngữAPI
11OpenAI text-embedding-3-largeOpenAI3072 (cấu hình được)-8,191Đa ngôn ngữChỉ API
12mxbai-embed-largeMixedbread AI1024335M512Tập trung Tiếng AnhOpen-source
13all-MiniLM-L6-v2Sentence-Transformers38422M512Chỉ Tiếng AnhOpen-source
14AWS Titan V2AWS Bedrock1024-8,192Đa ngôn ngữAPI

4.3. Chất lượng Tiếng Việt

Mô hìnhHỗ trợ Tiếng Việt rõ ràngMTEB Multilingual RankĐánh giá Chất lượng Tiếng Việt
jina-embeddings-v3Top 30 ngôn ngữCaoXuất sắc
BGE-M3100+ ngôn ngữ (huấn luyện trên dữ liệu 170+ ngôn ngữ)CaoXuất sắc
Cohere Embed v4100+ ngôn ngữ#1 đa ngôn ngữTốt
multilingual-e5-largeMạnh trên Mr. TyDi đa ngôn ngữTốtTốt
gte-multilingual-base70+ ngôn ngữSOTA đa ngôn ngữTốt
gemini-embedding-001100+ ngôn ngữ#1 MTEB đa ngôn ngữTốt
nomic-embed-text-v2-moe~100 ngôn ngữTốtTrung bình
OpenAI text-embedding-3-small/largeĐa ngôn ngữ nhưng không tối ưuTốtTrung bình
Typesense distiluse-multilingualĐa ngôn ngữ (mô hình cũ hơn)Trung bìnhTrung bình
Voyage voyage-3.5Đa ngôn ngữ (không nổi bật)TốtTrung bình
mxbai-embed-largeTập trung Tiếng AnhN/AKém
all-MiniLM-L6-v2Chỉ Tiếng AnhN/AKém

4.4. Phân tích Chi phí

Mô hình100K docs (~50M tokens)1M docs (~500M tokens)10M docs (~5B tokens)Lựa chọn Self-Hosted
BGE-M3 (self-hosted)$0 (chỉ infra)$0 (chỉ infra)$0 (chỉ infra)Có (Ollama, TEI)
Typesense built-in$0$0$0Có (built-in)
multilingual-e5-large$0 (chỉ infra)$0 (chỉ infra)$0 (chỉ infra)Có (Ollama, TEI)
gte-multilingual-base$0 (chỉ infra)$0 (chỉ infra)$0 (chỉ infra)Có (HF, TEI)
OpenAI 3-small$1.00$10.00$100.00Không
OpenAI 3-large$6.50$65.00$650.00Không
Cohere Embed v4$6.00$60.00$600.00Không
gemini-embedding-001$7.50 (có gói miễn phí)$75.00$750.00Không
Voyage voyage-3.5$3.00 (200M đầu tiên miễn phí)$18.00$300.00Không
jina-embeddings-v3Theo token (dùng thử 10M)Theo tokenTheo tokenMột phần

Giả định ~500 token mỗi tài liệu sản phẩm (tiêu đề + mô tả + danh mục bằng cả en + vi).

Chi phí Hạ tầng Self-Hosted:

SetupChi phí Hàng thángThroughputPhù hợp nhất cho
Ollama trên CPU (4-core, 8GB)~$30-50/tháng VPS~50-100 docs/secCatalog nhỏ-trung
HuggingFace TEI trên CPU~$50-80/tháng VPS~100-200 docs/secCatalog trung bình
HuggingFace TEI trên GPU (T4)~$150-300/tháng~500-2,000 docs/secCatalog lớn

4.5. Lựa chọn Self-Hosting cho TypeScript/Bun

RuntimeMô hìnhTương thích BunLatencyPhù hợp nhất cho
Ollama (Docker)bge-m3, nomic-embed, mxbai-embedCó (REST API)10-30ms/embedProduction. Docker đơn giản, quản lý mô hình, REST API
HuggingFace TEI (Docker)Bất kỳ HF model nào (bge-m3, e5, gte)Có (REST API)5-20ms/embedProduction. Token batching, Flash Attention, Prometheus metrics
Transformers.js (in-process)Mô hình nhỏ hơn (<150M params)Có (v4)20-50ms/embedPrototype. Chỉ CPU, mô hình lớn chậm
ONNX Runtime (native addon)Mô hình export ONNXMột phần<10ms/embed (int8)Quan trọng về hiệu năng. Setup phức tạp

4.6. Chiến lược Embedding cho Sản phẩm BANA

typescript
// Khuyến nghị: Nối các trường liên quan để tạo embedding
function createProductEmbeddingText(product: TProduct): string {
  const parts = [
    // Primary: product name (both languages, highest weight)
    product.name?.en, product.name?.vi,
    // Secondary: description
    product.description?.en, product.description?.vi,
    // Tertiary: structured attributes
    product.category?.name?.en, product.category?.name?.vi,
    product.merchant?.name?.en,
    // Variant info
    ...product.variants?.map(v => `${v.name?.en || ''} ${v.name?.vi || ''}`),
    // Identifiers (for exact match fallback)
    product.sku, product.barcode,
  ].filter(Boolean);

  return parts.join(' | ');
}

Nguyên tắc cốt lõi:

  • Trường quan trọng nhất (tên) đứng đầu — mô hình có trọng số cao hơn cho các token đầu
  • Dấu phân tách (|) giữa các trường để ngăn rò rỉ ngữ nghĩa
  • Cả hai phiên bản ngôn ngữ cho tìm kiếm xuyên ngôn ngữ
  • Giữ tổng số dưới 8,192 tokens cho BGE-M3 (dữ liệu sản phẩm thường <200 tokens)
  • Hash văn bản embedding; bỏ qua re-embed nếu hash không thay đổi

4.7. Ma trận Chấm điểm

Tiêu chí (Trọng số)BGE-M3jina-v3TS built-inCohere v4OpenAI 3-smalle5-multigte-multi
Chất lượng Tiếng Việt (25%)91068688
Chất lượng Tiếng Anh (15%)8869878
Lựa chọn Self-Hosted (15%)108103399
Hiệu quả Chi phí (15%)10710691010
Tương thích Bun/TS (10%)88108977
Dimensions/Lưu trữ (10%)8979987
Độ dài Context (10%)99710869
Tổng có Trọng số9.008.607.557.156.908.058.15

4.8. Phán quyết Mô hình Embedding

BGE-M3 (Điểm: 9.00) — NGƯỜI CHIẾN THẮNG

  • 100+ ngôn ngữ bao gồm Tiếng Việt, huấn luyện trên dữ liệu 170+ ngôn ngữ
  • Triple retrieval: Dense + Sparse (kiểu BM25) + ColBERT multi-vector trong một mô hình
  • 1024 dimensions, 8,192 token context, 568M tham số
  • Self-hosted qua Ollama: ollama pull bge-m3 (1.2GB), REST API tại localhost:11434
  • Cũng qua HuggingFace TEI: Docker serving cấp production với Prometheus metrics
  • Chi phí: $0 mỗi token (self-hosted), ~$30-80/tháng hạ tầng

jina-embeddings-v3 (Điểm: 8.60) — VỀ NHÌ

  • Tiếng Việt nằm rõ ràng trong top 30 ngôn ngữ có hiệu năng tốt nhất (chất lượng Tiếng Việt tốt nhất)
  • 89 ngôn ngữ, 570M tham số, 1024 dimensions (cấu hình 32-1024)
  • LoRA adapters theo task: retrieval, text-matching, classification
  • Lưu ý: Định giá API theo token; lựa chọn self-hosting hạn chế hơn

Typesense Built-in distiluse-multilingual (Điểm: 7.55) — KHỞI ĐỘNG NHANH

  • Không cấu hình — chỉ cần thêm trường embed vào schema collection
  • 512 dimensions, đa ngôn ngữ
  • Chất lượng Tiếng Việt: Trung bình (mô hình cũ hơn, không tối ưu cụ thể)
  • Phù hợp nhất cho: Phase 1 khởi động nhanh, xác thực hybrid search trước khi đầu tư vào mô hình tốt hơn

5. Đánh giá Kiến trúc

5.1. Các Kiến trúc Ứng viên

Phương án A: Chỉ Typesense (Đơn giản nhất)

Khía cạnhĐánh giá
Công sức1-2 tuần
Hạ tầng mớiKhông
Chi phí hàng tháng$0 thêm
Chất lượng Tiếng ViệtTrung bình (distiluse-multilingual)
Chất lượng Hybrid searchXuất sắc (rank fusion native)
Latency tìm kiếm<50ms

Phương án B: Typesense + Ollama BGE-M3 (Cân bằng tốt nhất)

Khía cạnhĐánh giá
Công sức3-4 tuần
Hạ tầng mới1 Docker container (Ollama, ~2GB RAM)
Chi phí hàng tháng~$30-80 (Ollama trên server có sẵn hoặc VPS nhỏ)
Chất lượng Tiếng ViệtXuất sắc (BGE-M3, 100+ ngôn ngữ)
Chất lượng Hybrid searchXuất sắc (Typesense rank fusion với embedding chất lượng cao)
Latency tìm kiếm<50ms search + 10-30ms embedding (cached: 5ms)

Phương án C: Typesense + pgvector + Ollama (Toàn năng)

Khía cạnhĐánh giá
Công sức4-6 tuần
Hạ tầng mới1 Docker container (Ollama) + extension pgvector
Chi phí hàng tháng~$30-80
Năng lựcHybrid search + gợi ý + "tương tự" + phân tích SQL
Latency tìm kiếm<50ms search, <100ms recommendations

Phương án D: Chỉ Cloud API (Công sức thấp nhất)

Khía cạnhĐánh giá
Công sức1 tuần
Hạ tầng mớiKhông
Chi phí hàng tháng$5-50 chi phí API (theo khối lượng dữ liệu)
Chất lượng Tiếng ViệtTốt (OpenAI) đến Xuất sắc (Cohere v4)
Phụ thuộc nhà cung cấpCao (API key, giới hạn rate, thay đổi giá)

5.2. Chấm điểm Kiến trúc

Tiêu chí (Trọng số)Phương án APhương án BPhương án CPhương án D
Chất lượng Tiếng Việt (25%)610107
Công sức Tích hợp (20%)107510
Chi phí Vận hành (15%)10886
Đầy đủ Tính năng (15%)68106
Chủ quyền Dữ liệu (10%)1010103
Chất lượng Tìm kiếm (10%)7998
Bảo trì (5%)10769
Tổng có Trọng số7.858.558.157.05

6.1. Cách Hybrid Search Hoạt động

Hybrid search chạy tìm kiếm theo từ khóa (BM25) và ngữ nghĩa (vector) song song, sau đó hợp nhất kết quả bằng Reciprocal Rank Fusion (RRF):

RRF_score(document) = SUM( 1 / (rank_i + k) )

Trong đó rank_i là vị trí của tài liệu trong từng danh sách kết quả, và k là hằng số làm mịn (thường là 60).

Typesense triển khai điều này nguyên gốc qua tham số alpha:

  • alpha: 0.0 = tìm kiếm thuần từ khóa
  • alpha: 0.3 = 70% từ khóa, 30% ngữ nghĩa (khuyến nghị bắt đầu)
  • alpha: 0.5 = pha trộn đều
  • alpha: 1.0 = tìm kiếm thuần ngữ nghĩa

6.2. Khi nào Tìm kiếm Ngữ nghĩa TỆ HƠN Từ khóa

Đây là yếu tố quan trọng cho hệ thống POS:

Loại Truy vấnChế độ Tìm kiếm Tốt nhấtVì sao
Mã SKU (SKU-2847-B)Chỉ từ khóaNgữ nghĩa có thể nhầm lẫn các mã tương tự
Mã vạch (8935049001234)Chỉ từ khóaYêu cầu đối sánh chính xác
Số model (iPhone 15 Pro Max 256GB)Chủ yếu từ khóaNgữ nghĩa có thể nhầm lẫn các model tương tự
Tra cứu giá (price < 500000)Chỉ filterKhông phải vấn đề tìm kiếm
Ngôn ngữ tự nhiên (tai nghe không dây giá rẻ)HybridNgữ nghĩa hiểu ý định
Truy vấn từ đồng nghĩa (giày chạy bộsneakers)Chủ yếu ngữ nghĩaTừ khóa không khớp từ đồng nghĩa
Truy vấn Tiếng Việt (tai nghe khong day)HybridNgữ nghĩa xử lý Tiếng Việt tốt

6.3. Chiến lược Phân loại Truy vấn

6.4. Re-ranking (Tùy chọn, Phase 3+)

Truy xuất hai giai đoạn cải thiện chất lượng 20-35% nhưng tăng latency 200-500ms:

  1. Giai đoạn 1 (Truy xuất): Hybrid search Typesense trả về top 50-100 ứng viên (~20ms)
  2. Giai đoạn 2 (Re-rank): Cross-encoder chấm điểm cặp truy vấn + ứng viên để có độ liên quan chính xác
Re-rankerLatency (top 20)Chất lượngChi phí
Cohere Rerank 4~200msTốt nhất$2/1K queries
BGE-reranker-v2-m3~150msRất tốt, đa ngôn ngữMiễn phí (self-hosted)
ms-marco-MiniLM-L-6-v2~100msTốtMiễn phí (self-hosted)

Khuyến nghị: Bỏ qua re-ranking ban đầu. Thêm vào trong Phase 3+ chỉ khi các chỉ số chất lượng tìm kiếm cho thấy cần thiết.

7. Thiết kế Pipeline Dữ liệu

7.1. Pipeline Embedding (Kiến trúc Phương án B)

7.2. Vô hiệu hóa Embedding (Invalidation)

Các trường kích hoạt re-embedding so với các trường không cần:

Kích hoạt Re-embeddingBỏ qua Re-embedding
Tên sản phẩm (en, vi)Thay đổi giá
Mô tả sản phẩm (en, vi)Số lượng tồn kho
Gán danh mụcThứ tự sắp xếp
Thương hiệu / thuộc tính chínhCờ nội bộ
Tên variantTrạng thái (lọc, không embed)

Triển khai: Hash SHA-256 của các trường liên quan đến embedding. So sánh hash khi có CDC event; bỏ qua re-embedding nếu không thay đổi.

7.3. Thiết kế Queue BullMQ

Theo pattern BullMQ hiện có của BANA (giống mq-pay và finance):

Queue: embedding:generation:P01, P02, P03  (3 partitions for load distribution)
Queue: embedding:indexing:P01, P02, P03

Concurrency: 10 jobs per partition (configurable)
Retry: Exponential backoff, max 3 retries
Dead Letter Queue: embedding:generation:failed

8. Ước tính Bộ nhớ

8.1. Công thức Bộ nhớ HNSW Index

Memory = 1.1 * (4 * dimensions + 8 * m) * num_vectors bytes

Trong đó m là số liên kết hai chiều tối đa của HNSW (thường là 16).

8.2. Dự báo cho BANA

Quy môSản phẩmDimensionsBộ nhớ HNSWTổng Typesense (+ model)Tổng pgvector
Nhỏ10,0001024 (BGE-M3)~60 MB~2.1 GB (+ 2GB model)~60 MB
Trung bình100,0001024~600 MB~2.6 GB (+ 2GB model)~600 MB
Lớn1,000,0001024~6 GB~8 GB (+ 2GB model)~6 GB
Nhỏ (halfvec)100,0001024~300 MBN/A~300 MB

Lưu ý: Các ước tính này chỉ dành cho collection products. Nhân với ~1.3x cho tất cả 6 collections (các collection khác nhỏ hơn).

9. Quyết định

9.1. Lựa chọn: Phương án B — Typesense + Ollama BGE-M3 (Điểm: 8.55)

Vector Database được chọn: Typesense (nâng cấp vector cho triển khai hiện có) Mô hình Embedding được chọn: BGE-M3 qua Ollama (self-hosted) Kiến trúc: Typesense hybrid search với embedding BGE-M3 tính sẵn qua pipeline BullMQ

9.2. Lý do

  1. Tận dụng hạ tầng có sẵn — Typesense đã được triển khai cùng đồng bộ CDC. Không cần service database mới.
  2. Hỗ trợ Tiếng Việt + Tiếng Anh tốt nhất — BGE-M3 xử lý 100+ ngôn ngữ bao gồm Tiếng Việt với chất lượng xuất sắc. Self-hosted có nghĩa là không phụ thuộc API.
  3. Không có chi phí theo token — Tự sinh embedding self-hosted. Chi phí hạ tầng dự đoán được (~$30-80/tháng cho Ollama).
  4. Hybrid search đã được kiểm chứng production — Typesense rank fusion kết hợp tìm kiếm từ khóa + ngữ nghĩa nguyên gốc. Tham số alpha cấu hình được để tinh chỉnh.
  5. Phù hợp pattern BullMQ hiện có — Pipeline embedding sử dụng cùng kiến trúc queue như package finance/payment (3 partitions, concurrency cấu hình được).
  6. Chủ quyền dữ liệu — Tất cả dữ liệu và mô hình ở lại trên server của bạn. Không có cuộc gọi API bên ngoài cho embedding.
  7. Migration tăng dần — Có thể bắt đầu với Phase 1 (mô hình built-in của Typesense) trong 1-2 tuần, sau đó nâng cấp lên BGE-M3 ở Phase 2.

9.3. Các Giai đoạn Triển khai

PhaseThời gianMô tảTác động
Phase 1Tuần 1-2Thêm embedding tích hợp Typesense (ts/distiluse-multilingual) vào collection products. Bật hybrid search với alpha: 0.3. Test với pipeline CDC hiện có. Phân loại truy vấn cho SKU vs ngôn ngữ tự nhiên.Tìm kiếm ngữ nghĩa ngay lập tức. Chi phí $0.
Phase 2Tuần 3-4Triển khai Docker container Ollama + BGE-M3. Xây dựng pipeline embedding BullMQ (generation + indexing). Thay mô hình built-in bằng vector float[] BGE-M3 tính sẵn. Tinh chỉnh tham số alpha.Chất lượng tìm kiếm Tiếng Việt vượt trội.
Phase 3Tuần 5-6Mở rộng cho tất cả 6 collections. Thêm cache embedding truy vấn (Redis). Triển khai search analytics (CTR, tỷ lệ zero-results). Thêm "sản phẩm liên quan" sử dụng độ tương tự vector.Tìm kiếm ngữ nghĩa đầy đủ trên tất cả entity.
Phase 4Tương laiThêm pgvector cho gợi ý cấp SQL. Thêm cross-encoder re-ranking cho truy vấn giá trị cao. Triển khai gợi ý "ý bạn là?". Fine-tune mô hình embedding nếu cần.Tính năng nâng cao.

9.4. Tóm tắt Chi phí

Thành phầnTrạng tháiChi phí Hàng tháng
Typesense (có sẵn)Đã chạy$0
Ollama BGE-M3 (Docker trên server có sẵn hoặc VPS $30)Mới$0-30
Cache embedding Redis (Redis DB có sẵn)Đã chạy$0
BullMQ workers (hạ tầng Bun có sẵn)Tái sử dụng pattern$0
Pipeline Kafka CDC (có sẵn)Đã chạy$0
Tổng$0-30/tháng

10.1. Lý do Nghiên cứu

PostgreSQL cung cấp khả năng Full-Text Search (FTS) tích hợp sẵn, và một số extension hứa hẹn chấm điểm BM25 trong chính PostgreSQL. Phụ lục này đánh giá liệu PostgreSQL-native search có thể thay thế hoặc bổ sung cho kiến trúc Typesense + Ollama BGE-M3 đã chọn ở Phần 9.

Các câu hỏi chính được nghiên cứu:

  • PostgreSQL có thể cung cấp BM25 scoring nguyên gốc không?
  • PostgreSQL FTS xử lý văn bản Tiếng Việt tốt đến đâu?
  • Drizzle ORM tích hợp với PostgreSQL FTS như thế nào?
  • PostgreSQL FTS nên thay thế hay bổ sung cho Typesense?

10.2. So sánh Extension BM25

PostgreSQL FTS native sử dụng ts_rank (biến thể TF-IDF), không phải BM25. Một số extension thêm BM25 scoring:

ExtensionBM25LicenseAn toàn WALTiếng ViệtDrizzle ORMTrạng thái Production
Native FTSKhông (TF-IDF)PostgreSQLCustom configĐầy đủHàng thập kỷ
ParadeDB pg_searchAGPL-3.0Không (community)Chỉ ICUChỉ Raw SQLActive ($12M tài trợ)
Timescale pg_textsearchPostgreSQLChưa biếtChưa biếtChỉ Raw SQLChỉ Preview
VectorChord-BM25Apache-2.0Chưa biếtChưa biếtChỉ Raw SQLRất mới
PGroongaKhông (Groonga)PostgreSQLNativeChỉ Raw SQL10+ năm trưởng thành
pg_trgmKhông (similarity)PostgreSQLHoạt động với unaccentĐầy đủHàng thập kỷ

10.2.1. ParadeDB pg_search — BỎ QUA

ParadeDB tích hợp BM25 search vào PostgreSQL qua engine Tantivy (Rust, lấy cảm hứng Lucene). Hiệu năng nhanh hơn 20-1000x so với FTS native.

Vấn đề quan trọng cho BANA:

  • License AGPL-3.0 — Nếu bạn sửa đổi pg_search và cung cấp qua mạng (SaaS/POS), bạn có thể phải release các sửa đổi. Cần xem xét pháp lý cho mục đích thương mại.
  • Không hỗ trợ WAL trong phiên bản community — PostgreSQL crash = phải rebuild toàn bộ BM25 index. Phiên bản enterprise thêm WAL nhưng yêu cầu license trả phí.
  • Một BM25 index mỗi bảng — Không thể tạo nhiều BM25 index với các cấu hình khác nhau trên cùng một bảng.
  • Không có tokenizer Tiếng Việt — Tantivy cung cấp ICU tokenization (ranh giới từ Unicode) nhưng không có phân đoạn từ ghép Tiếng Việt theo ngôn ngữ học.
  • Không có tích hợp Drizzle ORM — Tất cả query qua raw SQL (db.execute(sql\...`)`).

10.2.2. Timescale pg_textsearch — THEO DÕI

Đây là extension được hỏi ban đầu. Phát triển bởi Timescale với license tương thích PostgreSQL (permissive). Tuy nhiên, đang ở trạng thái preview — chưa phù hợp triển khai production. Đáng theo dõi cho phiên bản GA tương lai.

10.2.3. PGroonga — XEM XÉT

PGroonga (dựa trên Groonga, v4.0.5) là extension duy nhất hỗ trợ Tiếng Việt nguyên gốc ngay lập tức, xử lý tất cả các ngôn ngữ bao gồm CJK và Tiếng Việt mà không cần cấu hình tùy chỉnh. Có sẵn trên Supabase như extension built-in. Đánh đổi: thêm Groonga như dependency bên ngoài.

10.3. Tìm kiếm Tiếng Việt trong PostgreSQL

10.3.1. Thách thức Tiếng Việt

Văn bản Tiếng Việt đặt ra những thách thức đặc biệt cho tìm kiếm:

Thách thứcVí dụTác động
Dấu thanhà á ả ã ạ đều là biến thể của aNgười dùng có thể tìm kiếm không có dấu
Ký tự képế = mũ + sắc (2 dấu)Cần chuẩn hóa ký tự
Từ ghép"Hà Nội" = 2 âm tiết, 1 từTokenization theo khoảng trắng phá vỡ từ ghép
Không có cấu hình PG sẵnTiếng Việt không có trong stemmer SnowballCần cấu hình text search tùy chỉnh

10.3.2. Giải pháp unaccent

Từ PostgreSQL 11, unaccent.rules mặc định bao gồm tất cả ký tự Tiếng Việt:

sql
CREATE EXTENSION IF NOT EXISTS unaccent;

-- Test: all Vietnamese diacritics handled
SELECT unaccent('cà phê điện thoại');  -- → 'ca phe dien thoai'
SELECT unaccent('Hà Nội thủ đô');      -- → 'Ha Noi thu do'

Các ký tự được xử lý: ắ ằ ẳ ẵ ặa, ế ề ể ễ ệe, ớ ờ ở ỡ ợo, ứ ừ ử ữ ựu, đd, và tất cả các kết hợp dấu thanh.

Quan trọng: unaccent()STABLE (không phải IMMUTABLE), do đó cần wrapper immutable cho indexes và generated columns:

sql
CREATE OR REPLACE FUNCTION f_unaccent(text)
RETURNS text AS $$
  SELECT public.unaccent('public.unaccent', $1);
$$ LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT;

10.3.3. Cấu hình Text Search Tiếng Việt Tùy chỉnh

sql
CREATE TEXT SEARCH CONFIGURATION vietnamese (COPY = simple);
ALTER TEXT SEARCH CONFIGURATION vietnamese
  ALTER MAPPING FOR asciiword, asciihword, hword_asciipart,
                    word, hword, hword_part
  WITH unaccent, simple;

Điều này kích hoạt FTS Tiếng Việt nơi "ca phe" khớp "cà phê" qua chuẩn hóa dấu.

10.3.4. Công cụ Phân đoạn Từ Tiếng Việt

Công cụNgôn ngữTốc độExtension PostgreSQL?
CocCoc TokenizerC++Rất nhanhKhông
UndertheseaPythonTốtKhông
VnCoreNLPJavaTốtKhông
PGroonga/GroongaCNhanh

Không có công cụ NLP Tiếng Việt nào có extension PostgreSQL nguyên gốc (trừ PGroonga). Đối với phân đoạn từ ghép, cần tiền xử lý ở tầng ứng dụng.

10.3.5. ICU Accent-Insensitive Collation (PostgreSQL 12+)

sql
CREATE COLLATION vi_accent_insensitive (
  provider = icu,
  deterministic = false,
  locale = 'vi-u-ks-level1'
);

Điều này cung cấp so sánh không nhạy với dấu ở cấp database nhưng không thể sử dụng với pattern LIKE (chỉ với =) và có chi phí hiệu năng.

10.4. Tích hợp Drizzle ORM

10.4.1. Kiểu tsvector Tùy chỉnh

Drizzle ORM không có hỗ trợ tsvector nguyên gốc. Cần định nghĩa kiểu tùy chỉnh:

typescript
import { customType } from 'drizzle-orm/pg-core';

export const tsvector = customType<{ data: string }>({
  dataType() {
    return 'tsvector';
  },
});

10.4.2. Schema với Generated Column + GIN Index

typescript
import { SQL, sql } from 'drizzle-orm';
import { index, pgTable, text, bigint } from 'drizzle-orm/pg-core';

export const products = pgTable(
  'products',
  {
    id: bigint('id', { mode: 'bigint' }).primaryKey(),
    nameVi: text('name_vi').notNull(),
    nameEn: text('name_en'),
    nameSearch: tsvector('name_search')
      .generatedAlwaysAs(
        (): SQL =>
          sql`setweight(to_tsvector('vietnamese',
                f_unaccent(coalesce(${products.nameVi}, ''))), 'A') ||
              setweight(to_tsvector('english',
                coalesce(${products.nameEn}, '')), 'B')`,
      ),
  },
  (t) => [
    // GIN index for full-text search
    index('idx_products_name_search').using('gin', t.nameSearch),
    // GIN trigram index for fuzzy search
    index('idx_products_name_vi_trgm').using(
      'gin',
      sql`f_unaccent(lower(${t.nameVi}))`.op('gin_trgm_ops'),
    ),
  ],
);

Ràng buộc quan trọng: Biểu thức generation chỉ được sử dụng các hàm IMMUTABLE. Cả to_tsvector() (với regconfig rõ ràng 'vietnamese') và f_unaccent() (wrapper tùy chỉnh của chúng ta) đều là immutable.

10.4.3. Pattern Truy vấn với Drizzle

typescript
// Full-text search with ranking
const query = sql`plainto_tsquery('vietnamese', f_unaccent(${searchTerm}))`;
const results = await db
  .select({
    id: products.id,
    nameVi: products.nameVi,
    rank: sql<number>`ts_rank(${products.nameSearch}, ${query})`.as('rank'),
  })
  .from(products)
  .where(sql`${products.nameSearch} @@ ${query}`)
  .orderBy(desc(sql`ts_rank(${products.nameSearch}, ${query})`));

// Fuzzy trigram search (typo-tolerant fallback)
const fuzzy = await db
  .select({
    id: products.id,
    sim: sql<number>`similarity(
      f_unaccent(lower(${products.nameVi})),
      f_unaccent(lower(${term}))
    )`.as('sim'),
  })
  .from(products)
  .where(sql`f_unaccent(lower(${products.nameVi})) % f_unaccent(lower(${term}))`)
  .orderBy(desc(sql`similarity(...)`));

10.4.4. Migration trong BANA (Pattern IGNIS)

typescript
// src/migrations/processes/search-0001-setup-vietnamese-fts.ts
export const process: TMigrationProcess = {
  name: 'search-0001-setup-vietnamese-fts',
  handler: async ({ connector }) => {
    await connector.execute(sql`CREATE EXTENSION IF NOT EXISTS unaccent`);
    await connector.execute(sql`CREATE EXTENSION IF NOT EXISTS pg_trgm`);
    await connector.execute(sql`
      CREATE OR REPLACE FUNCTION f_unaccent(text)
      RETURNS text AS $$
        SELECT public.unaccent('public.unaccent', $1);
      $$ LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT
    `);
    await connector.execute(sql`
      CREATE TEXT SEARCH CONFIGURATION IF NOT EXISTS vietnamese (COPY = simple)
    `);
    await connector.execute(sql`
      ALTER TEXT SEARCH CONFIGURATION vietnamese
        ALTER MAPPING FOR asciiword, asciihword, hword_asciipart,
                          word, hword, hword_part
        WITH unaccent, simple
    `);
  },
};

10.5. Kiến trúc Thực tế: Tìm kiếm Đa lớp

Đối với BANA, cách tiếp cận khuyến nghị là tìm kiếm đa lớp với suy giảm duyên dáng (graceful degradation):

LớpEnginePhù hợp nhất choLatency
ChínhTypesense (hybrid)Catalog sản phẩm, tìm kiếm khối lượng cao, faceted search<50ms
Bổ sungPostgreSQL FTSTruy vấn nhất quán thời gian thực, tìm kiếm CRUD inline, collection nhỏ10-50ms
Dự phòngPostgreSQL pg_trgmTìm kiếm fuzzy/dung sai lỗi, không nhạy dấu Tiếng Việt10-50ms

10.6. Tác động lên Quyết định Ban đầu

Khuyến nghị ban đầu (Phương án B: Typesense + Ollama BGE-M3) vẫn không thay đổi. PostgreSQL FTS là một bổ sung có giá trị, không phải thay thế.

Khía cạnhTypesense (Chính)PostgreSQL FTS (Bổ sung)
Ranking BM25Tích hợp sẵnKhông (chỉ TF-IDF qua ts_rank)
Tìm kiếm Ngữ nghĩa/VectorTích hợp sẵn (với BGE-M3 embeddings)Không (cần pgvector riêng)
Dấu thanh Tiếng ViệtTokenization ICUExtension unaccent (hỗ trợ đầy đủ)
Dung sai lỗi chính tảTích hợp sẵnQua extension pg_trgm
Faceted SearchNativeKhông
Tích hợp Drizzle ORMN/A (service riêng)Đầy đủ (generated columns, GIN indexes)
Nhất quán thời gian thựcTrễ CDC (~1-5s)Tức thì (cùng transaction)
Chi phí vận hànhĐã triển khai ($0)Đã triển khai ($0)

Khi nào nên dùng PostgreSQL FTS thay vì Typesense:

  • Tìm kiếm sale order trong context một merchant duy nhất (nhất quán thời gian thực quan trọng)
  • Tìm kiếm finance transaction (dataset nhỏ, truy vấn dạng giao dịch)
  • Bộ lọc tìm kiếm inline trong các CRUD controller có sẵn
  • Dự phòng khi Typesense tạm thời không khả dụng

Phán quyết các extension BM25:

  • ParadeDB: Bỏ qua (license AGPL + không có WAL trong phiên bản community)
  • pg_textsearch: Theo dõi (license PostgreSQL hứa hẹn, nhưng vẫn ở preview)
  • PGroonga: Xem xét cho hỗ trợ Tiếng Việt tốt nhất (nếu cần phân đoạn từ ghép)
  • Native FTS + pg_trgm: Sử dụng ngay (chi phí $0, tích hợp Drizzle đầy đủ)

11. So sánh với các Lựa chọn không được Chọn

Lựa chọnLý do không chọn
Elasticsearch/OpenSearchCluster 128-256GB RAM. Overhead vận hành JVM. Quá mức cho quy mô POS.
VespaKhông có TypeScript SDK. Cấu hình dựa trên XML. Phức tạp ở quy mô internet.
PineconeChỉ có cloud. Không có self-hosted. Định giá theo mức tiêu thụ tăng theo sử dụng. Khóa nhà cung cấp.
ChromaDBSingle-node. 60GB RAM cho 10M vectors. Không có multi-tenancy. Chưa sẵn sàng production.
MilvusYêu cầu etcd + MinIO. Phức tạp không tương xứng cho <1M sản phẩm.
WeaviateMulti-container Compose. Tối thiểu 8-16GB RAM. Đường cong học tập dốc hơn.
MeilisearchSingle-node. RAM = 35x kích thước dữ liệu. Không scale ngang.
Pure Cloud API (OpenAI/Cohere)Chi phí theo token liên tục. Phụ thuộc API. Giới hạn rate. Ít kiểm soát.

12. Tài liệu Liên quan

Tài liệuMô tả
SearchThẻ định danh thư viện search + catalog
Search — ArchitectureCDC pipeline + query path
Search — Domain ModelTypesense collections
Commerce PackageTích hợp tìm kiếm sản phẩm (host)
Core DatabaseSchema và model PostgreSQL

13. Tham khảo

Vector Databases

Embedding Models

Architecture & Patterns

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.