SIEM/Log Management Ngôn ngữ truy vấn dashboard DQL

Mục lục:​

I. Tổng quan DQL
II. Cú pháp DQL
Tham khảo thêm tại: https://docs.opensearch.org/latest/dashboards/dql/

I. Tổng quan DQL​

  • Dashboards Query Language (DQL) là một ngôn ngữ truy vấn (query) đơn giản, dựa trên văn bản, dùng để lọc dữ liệu trong OpenSearch Dashboards
  • Các tùy chọn: DQL và ngôn ngữ query string query (hay còn gọi là Lucene) là hai tùy chọn ngôn ngữ có sẵn trên thanh tìm kiếm trong các mục Discover và Dashboards.
-> Theo mặc định, OpenSearch Dashboards sử dụng cú pháp DQL

II. Cú pháp DQL
Bảng tham chiếu nhanh


Tìm khiDQL (dùng trong Discover)
Tìm 2 từ (OR)wind gone
Tìm cụm chính xác"wind rises"
Tìm trong một fieldtitle: wind
Kiểm tra field có tồn tạidescription:*
Tìm giá trị theo khoảng sốpage_views >= 100 and page_views <= 300
Tìm trong khoảng ngàydate >= "1939-01-01" and date <= "2013-12-31"
Lọc theo nhiều điều kiệnmedia_type:film AND page_views:100
Loại trừ điều kiệnNOT media_type: article
Tìm theo mẫu (wildcard)title: wind*

Ví dụ:
Tìm từ khóa đơn giản:
1763798220862.png

Tìm 2 từ:
1763798220870.png

Tìm cụm từ:
1763798246831.png

1763798252423.png

Kiểm tra field có tồn tại:
1763798266281.png

Kết hợp AND:
1763798266289.png

Nếu field không tồn tại:
1763798280993.png

Tìm giá trị theo khoảng số:
1763798281001.png

1763798281009.png

1763798281017.png

Câu truy vấn có điều kiện
1763798291344.png

1763798291352.png

Câu truy vấn loại trừ điều kiện (NOT)
1763798300359.png


Wildcards
1763798300367.png

Tìm kiếm cụm tuyệt đối​

Cú pháp: "wind rises"
-> Khi đặt cụm từ trong dấu ngoặc kép " ", DQL sẽ tìm chính xác cụm từ đó theo đúng thứ tự.
Như trên ví dụ DQL sẽ chỉ trả về document chứa cụm “wind rises” liền nhau, chứ không phải “wind ... rises” cách nhau

Reserved characters – ký tự đặc biệt trong DQL​

\ ( ) : < > " *
=> Các ký tự này nếu muốn tìm chính ký tự đó trong dữ liệu, ta phải “escape” (thoát) nó bằng dấu \

Ta sẽ đặt dấu \ trước ký tự đặc biệt
vd: 2\*3 -> tìm cụm 2*3

Tìm kiếm trong một trường cụ thể​

field_name: <từ cần tìm>
VD: title: rises wind

Nếu Wildcard trong tên field (field có khoảng trắng):
Nếu tên field có khoảng trắng hoặc ký tự đặc biệt, ta phải dùng ký tự đại diện * để match nó
VD tồn tại field như sau: "article title": "Wind turbines"
field có khoảng trắng -> khi tìm kiếm phải tìm như sau: article*title: wind
QueryÝ nghĩa
title: windField "title" chứa từ "wind".
title: (wind OR windy)Field "title" chứa "wind" hoặc "windy".
title: "wind rises"Field "title" chứa cụm từ chính xác "wind rises".
title.keyword: The wind risesField title.keyword (dạng exact, không phân tích) khớp chính xác cả chuỗi.
title*: windBất kỳ field nào bắt đầu bằng title (title, title.keyword, title.suggest...) chứa từ wind
article*title: windField bắt đầu bằng "article" và kết thúc bằng "title"
description:*Những document có tồn tại field description


