Sai Lầm Thường Gặp
Ngay cả những SOC analyst giàu kinh nghiệm cũng có thể mắc phải những lỗi này khi mới làm quen với BQL. Dưới đây là cách tránh chúng.
Fixes Nhanh
Những lỗi phổ biến nhất cần sửa ngay:
- Phân biệt chữ hoa/thường —
status=Errorkhác vớistatus=error - Thiếu pipe — Luôn tách các lệnh bằng
| - String so với Int —
"42"khác với42
Lỗi cú pháp
Lỗi 1: Quên Pipe
Sai:
search status=error head 10Tại sao sai: head 10 bị coi là một phần của search, không phải lệnh riêng biệt. Parser đọc "search status=error head 10" như một đoạn duy nhất.
Đúng:
search status=error | head 10Lỗi 2: Phân biệt chữ hoa/thường
Sai:
search status=ErrorTại sao sai: BQL phân biệt chữ hoa/thường. So sánh chuỗi là so sánh từng byte. "Error" không bằng "error".
Đúng:
search status=errorMẹo: Luôn kiểm tra đúng dạng chữ hoa/thường của giá trị trường trong dữ liệu. Chạy stats distinct_count(status) trước để xem có những giá trị nào.
Lỗi 3: Dùng Sai Tên Lệnh
Sai:
seach status=error
whre env=prod
stat countTại sao sai: BQL không nhận diện được các tên lệnh này. Parser trả về unknown command 'seach'.
Đúng:
search status=error
where env=prod
stats countNhững lỗi đánh máy phổ biến:
| Sai | Đúng |
|---|---|
seach | search |
whre | where |
stat | stats |
evalute | eval |
timchart | timechart |
dedupe | dedup |
Lỗi logic
Lỗi 4: So Sánh String với Int
Sai:
search port=443Tại sao sai: Nếu port được lưu dưới dạng String trong index, bạn cần so sánh với "443". BQL không tự động chuyển đổi kiểu giữa String và Int. String("42") không bao giờ bằng Int(42).
Đúng:
search port="443"Mẹo: Kiểm tra mô hình dữ liệu để xem trường là String hay Int. Nếu không chắc, dùng kiểu khớp với dữ liệu thực tế.
Lỗi 5: Nhầm Lẫn Trường Boolean
Sai:
search active=trueTại sao sai: BQL không có kiểu Boolean giá trị. Các giá trị boolean được lưu dưới dạng chuỗi. Literal true trong biểu thức bị parser coi là tham chiếu trường, không phải giá trị boolean.
Đúng:
search active="true"Mẹo: Kiểm tra cách trường boolean được lưu trong dữ liệu của bạn. Thường là chuỗi "true" hoặc "false".
Lỗi 6: Ngữ Nghĩa Null
Sai:
search field=nullTại sao sai: BQL không có kiểu Null giá trị. Từ null trong biểu thức search bị coi là tham chiếu trường, không phải literal null. Trường thiếu sẽ so sánh là false trong BQL, nên field=null sẽ không tìm được các trường bị thiếu.
Đúng:
search field!=nullMẹo: Trường thiếu khác với giá trị null. Trong BQL, trường thiếu luôn so sánh là false trong phép kiểm tra bằng nhau.
Lỗi hiệu suất
Lỗi 7: Tìm Kiếm Không Có Bộ Lọc
Sai:
from events-* | head 100Tại sao sai: Lệnh này quét TẤT CẢ sự kiện, có thể rất chậm trên index lớn. BQL yêu cầu khoảng thời gian để đảm bảo an toàn, nhưng ngay cả với khoảng thời gian, một lệnh scan thô mà không có bộ lọc sẽ rất tốn kém.
Đúng:
from events-* | search status=error | head 100Mẹo: Luôn thêm bộ lọc để giảm khối lượng dữ liệu. Lọc càng sớm càng tốt trong pipeline.
Lỗi 8: Sắp Xếp Trước Khi Lọc
Sai:
from events-* | sort ts desc | search status=error | head 10Tại sao sai: Bạn đang sắp xếp TẤT CẢ sự kiện trước khi lọc, điều này lãng phí tài nguyên. Sort xử lý mọi dòng, sau đó filter loại bỏ hầu hết chúng.
Đúng:
from events-* | search status=error | sort ts desc | head 10Mẹo: Lọc trước, sắp xếp sau. Điều này giảm số dòng mà sort phải xử lý.
Lỗi 9: Dùng Stats Chưa Được Kích Hoạt
Sai:
from events-* | stats countLỗi: feature disabled: stats
Tại sao sai: Tính năng stats bị kiểm soát bởi feature flag. Nó bị tắt theo mặc định trong một số cấu hình.
Cách sửa: Liên hệ quản trị viên để bật feature flag của stats, hoặc dùng cách thay thế.
Lỗi sử dụng lệnh
Lỗi 10: Dùng Toán Tử NOT
Sai:
search NOT status=errorTại sao sai: BQL không có toán tử NOT. Parser coi NOT là tham chiếu trường.
Đúng:
search status!=errorMẹo: Dùng != thay vì NOT.
Lỗi 11: Dùng Regex Trong Tìm Kiếm
Sai:
search message=/error.*/Tại sao sai: BQL không hỗ trợ regex trong tìm kiếm. Parser coi /error.*/ là một term duy nhất, nó sẽ không khớp với bất kỳ thứ gì.
Đúng:
search message=errorMẹo: Dùng so sánh chính xác trong search. Để khớp regex, dùng hàm match() trong eval:
eval is_error=match(message, "error.*") | search is_error=1Lỗi 12: Dùng Sai Toán Tử Boolean
Sai:
search status=error && host=web01Tại sao sai: BQL dùng and/or (chữ thường), không phải &&/||. Ký hiệu && bị coi là một phần của biểu thức.
Đúng:
search status=error and host=web01Hoặc dùng AND ngầm (đặt các term cạnh nhau):
search status=error host=web01Lỗi 13: Quên FROM Trong Server Mode
Sai:
search status=error | head 10Lỗi: Query must include a 'from' clause to specify the data source
Tại sao sai: Khi chạy trên OpenSearch (không phải fixture data), BQL yêu cầu clause from để chỉ định index cần truy vấn.
Đúng:
from logs-* | search status=error | head 10Lỗi 14: Đặt FROM Ở Vị Trí Sai
Sai:
search status=error | from logs-*Lỗi: FROM must be the first segment in the query
Tại sao sai: from phải luôn là lệnh đầu tiên trong pipeline.
Đúng:
from logs-* | search status=errorLỗi 15: Thiếu Khoảng Thời Gian
Sai:
from logs-* | search status=errorLỗi: scan without time range
Tại sao sai: BQL yêu cầu truy vấn có giới hạn thời gian để đảm bảo an toàn. Without time range, truy vấn sẽ quét toàn bộ index.
Đúng:
timerange earliest=2026-01-01T00:00:00Z latest=2026-01-02T00:00:00Z | from logs-* | search status=errorMẹo: Luôn thêm timerange để giới hạn truy vấn của bạn.
Nên Dùng Gì Thay Thế
| Thay vì... | Dùng cái này... |
|---|---|
NOT status=error | status!=error |
search /regex/ | search exact_term |
stats count by host limit 10 | stats count by host | sort count desc | head 10 |
field=null | field!=null |
field=true | field="true" |
&& / || | and / or |
seach | search |
search foo | from logs-* | from logs-* | search foo |
Mẹo Debug
- Bắt đầu đơn giản. Viết truy vấn đơn giản nhất có thể hoạt động, rồi tăng dần độ phức tạp.
- Kiểm tra tên trường. Chạy
stats distinct_count(field)để xem có những giá trị nào. - Kiểm tra kiểu. Dùng
eval type_test=typeof(field)để xem kiểu trường (khi được hỗ trợ). - Dùng head. Thêm
| head 5sớm để kiểm tra với tập kết quả nhỏ. - Đọc lỗi. Thông báo lỗi BQL cho bạn biết chính xác vấn đề là gì. Hãy đọc chúng.
Chủ Đề Liên Quan
- Bắt Đầu — Mới dùng BQL? Bắt đầu từ đây
- Tham Khảo Lệnh — Cú pháp đầy đủ của các lệnh
- Cookbook — Các truy vấn sẵn sàng sử dụng
- Hạn Chế Đã Biết — BQL chưa làm được gì
