Skip to content

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:

  1. Phân biệt chữ hoa/thườngstatus=Error khác với status=error
  2. Thiếu pipe — Luôn tách các lệnh bằng |
  3. String so với Int"42" khác với 42

Lỗi cú pháp

Lỗi 1: Quên Pipe

Sai:

bql
search status=error head 10

Tạ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:

bql
search status=error | head 10

Lỗi 2: Phân biệt chữ hoa/thường

Sai:

bql
search status=Error

Tạ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:

bql
search status=error

Mẹ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:

bql
seach status=error
whre env=prod
stat count

Tạ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:

bql
search status=error
where env=prod
stats count

Những lỗi đánh máy phổ biến:

SaiĐúng
seachsearch
whrewhere
statstats
evaluteeval
timcharttimechart
dedupededup

Lỗi logic

Lỗi 4: So Sánh String với Int

Sai:

bql
search port=443

Tạ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:

bql
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:

bql
search active=true

Tạ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:

bql
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:

bql
search field=null

Tạ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:

bql
search field!=null

Mẹ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:

bql
from events-* | head 100

Tạ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:

bql
from events-* | search status=error | head 100

Mẹ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:

bql
from events-* | sort ts desc | search status=error | head 10

Tạ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:

bql
from events-* | search status=error | sort ts desc | head 10

Mẹ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:

bql
from events-* | stats count

Lỗ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:

bql
search NOT status=error

Tại sao sai: BQL không có toán tử NOT. Parser coi NOT là tham chiếu trường.

Đúng:

bql
search status!=error

Mẹo: Dùng != thay vì NOT.


Lỗi 11: Dùng Regex Trong Tìm Kiếm

Sai:

bql
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:

bql
search message=error

Mẹo: Dùng so sánh chính xác trong search. Để khớp regex, dùng hàm match() trong eval:

bql
eval is_error=match(message, "error.*") | search is_error=1

Lỗi 12: Dùng Sai Toán Tử Boolean

Sai:

bql
search status=error && host=web01

Tạ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:

bql
search status=error and host=web01

Hoặc dùng AND ngầm (đặt các term cạnh nhau):

bql
search status=error host=web01

Lỗi 13: Quên FROM Trong Server Mode

Sai:

bql
search status=error | head 10

Lỗ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:

bql
from logs-* | search status=error | head 10

Lỗi 14: Đặt FROM Ở Vị Trí Sai

Sai:

bql
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:

bql
from logs-* | search status=error

Lỗi 15: Thiếu Khoảng Thời Gian

Sai:

bql
from logs-* | search status=error

Lỗ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:

bql
timerange earliest=2026-01-01T00:00:00Z latest=2026-01-02T00:00:00Z | from logs-* | search status=error

Mẹ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=errorstatus!=error
search /regex/search exact_term
stats count by host limit 10stats count by host | sort count desc | head 10
field=nullfield!=null
field=truefield="true"
&& / ||and / or
seachsearch
search foo | from logs-*from logs-* | search foo

Mẹo Debug

  1. 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.
  2. Kiểm tra tên trường. Chạy stats distinct_count(field) để xem có những giá trị nào.
  3. Kiểm tra kiểu. Dùng eval type_test=typeof(field) để xem kiểu trường (khi được hỗ trợ).
  4. Dùng head. Thêm | head 5 sớm để kiểm tra với tập kết quả nhỏ.
  5. Đọ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

Released under the MIT License.