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ượng kiểm tra 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ó toán tử nhỏ hơn / lớn hơn
Thiếu: BQL không hỗ trợ toán tử so sánh <, >, <= hoặc >=.
Hậu quả: Bạn không thể lọc khoảng giá trị như bytes > 1000 hoặc latency <= 50. So sánh số giới hạn ở = và !=.
Giải pháp: Dùng stats kết hợp sắp xếp để tìm cực đoạn. Ví dụ, sort bytes desc | head 10 cho bạn 10 trạng thái truyền tải lớn nhất. Với truy vấn khoảng, hãy xem xét dùng eval để tạo cờ đánh dấu: eval is_large=if(bytes > 1000, 1, 0) | search is_large=1. Lưu ý: điều này yêu cầu hàm if đã được triển khai.
Không dùng biền thữc trong search
Thiếu: Lệnh search không hỗ trợ khıp mẩu biền thữc trên giá trị trường.
Hậu quả: Bạn không thể viết search src_ip=10.0.0.* để khıp mẩu. Khıp giá trị chính xác là tùy chọn duy nhất trong các lệnh search.
Giải pháp: Dùng hàm match(field, "regex") trong các lệnh where thay thế: where match(src_ip, "10\\.0\\.0\\..*"). Hàm match trả về 1 nếu khıp, 0 nếu không khıp, và NULL nếu thiếu trường.
Hàm
Thiếu hàm giải mã chuỗi ✅ Đã triển khai
decode_url, decode_hex và base64_decode đã có sẵn trong biểu thức eval.
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ó subsearch (dự kiện trong tương lai)
Thiếu: Đánh giá truy vấn lồng nhập sử dụng cú pháp [ inner_pipeline ] chưa được triển khai.
Hậu quả: Bạn không thể dùng kết quả của một truy vấn làn đầu vào của một truy vấn khác trong cùng một cấu trúc BQL.
Giải pháp: Chạy các truy vấn riêng biệt và kết hợp kết quả bên ngoài, hoặc cấu trúc lại truy vấn để dùng lookup hoặc join với dữ liệu đã tiến xử lý.
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ị phân.
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ến 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 tuỳng và 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ốt đị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.
Thực thi
Thực thi đồng thời
Chuyện xảy ra: Tất cả truy vấn hiện đang được thực thi đồng thời. Không có streaming bất đồng bộ hoặc lịch trình hợp tác.
Hậu quả: Truy vấn chạy lâu trên thành chuỗi. Không có cơ chế hủy hoặc thời gian chờ trong quá trình thực thi.
Giải pháp: Dùng lệnh head hoặc limit để giới hạn kết quả. Với tệp dữ liệu lớn, hãy thêm bộ lọc khoảng thời gian để giảm dữ liệu quét.
Thu thập kết quả trong bộ nhớ
Chuyện xảy ra: Hàm eval() thu thập mọi hàng vào bộ nhớ trước khi phát ra kết quả.
Hậu quả: Tệp kết quả rất lớn có thể tồn tại đầu bộ nhớ đáng kể. Không có streaming ra địa chỉ hoặc lưu trữ ngoài.
Giải pháp: Luôn dùng head hoặc limit để giới hạn kết quả. Với tổng hợp, tệp kết quả thường đủ nhở để vừa trong bộ nhớ.
Không có scroll/phân trang OpenSearch
Chuyện xảy ra: Tất cả kết quả được tải từ OpenSearch trong một yêu cầu duy nhất. Không có phân trang point-in-time (PIT) hoặc search_after.
Hậu quả: Kết quả bị cắt ngưng đẩm tại giới hạn max_result_window của OpenSearch (mặc định 10.000 hàng). Truy vấn trả về nhiều hơn giới hạn này sẽ mất dữ liệu mà không thông báo.
Giải pháp: Dùng bộ lọc khoảng thời gian và head để giữ tệp kết quả dưới 10.000 hàng. Với phân tích lớn hơn, hãy chia khoảng thời gian thành các đoạn nhỏ hơn.
Ngôn ngữ truy vấn
Không có cú pháp by trong stats ✅ Đã triển khai
by trong statsCú pháp by được hỗ trợ cho hoạt động group-by trong stats.
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.
Không có từ khoả AND rõ ràng ✅ Đã triển khai
Từ khoả AND và OR rõ ràng được hỗ trợ: search status=error and host=web-01.
Sẽ có trong tương lai
Những hạn chế này nằm trong lộ trình và sẽ được xử lý trong các phát hành tương lai:
- Toán tử NOT để đảo ngược biểu thức
- Toán tử so sánh (
<,>,<=,>=) để truy vấn khoảng - Khıp biền thữc trong các lệnh search
- Kiểu Float để tính toán thập phân
- Kiểu Boolean cho giá trị logic
- Thực thi bất đồng bộ với lịch trình hợp tác
- Streaming đảo ra để tệp kết quả lớn
- Phân trang OpenSearch với PIT/search_after
Để xem trạng thái mới nhất, hãy liên hệ quản trị viên.
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
- Hạn chế đã biết — BQL chưa làm được gì
