Trong các hệ thống tìm kiếm hiện đại, Elasticsearch cung cấp nhiều phương thức truy vấn linh hoạt để xử lý dữ liệu có cấu trúc và bán cấu trúc. Dưới đây là tổng hợp các loại truy vấn phổ biến nhất, kèm ví dụ minh họa rõ ràng và phân tích ngắn gọn về ngữ cảnh sử dụng phù hợp.
1. Truy vấn match – Tìm kiếm văn bản phân tích
Dùng để tìm kiếm trên trường kiểu text, tự động áp dụng bộ phân tích (analyzer) tương ứng. Kết quả trả về dựa trên độ liên quan (relevance score).
GET /posts/_search
{
"query": {
"match": {
"summary": "thời tiết hôm nay"
}
}
}
Ví dụ cấu hình mapping:
PUT /posts
{
"mappings": {
"properties": {
"summary": {
"type": "text",
"fields": {
"raw": { "type": "keyword" }
}
},
"likes": { "type": "integer" },
"title": { "type": "keyword" }
}
}
}
2. Truy vấn match_all – Lấy toàn bộ tài liệu
Không áp dụng điều kiện lọc nào, thường dùng khi cần phân trang hoặc kiểm tra sơ bộ dữ liệu.
GET /posts/_search
{
"query": {
"match_all": {}
}
}
3. Truy vấn multi_match – Tìm trên nhiều trường
Cho phép tìm cùng một cụm từ trên nhiều trường khác nhau — hữu ích khi triển khai thanh tìm kiếm tổng quát.
GET /posts/_search
{
"query": {
"multi_match": {
"query": "Elasticsearch",
"fields": ["title^3", "summary"]
}
}
}
4. Truy vấn term – So khớp chính xác
So sánh giá trị nguyên bản (không phân tích), chỉ áp dụng hiệu quả với trường kiểu keyword, integer, hay boolean.
GET /posts/_search
{
"query": {
"term": {
"status": "published"
}
}
}
5. Truy vấn terms – Danh sách giá trị
Tương đương với mệnh đề IN trong SQL, hỗ trợ kiểm tra thành viên trong tập hợp.
GET /posts/_search
{
"query": {
"terms": {
"category": ["tech", "devops", "cloud"]
}
}
}
6. Truy vấn range – Khoảng giá trị
Hỗ trợ so sánh số học và ngày tháng với các toán tử: gt, gte, lt, lte.
GET /posts/_search
{
"query": {
"range": {
"likes": {
"gte": 10,
"lte": 100
}
}
}
}
7. Truy vấn exists – Kiểm tra sự tồn tại của trường
Xác định xem tài liệu có chứa giá trị không-null cho một trường cụ thể hay không.
GET /posts/_search
{
"query": {
"exists": {
"field": "published_at"
}
}
}
8. Truy vấn wildcard – Mẫu ký tự thay thế
Sử dụng * (bất kỳ chuỗi nào) và ? (một ký tự), phù hợp với trường kiểu keyword. Lưu ý: không nên dùng trên trường text đã phân tích — hãy trỏ vào sub-field .keyword.
GET /posts/_search
{
"query": {
"wildcard": {
"author.raw": "*Nguyễn*"
}
}
}
9. Truy vấn bool – Kết hợp điều kiện phức tạp
Là nền tảng để xây dựng logic truy vấn nâng cao, gồm bốn phần tử chính:
- must: tất cả điều kiện đều phải đúng (AND)
- must_not: điều kiện bị loại trừ (NOT)
- should: ít nhất một điều kiện đúng (OR)
- filter: điều kiện lọc không ảnh hưởng đến điểm số (tối ưu hiệu năng)
GET /posts/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"filter": [
{ "term": { "status": "published" } },
{ "range": { "likes": { "gte": 5 } } }
],
"must_not": [
{ "term": { "category": "draft" } }
]
}
}
}
10. Truy vấn geo_distance – Tìm theo bán kính địa lý
Áp dụng khi dữ liệu chứa tọa độ địa lý (geo_point). Kết quả trả về các tài liệu nằm trong khoảng cách xác định từ một điểm.
GET /venues/_search
{
"query": {
"geo_distance": {
"location": [105.834, 21.028],
"distance": "5km",
"distance_type": "plane"
}
}
}
Cấu hình mapping mẫu:
PUT /venues
{
"mappings": {
"properties": {
"name": { "type": "keyword" },
"location": { "type": "geo_point" }
}
}
}