Hai việc: xử lý dấu và ghép 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:
"name": {
"type": "text",
"analyzer": "vi_std",
"fields": {
"folded": { "type": "text", "analyzer": "vi_folded" } // asciifolding
}
}Rồi multi_match trên cả name và name.folded, đánh boost cao hơn cho bản có dấu để kết quả gõ đúng dấu vẫn xếp trên.
Về từ ghép: standard không hiểu ranh giới từ tiếng Việt, nên "hoa quả" và "quả hoa" cho token giống nhau. Có hai hướng: dùng match_phrase để giữ thứ tự, hoặc cài plugin tách từ tiếng Việt (analysis-vietnamese) — plugin phải cài trên mọi node và cản trở việc dùng managed service.
Thực tế nhiều team dừng ở mức asciifolding + phrase matching + synonym là đủ tốt cho e-commerce.