Lập trình 22/09/2026 8 phút

Cây tìm kiếm nhị phân: O(log n) hay O(n) tùy cách bạn chèn — và vì sao map Go không dùng cây

Cây BST hứa tra cứu O(log n), nhưng chèn dữ liệu đã sắp vào nó một cách ngây thơ thì cây suy biến thành danh sách liên kết O(n). Bài này đo thật trong go-lab: cùng N=64.000, BST cân bằng tra cứu 99 ns còn BST suy biến 29.618 ns — chậm gấp 300 lần. Map Go (hash) còn nhanh hơn cả cây cân bằng. Vậy khi nào mới nên dùng cây?

Lập trình 22/09/2026 7 phút

Relevance và BM25: đọc explain API để hiểu vì sao Elasticsearch xếp kết quả thế này

Elasticsearch không chỉ trả về tài liệu khớp — nó chấm điểm và xếp hạng bằng thuật toán BM25. Bài này đo thật trên es-lab bằng explain API: cùng tìm một từ, tài liệu chứa nó 3 lần được 0,645 điểm, tài liệu câu ngắn chứa 1 lần được 0,554, còn tài liệu câu dài 16 từ chỉ 0,248. Mổ xẻ từng thành phần TF, IDF, field length để biết vì sao.

Lập trình 22/09/2026 6 phút

Bool query: must, should, filter, must_not — và vì sao filter cho _score bằng 0

Truy vấn thật hiếm khi chỉ một điều kiện: tìm 'wireless' NHƯNG chỉ hãng logi, còn hàng, giá dưới 50. Bool query ghép chúng lại. Bài này đo thật trên es-lab bốn mệnh đề must/should/filter/must_not: filter cho _score=0 (không tính điểm, được cache), must/should cộng điểm BM25, và khớp nhiều should thì điểm càng cao. Chọn đúng mệnh đề quyết định cả thứ tự lẫn hiệu năng.

Lập trình 22/09/2026 7 phút

Aggregation trong Elasticsearch: gom nhóm và thống kê 1 triệu bản ghi trong 50 mili giây

Elasticsearch không chỉ tìm kiếm — nó là một cỗ máy phân tích. Bài này đo thật trên es-lab với 1 triệu bản ghi: terms gom nhóm theo danh mục trong 28ms, stats tính min/max/avg/sum trong 40ms, histogram phân bố trong 51ms. Và một cạm bẫy quan trọng: cardinality đếm khách duy nhất trả về 99.776 trong khi thực tế là 100.000 — vì nó là ước lượng, không chính xác.

Lập trình 22/09/2026 6 phút

Mapping Elasticsearch: text hay keyword, và vì sao sort trên trường text lại báo lỗi

Mapping là schema của index Elasticsearch — và chọn sai kiểu làm hỏng truy vấn mà không báo lỗi lúc index. Bài này đo thật trên es-lab: sort trên trường text báo lỗi Fielddata is disabled, số gửi dạng chuỗi bị ES đoán thành text (mất phép toán số học), và đổi kiểu một field đã có là bất khả thi — phải reindex. Hiểu text vs keyword và mapping động vs tường minh.

Lập trình 22/09/2026 6 phút

Bulk indexing: vì sao nạp 2000 tài liệu bằng _bulk nhanh hơn 303 lần nạp từng cái

Nạp dữ liệu vào Elasticsearch từng document một là cái bẫy hiệu năng lớn nhất khi khởi tạo index. Bài này đo thật trên es-lab: nạp 2000 tài liệu từng cái mất 8,2 giây (244 docs/giây), còn _bulk một request chỉ 27ms (74.074 docs/giây) — nhanh hơn 303 lần. Và đo luôn tác động của kích thước lô: lớn hơn thì nhanh hơn nhưng giảm dần.