Skip to content

Hạn chế đã biết ​

📝
Đọc trước khi viết truy vấn đầu tiên. Trang này liệt kê những gì BQL chưa thể làm, tại sao điều đó quan trọng, và cách làm thay thế mỗi khoảng trống.

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.

📝
Wildcard **chỉ hoạt động** trong lệnh `from` cho index pattern: `from auth-*`. Đây là OpenSearch xử lý native, không phải BQL.

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 ​

Released under the MIT License.