Lăng Thị Cẩm Nhung
Intern
Mục lục:
I. Tổng quan DQLII. 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.
II. Cú pháp DQL
Bảng tham chiếu nhanh
| Tìm khi | DQL (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 field | title: wind |
| Kiểm tra field có tồn tại | description:* |
| Tìm giá trị theo khoảng số | page_views >= 100 and page_views <= 300 |
| Tìm trong khoảng ngày | date >= "1939-01-01" and date <= "2013-12-31" |
| Lọc theo nhiều điều kiện | media_type:film AND page_views:100 |
| Loại trừ điều kiện | NOT media_type: article |
| Tìm theo mẫu (wildcard) | title: wind* |
Ví dụ:
Tìm từ khóa đơn giản:
Tìm 2 từ:
Tìm cụm từ:
Kiểm tra field có tồn tại:
Kết hợp AND:
Nếu field không tồn tại:
Tìm giá trị theo khoảng số:
Câu truy vấn có điều kiện
Câu truy vấn loại trừ điều kiện (NOT)
Wildcards
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: wind | Field "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 rises | Field title.keyword (dạng exact, không phân tích) khớp chính xác cả chuỗi. |
| title*: wind | Bất kỳ field nào bắt đầu bằng title (title, title.keyword, title.suggest...) chứa từ wind |
| article*title: wind | Field 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ử:- >
- <
- >=
- <=
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
-> document vừa có “wind” trong title và có “epic” trong description
- Thứ tự ưu tiên là not → and → or
-> 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
-> 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)
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}
Bài viết liên quan
Được quan tâm
Bài viết mới