Wildcards (ký tự đại diện)​

Chỉ hỗ trợ *
Có thể dùng trong:
  • Field name
    • VD1: title*: wind -> tìm field bắt đầu bằng "title"
    • VD2: article*title: wind -> field bắt đầu bằng "article" và kết thúc bằng "title"
  • Search term:
    • VD1: t*le: *wind -> t*le có thể match title, table, *wind match từ có chứa wind, ví dụ "coldwind", "windstorm"

Ranges — Truy vấn theo khoảng số hoặc ngày​

Các toán tử:
  • >
  • <
  • >=
  • <=
VD1: page_views > 100 and page_views <= 300 -> tìm những document mà field page_views nằm trong khoảng từ 101 đến 300 (bao gồm 300)

VD2: date >= "2013-01-01" and date < "2024-01-01"
không có toán tử != nên phải dùng not để chỉ không bằng

VD3 : not page_views: 100 -> các document có page_views khác 100 và cả document không có field page_views

VD4: page_views:* and not page_views: 100 -> document có field page_views và không bằng 100,

Boolean Operators - and, or, not​

  • DQL không phân biệt hoa thường
VD: title: wind and description: epic
-> document vừa có “wind” trong title và có “epic” trong description

  • Thứ tự ưu tiên là not → and → or
VD: media_type: article or title: wind and description: epic
-> media_type: article OR (title: wind AND description: epic) tức là các document có title chứa wind và description chứa epic hoặc media_type chứa article.

  • Có thể dùng dấu ngoặc để thay đổi thứ tự ưu tiên
VD: (media_type: article or title: wind) and description: epic
-> trước tiên xem media_type chứa article hoặc title chứa wind rồi tất cả kết quả phải có description chứa epic
Chú ý:
title: windy or historical
-> (title: windy) OR (historical) tức là tìm các từ windy trong title hoặc từ historical trong tất cả fields.
title: (windy or historical) sẽ tương đương với title: windy or title: historical

NOT:
VD: title: wind and not (media_type: article or description: epic) -> document có title chứa wind + không phải media_type = article + không có epic trong description
Có thể lồng nhiều cấp
VD: title: ((wind or windy) and not rises) -> title chứa wind hoặc title chứa windy nhưng không chứa rises

Object fields​

Truy vấn bằng dấu chấm (.): để tham chiếu đến trường (field) bên trong của 1 đối tượng (object)
VD: patient.name: john
lệnh này tìm kiếm john trong field name của object (đối tượng) patient

Nested fields​

Trong OpenSearch, một field có thể chứa:
  • một object đơn
  • một mảng object
  • một nested object (đặc biệt hơn so với object)
DQL có cú pháp riêng để truy vấn nested-type fields.
vd tài liệu như sau:
{
"status": "Discharged",
"patients": [
{"name": "John Doe", "age": 56, "smoker": true},
{"name": "Mary Major", "age": 85, "smoker": false}
]
}


VD1: patients: {name: john} ->tìm patient có name = John nghĩa là trong mảng patients, tìm phần tử có "name": "john"
VD2: patients: {name: john} and status: discharged -> tìm name có tên john với status:discharged
VD3: patients: {name: john and smoker: true and age < 57} -> Lọc trong cùng 1 phần tử của patients: name = john smoker = true age < 57

Doubly nested fields
nested + nested
{
"patients": [
{
"names": [
{ "name": "John Doe", "age": 56, "smoker": true },
{ "name": "Mary Major", "age": 85, "smoker": false}
]
}
]
}
Để truy vấn trường name dùng cú pháp
patients: {names: {name: john}}

Object + nested
{
"patients": {
"names": [
{ "name": "John Doe", "age": 56, "smoker": true },
{ "name": "Mary Major", "age": 85, "smoker": false}
]
}
}
Để truy vấn trường name dùng cú pháp
patients.names: {name: john}
 
Back
Top