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.

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

Deep paging trong Elasticsearch: vì sao from=10000 báo lỗi, và search_after cứu bạn

Phân trang kiểu from/size càng lật sâu càng đắt, và Elasticsearch chặn cứng ở from=10000 với một lỗi. Bài này đo thật trên es-lab với 500.000 bản ghi: from/size tăng từ 12ms lên 30ms khi lật sâu rồi báo lỗi ở 10.000, còn search_after nhảy tới bất kỳ vị trí nào (kể cả gần cuối) chỉ 2-14ms và không giới hạn. Khi nào dùng từng cái.