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ượ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 ở =!=.

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.

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_hexbase64_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()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)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

Cú 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 toprare 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 sorthead để đạ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ả ANDOR 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

Released under the MIT License.