- Inverted index là gì và vì sao nó làm full-text search nhanh?
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 %...%,…
- Shard và replica khác nhau thế nào? Chọn số shard bao nhiêu?
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` và `keyword` khác nhau ra sao? Khi nào dùng cái nào?
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ị…
- Analyzer gồm những thành phần nào và vì sao phải hiểu nó?
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` và `term` khác nhau thế nào? Vì sao `term` hay trả về rỗng?
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…
- Index xong một document nhưng search ngay không thấy. Vì sao?
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ì sao Elasticsearch thường không được dùng làm database chính?
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…
- Dynamic mapping là gì và vì sao nguy hiểm ở production?
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 và filter context khác nhau thế nào?
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á,…
- Điểm relevance mặc định (BM25) dựa trên những yếu tố nào?
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ì sao `from`/`size` bị giới hạn ở 10.000 và thay bằng gì?
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…
- Kết quả `terms` aggregation có chính xác tuyệt đối không?
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…
- Mảng object lưu bằng kiểu mặc định gây vấn đề gì?
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…
- Search tiếng Việt cần xử lý thêm gì so với tiếng Anh?
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:…
- Cần đổi kiểu của một field trong index đang chạy production. Làm thế nào?
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…
- Nạp vài triệu record vào Elasticsearch nên tối ưu thế nào?
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…
- Lucene segment có đặc điểm gì và ảnh hưởng thế nào tới vận hành?
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 và ILM giải quyết vấn đề gì?
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…
- Muốn sản phẩm bán chạy xuất hiện cao hơn trong kết quả thì làm thế nào?
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…
- Làm autocomplete (gợi ý khi gõ) nên dùng cách nào?
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…
- Highlight từ khoá trong kết quả nên làm ở server hay client?
Ở 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ì sao sort trên field `text` bị từ chối?
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…
- Ingest pipeline dùng để làm gì?
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 rồi thì còn cần snapshot không?
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ì sao không được để trình duyệt gọi thẳng vào Elasticsearch?
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),…
- Query chậm nhưng không biết chậm ở đâu. Dùng công cụ nào?
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…
- Runtime field dùng khi nào?
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…
- Setting nào của index không đổi được sau khi tạo?
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…
- Đồng bộ dữ liệu từ PostgreSQL sang Elasticsearch nên làm thế nào?
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 —…
- Cấp heap cho node Elasticsearch theo nguyên tắc nào?
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…
- Custom routing khi index đem lại lợi ích gì và rủi ro gì?
- Hệ phục vụ hàng nghìn khách hàng nên tổ chức index thế nào?
- Vector search (kNN) khác keyword search thế nào và nên dùng ra sao?
- Gặp `circuit_breaking_exception` thì phản ứng đúng là gì?
- Nâng version một cluster đang chạy production nên làm thế nào?
- Một node có tải cao hơn hẳn các node khác. Nguyên nhân và cách xử lý?
- Elasticsearch bảo đảm gì khi một request ghi trả về thành công?
- Export vài triệu document ra ngoài nên dùng cách nào?
- Đánh giá chất lượng search sau khi chỉnh ranking nên dựa vào đâu?
- Khi nào chưa nên đưa Elasticsearch vào hệ thống?