Ở 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õ.
json
{
"query": { "match": { "content": "laptop gaming" } },
"highlight": {
"fields": { "content": { "fragment_size": 150, "number_of_fragments": 3 } },
"pre_tags": ["<mark>"], "post_tags": ["</mark>"]
}
}Elasticsearch biết chính xác token nào khớp nên tô đúng cả trường hợp user gõ "chạy" mà document viết "chạy bộ", hoặc gõ không dấu mà document có dấu.
Ba highlighter: unified (mặc định, cân bằng), plain (chính xác nhất, chậm), fvh (nhanh cho field lớn nhưng phải bật term_vector: with_positions_offsets lúc index, làm index phình).
Lưu ý bảo mật: kết quả highlight chứa HTML tag, nên phải escape nội dung trước khi render, không thì mở đường cho XSS từ dữ liệu người dùng nhập.