Hạn chế đã biết
Toán tử
Không có toán tử NOT
Thiếu: BQL không có NOT hoặc tiền tố ! để đảo ngược biểu thức.
Hậu quả: Bạn không thể viết NOT status=error để loại bỏ hàng. Không có cách nào đảo ngược một điều kiện tìm kiếm hoặc lệnh where.
Giải pháp: Dùng != để đảo ngược phép so sánh bằng nhau: search status!=error. Với phức tạp hơn, hãy cấu trúc lại truy vấn để dùng khớp đúng với các trường bạn muốn giữ lại.
Không có wildcard trong giá trị trường
Thiếu: BQL không hỗ trợ ký tự * (wildcard) trong giá trị trường của lệnh search. Ví dụ, search src_ip=10.0.0.* sẽ tìm kiếm chuỗi chính xác "10.0.0.*", không phải tất cả địa chỉ IP bắt đầu bằng 10.0.0..
Hậu quả: Bạn không thể lọc dữ liệu bằng mẫu chuỗi một cách ngắn gọn. So sánh giá trị luôn là khớp chính xác.
Giải pháp: Dùng hàm match() với cú pháp regex trong lệnh where: where match(src_ip, "10\\.0\\.0\\..*"). Lưu ý: match() chạy trong bộ nhớ, không đẩy xuống OpenSearch.
Hàm
Không có hàm điều kiện if()
Thiếu: Hàm if(condition, true_value, false_value) dùng cho logic điều kiện trong biểu thức eval chưa có.
Hậu quả: Bạn không thể tạo trường suy luận dựa trên điều kiện trong một truy vấn. Biểu thức kiểu tam thức không được hỗ trợ.
Giải pháp: Dùng nhiều lệnh search hoặc where để lọc và biến đổi dữ liệu trong các giai đoạn pipeline riêng biệt.
Lệnh
Không có lệnh makeresults
Thiếu: Lệnh makeresults dùng tạo hàng giả lập chưa được triển khai.
Hậu quả: Bạn không thể tạo dữ liệu thử nghiệm hoặc hàng tham chiếu trực tiếp trong một truy vấn BQL.
Giải pháp: Dùng inputlookup với bảng tìm kiếm đã xây dựng sẵn, hoặc tạo dữ liệu thử nghiệm bên ngoài BQL.
Không có hàm thời gian earliest/latest
Thiếu: Hàm earliest() và latest() dùng tìm thời điểm tối thiểu/tối đa chưa có dạng hàm riêng biệt.
Hậu quả: Bạn không thể tính khoảng thời gian trong truy vấn mà không dùng stats min(ts) và stats max(ts).
Giải pháp: Dùng stats min(ts) as earliest, max(ts) as latest để đạt kết quả tương đương trong tổng hợp.
Không có top/rare với cú pháp by
Thiếu: Lệnh top và rare không hỗ trợ nhóm với by.
Hậu quả: Bạn không thể tìm giá trị phổ biến/hiếm gặp nhất trong các nhóm cụ thể (ví dụ, top địa chỉ nguồn theo máy chủ).
Giải pháp: Dùng stats count by field1, field2 theo sau bởi sort và head để đạt kết quả tương đương top-N theo nhóm.
Kiểu dữ liệu
Không có kiểu Float
Thiếu: BQL chỉ hỗ trợ kiểu String và Int. Không có kiểu Float hoặc Double gốc.
Hậu quả: Số thập phân trong dữ liệu sẽ được coi là chuỗi. Bạn không thể thực hiện phép tính hoặc so sánh số thập phân trên giá trị đó.
Giải pháp: Nhân giá trị thập phân với lũy thừa mười để chuyển thành số nguyên trước khi truy vấn. Ví dụ, lưu 3.14 dạng 314 và chia cho 100 trong phân tích.
Không có kiểu Boolean
Thiếu: BQL không có kiểu Boolean gốc. Giá trị true/false được biểu diễn dạng chuỗi hoặc số nguyên.
Hậu quả: Các trường chứa true/false hoặc 1/0 được coi là chuỗi hoặc số, không phải giá trị logic.
Giải pháp: Dùng so sánh chuỗi: search is_active=true hoặc search flag=1 tùy theo cách boolean được lưu trong dữ liệu.
Hành vi schema-on-read
Chuyện xảy ra: BQL không áp đặt schema cố định. Các trường thiếu trong một số hàng sẽ được coi là NULL khi truy cập.
Hậu quả: Truy vấn tham chiếu trường không có trong tất cả hàng sẽ trả về NULL cho các hàng đó, không phải lỗi. Đây là thiết kế, nhưng có thể gây ngạc nhiên nếu bạn mong đợi schema áp đặt nghiêm ngặt.
Giải pháp: Hãy rõ ràng về trường bạn mong đợi. Dùng search field_name=* để kiểm tra sự tồn tại của trường, hoặc where field_name!=null để loại bỏ các hàng thiếu trường.
Chủ đề liên quan
- Bắt đầu nhanh — Mới với BQL? Bắt đầu từ đây
- Tham khảo lệnh — Cú pháp đầy đủ của mỗi lệnh
- Bộ sưu tập truy vấn — Truy vấn sẵn sàng dùng
