Tổng hợp 40 câu hỏi phỏng vấn Elasticsearch kèm đáp án chi tiết, song ngữ Việt–Anh — sắp xếp từ cơ bản đến nâng cao. Ôn luyện miễn phí, tự động lưu tiến độ.
Inverted index map term sang danh sách document chứa term đó. Tìm một từ chỉ là một lần lookup rồi lấy posting list, thay vì scan toàn bộ document như LIKE %keyword% trong SQL. Đây là lý do full-text search nhanh hơn hẳn LIKE %...%,…
Primary shard chia dữ liệu để scale ngang; replica là bản sao của primary, phục vụ HA và tăng throughput đọc. numberofshards không đổi được sau khi tạo index — muốn đổi phải reindex. numberofreplicas thì đổi nóng được. Guideline của Elastic: mỗi shard 10–50…
text được analyze (tách token, lowercase) để full-text search; keyword lưu nguyên chuỗi, dùng cho filter, sort và aggregation. Đây là multi-field, pattern chuẩn: name để search, name.raw để sort và group. Hệ quả cụ thể: - term query trên field text với giá trị…
Ba tầng chạy tuần tự: character filter (sửa chuỗi thô, ví dụ bỏ HTML tag), tokenizer (cắt thành token), token filter (lowercase, bỏ stopword, stemming, asciifolding). Phải hiểu vì hầu hết bug "tìm mãi không ra" đều nằm ở đây. Cách debug nhanh nhất là…
match analyze giá trị tìm kiếm trước khi so khớp; term so khớp nguyên văn với token trong index. Đó là lý do term trên field text thường trả rỗng. Cách chọn: user gõ tự do thì match; lọc chính xác theo status, ID, SKU…
Elasticsearch là near real-time, không phải real-time. Document chỉ search được sau khi refresh, mặc định 1 giây một lần. Cơ chế: document ghi vào in-memory buffer + translog trước, refresh mới đẩy buffer thành một Lucene segment và segment đó mới search được. Ba…
Vì nó không có transaction đa document, không có join, và ưu tiên availability hơn consistency. Mất dữ liệu trong tình huống network partition là chuyện đã được ghi nhận. Các điểm cụ thể thiếu so với một RDBMS: - Không có ACID transaction trên…
Elasticsearch tự đoán kiểu field khi gặp field mới. Tiện lúc thử nghiệm nhưng ở production sinh ra ba vấn đề. 1. Đoán sai kiểu và không sửa được — "1234" thành text thay vì long, "2026-01-15" thành date trong khi đó là mã đơn…
Query context tính điểm liên quan, filter context chỉ trả lời có/không và được cache. Điều kiện không cần tính điểm mà để trong must là lãng phí rõ rệt. Quy tắc: mọi điều kiện lọc cứng đều để trong filter — status, khoảng giá,…
Ba yếu tố: term frequency (từ xuất hiện nhiều trong document thì điểm cao), inverse document frequency (từ hiếm trong toàn index thì có trọng số lớn), và field length (field ngắn mà chứa từ đó thì điểm cao hơn). So với TF-IDF cũ, BM25…
Vì deep pagination bắt mỗi shard phải trả về from + size hit rồi coordinating node sort lại toàn bộ. from=100000 nghĩa là mỗi shard gom 100.010 document — tốn heap tuyến tính theo độ sâu, dễ làm OOM cả cluster. Ngưỡng index.maxresultwindow mặc định…
Không. Trên index nhiều shard, terms agg là kết quả xấp xỉ: mỗi shard trả về top N cục bộ rồi coordinating node gộp lại, nên một term xếp thứ 15 ở mọi shard có thể tổng lớn hơn term đang đứng top nhưng vẫn…
Kiểu object mặc định làm phẳng mảng, nên quan hệ giữa các field trong cùng một phần tử bị mất. Hậu quả: query tìm color=red AND size=L vẫn khớp document này dù không có variant nào như vậy. Đây là bug rất khó phát hiện…
Hai việc: xử lý dấu và nhận diện từ ghép. standard tokenizer cắt theo khoảng trắng nên "điện thoại" thành hai token rời, và "dien thoai" không gõ dấu sẽ không khớp "điện thoại". Cách xử lý dấu — index cả hai dạng bằng multi-field:…
Không đổi tại chỗ được — phải tạo index mới với mapping đúng, reindex sang, rồi chuyển alias. Alias là thứ khiến việc này không downtime, nên luôn cho ứng dụng trỏ vào alias chứ không phải index name. Bước chuyển alias là atomic, không…
Dùng bulk với batch 5–15 MB, và tắt refresh + replica trong lúc nạp. Vì sao có tác dụng: mỗi lần refresh tạo segment mới rồi phải merge, còn replica bắt mỗi document ghi hai lần. Tắt cả hai rồi bật lại sau khi nạp…
Segment immutable — ghi xong không sửa được. Mỗi refresh tạo segment mới, và Lucene chạy merge nền để gộp segment nhỏ lại. Ba hệ quả vận hành: 1. Update = delete + reindex cả document. Không có update tại chỗ. Document cũ chỉ bị…
Index template áp mapping và settings tự động cho index khớp pattern, nên index sinh theo ngày không bị rơi vào dynamic mapping. ILM lo vòng đời sau đó: rollover khi index đủ lớn hoặc đủ cũ, chuyển sang node rẻ hơn, rồi xoá. Đây…
Kết hợp điểm text với tín hiệu nghiệp vụ bằng functionscore, đừng thay thế hẳn điểm text. log1p rất quan trọng: không có nó, sản phẩm bán 10.000 cái sẽ đè bẹp điểm relevance và kết quả tìm kiếm biến thành bảng xếp hạng bán…
Ba lựa chọn, chọn theo yêu cầu: 1. completion suggester — nhanh nhất, dựng FST trong memory, phù hợp khi chỉ cần gợi ý tiền tố từ một danh sách. 2. searchasyoutype — field type dựng sẵn n-gram, khớp cả cụm ở giữa, dễ dùng…
Ở server, bằng highlight của Elasticsearch. Client tự tô bằng cách so chuỗi sẽ sai với mọi thứ đã qua analyzer: stemming, synonym, bỏ dấu, phrase — nó chỉ khớp đúng chuỗi user gõ. Elasticsearch biết chính xác token nào khớp nên tô đúng cả…
Vì field text đã bị analyze thành nhiều token, nên không có một giá trị duy nhất để so sánh. Sort cần đọc giá trị theo từng document (doc values), mà text không sinh doc values. Lỗi nhận được là Fielddata is disabled on text…
Biến đổi document trước khi index, ngay trong cluster: parse chuỗi, đổi kiểu, thêm field, bỏ field nhạy cảm, làm giàu dữ liệu. Giá trị lớn nhất là không phải sửa producer: nhiều service ghi vào cùng một index, chuẩn hoá tập trung ở pipeline…
Có. Replica chống mất node, snapshot chống mất dữ liệu. Xoá nhầm index thì replica bị xoá theo ngay lập tức — nó là bản sao đồng bộ, không phải bản lưu theo thời điểm. Snapshot là incremental: chỉ copy segment mới so với lần…
Vì credential nằm trong JavaScript là lộ cho mọi người, và query DSL đủ mạnh để một người tò mò đọc hết dữ liệu hoặc làm sập cluster. Các việc kẻ tấn công làm được khi endpoint mở: - Query sang index khác (GET /all/search),…
profile: true để bóc thời gian từng phần của query, và slow log để bắt query chậm ở production. Các nguyên nhân chậm hay gặp, theo thứ tự tần suất: 1. Điều kiện lọc nằm trong must thay vì filter — mất cache và tốn…
Khi cần một field tính lúc query mà không muốn reindex: thêm field mới cho dữ liệu cũ, sửa gấp một mapping sai, hoặc thử nghiệm trước khi quyết định index thật. Dùng được ngay trong query, sort và aggregation như field thường, và không…
Nhóm static setting — quan trọng nhất là numberofshards, và toàn bộ phần analysis (analyzer, tokenizer, filter). Muốn đổi phải tạo index mới rồi reindex. Mapping cũng gần như vậy: thêm field mới thì được, đổi kiểu field đã có thì không. Hệ quả thực…
Ba cách, theo mức độ tin cậy tăng dần: 1. Dual write — service ghi DB xong ghi luôn sang Elasticsearch. Đơn giản nhưng không có bảo đảm: ghi DB xong mà service chết thì Elasticsearch thiếu document vĩnh viễn. 2. Polling theo updatedat —…
Hai quy tắc: không quá 50% RAM của máy và không quá ~31 GB. Vượt 50% RAM là lấy mất phần OS page cache — mà Lucene đọc segment từ file, nên page cache đóng vai trò quyết định với tốc độ search. Cluster nhiều…