Tóm tắt
Các API của Elasticsearch cung cấp khả năng tìm kiếm và phân tích ở quy mô lớn. Bạn lập chỉ mục tài liệu dưới dạng JSON, truy vấn bằng một DSL mạnh mẽ và tổng hợp kết quả để phân tích. Xác thực sử dụng khóa API hoặc xác thực cơ bản. Để kiểm thử, hãy sử dụng Apidog để xác thực ánh xạ chỉ mục, kiểm thử các truy vấn tìm kiếm và gỡ lỗi tổng hợp trước khi triển khai lên các cụm sản xuất.
Giới thiệu
Elasticsearch là một công cụ tìm kiếm và phân tích phân tán. Nó xử lý văn bản có cấu trúc, nhật ký, số liệu và nhiều hơn nữa. Các công ty sử dụng nó để tìm kiếm toàn văn trong ứng dụng, phân tích nhật ký để gỡ lỗi và bảng điều khiển phân tích thời gian thực.
Elasticsearch nằm ở trung tâm của bộ ELK (Elasticsearch, Logstash, Kibana). Nhưng bạn có thể sử dụng nó trực tiếp qua API mà không cần Logstash.
Kiểm thử API Elasticsearch với Apidog - miễn phí
Đến cuối hướng dẫn này, bạn sẽ có thể:
- Lập chỉ mục và quản lý tài liệu
- Viết các truy vấn tìm kiếm bằng DSL của Elasticsearch
- Sử dụng tổng hợp để phân tích
- Cấu hình ánh xạ và bộ phân tích
- Giám sát tình trạng cụm
Bắt đầu
Chạy Elasticsearch cục bộ
# Docker
docker run -p 9200:9200 \
-e "discovery.type=single-node" \
elasticsearch:8.11.0
# Or download from elastic.co
Xác minh cài đặt
curl -X GET "http://localhost:9200"
Phản hồi:
{
"name": "elasticsearch-1",
"cluster_name": "elasticsearch",
"cluster_uuid": "abc123",
"version": {
"number": "8.11.0",
"build_flavor": "default"
},
"tagline": "You know, for search"
}
Xác thực
Elasticsearch 8.x yêu cầu xác thực theo mặc định:
curl -X GET "http://localhost:9200/_cluster/health" \
-u elastic:your_password
Hoặc sử dụng khóa API (được tạo trong Kibana hoặc qua API).
Chỉ mục và tài liệu
Tạo một chỉ mục
curl -X PUT "http://localhost:9200/products" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"name": { "type": "text" },
"price": { "type": "float" },
"category": { "type": "keyword" },
"in_stock": { "type": "boolean" },
"created_at": { "type": "date" }
}
}
}'
Lập chỉ mục một tài liệu
curl -X POST "http://localhost:9200/products/_doc" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"name": "Wireless Headphones",
"price": 79.99,
"category": "electronics",
"in_stock": true,
"created_at": "2026-03-24T10:00:00Z"
}'
Phản hồi:
{
"_index": "products",
"_id": "abc123",
"_version": 1,
"result": "created",
"_seq_no": 0,
"_primary_term": 1
}
Lấy một tài liệu
curl -X GET "http://localhost:9200/products/_doc/abc123" \
-u elastic:your_password
Cập nhật một tài liệu
curl -X PUT "http://localhost:9200/products/_doc/abc123" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"name": "Wireless Headphones Pro",
"price": 99.99,
"category": "electronics",
"in_stock": true,
"created_at": "2026-03-24T10:00:00Z"
}'
Xóa một tài liệu
curl -X DELETE "http://localhost:9200/products/_doc/abc123" \
-u elastic:your_password
Các thao tác hàng loạt
Lập chỉ mục nhiều tài liệu một cách hiệu quả:
curl -X POST "http://localhost:9200/products/_bulk" \
-u elastic:your_password \
-H "Content-Type: application/x-ndjson" \
-d '{"index":{"_id":"1"}}
{"name":"Product A","price":10.99,"category":"books","in_stock":true}
{"index":{"_id":"2"}}
{"name":"Product B","price":20.99,"category":"electronics","in_stock":false}
'
Truy vấn tìm kiếm
Tìm kiếm cơ bản
curl -X GET "http://localhost:9200/products/_search" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"query": {
"match": {
"name": "headphones"
}
}
}'
Truy vấn Bool
Kết hợp nhiều điều kiện:
{
"query": {
"bool": {
"must": [
{ "match": { "name": "headphones" } }
],
"filter": [
{ "term": { "category": "electronics" } },
{ "range": { "price": { "lte": 100 } } },
{ "term": { "in_stock": true } }
]
}
}
}
Tìm kiếm toàn văn với tính điểm
{
"query": {
"multi_match": {
"query": "wireless audio headphones",
"fields": ["name^2", "description"],
"type": "best_fields",
"fuzziness": "AUTO"
}
}
}
Tên trường với ^2 sẽ có trọng số gấp đôi khi tính điểm.
Tìm kiếm cụm từ
Tìm các cụm từ chính xác:
{
"query": {
"match_phrase": {
"description": "noise canceling"
}
}
}
Ký tự đại diện và biểu thức chính quy
{
"query": {
"wildcard": {
"name": "*headphone*"
}
}
}
Sắp xếp
{
"query": { "match_all": {} },
"sort": [
{ "price": "asc" },
{ "_score": "desc" }
]
}
Phân trang
{
"from": 20,
"size": 10,
"query": { "match_all": {} }
}
Tổng hợp
Tổng hợp tính toán các thống kê tóm tắt trên dữ liệu của bạn.
Giá trung bình theo danh mục
curl -X GET "http://localhost:9200/products/_search" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"size": 0,
"aggs": {
"by_category": {
"terms": { "field": "category" },
"aggs": {
"avg_price": { "avg": { "field": "price" } },
"min_price": { "min": { "field": "price" } },
"max_price": { "max": { "field": "price" } }
}
}
}
}'
Biểu đồ tần suất giá
{
"size": 0,
"aggs": {
"price_histogram": {
"histogram": {
"field": "price",
"interval": 25
}
}
}
}
Biểu đồ tần suất ngày
{
"size": 0,
"aggs": {
"sales_over_time": {
"date_histogram": {
"field": "created_at",
"calendar_interval": "month"
}
}
}
}
Lực lượng (số lượng duy nhất)
{
"size": 0,
"aggs": {
"unique_categories": {
"cardinality": { "field": "category" }
}
}
}
Ánh xạ và bộ phân tích
Loại trường
| Loại | Dùng cho |
|---|---|
text |
Tìm kiếm toàn văn, được phân tích |
keyword |
Giá trị chính xác, lọc, sắp xếp |
integer, float |
Số |
boolean |
Đúng/sai |
date |
Ngày và giờ |
object |
Đối tượng JSON lồng nhau |
nested |
Mảng các đối tượng (duy trì mối quan hệ) |
geo_point |
Tọa độ vĩ độ/kinh độ |
Bộ phân tích tùy chỉnh
Để xử lý văn bản chuyên biệt:
{
"settings": {
"analysis": {
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "autocomplete_filter"]
}
},
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 20
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
}
Quản lý cụm
Tình trạng cụm
curl -X GET "http://localhost:9200/_cluster/health"
Phản hồi:
{
"cluster_name": "elasticsearch",
"status": "green",
"number_of_nodes": 3,
"active_primary_shards": 25
}
Trạng thái:
- green (xanh): Tất cả các shard đã được phân bổ
- yellow (vàng): Các bản sao chưa được phân bổ (một node duy nhất)
- red (đỏ): Các shard chính bị thiếu
Thống kê chỉ mục
curl -X GET "http://localhost:9200/_cat/indices?v"
Thống kê node
curl -X GET "http://localhost:9200/_nodes/stats"
Xóa bộ nhớ đệm
curl -X POST "http://localhost:9200/_cache/clear"
Kiểm thử với Apidog
Các truy vấn Elasticsearch có thể phức tạp. Hãy kiểm thử kỹ lưỡng.

1. Lưu các truy vấn phổ biến
Lưu trữ các mẫu tìm kiếm trong Apidog:
{
"query": {
"bool": {
"must": [
{ "match": { "{{search_field}}": "{{search_term}}" } }
],
"filter": [
{ "range": { "{{price_field}}": { "lte": "{{max_price}}" } } }
]
}
}
}
2. Xác thực phản hồi
pm.test('Search returns results', () => {
const response = pm.response.json()
pm.expect(response.hits.total.value).to.be.above(0)
})
pm.test('Aggregations present', () => {
const response = pm.response.json()
pm.expect(response.aggregations).to.exist
})
3. Phân tách môi trường
# Local
ES_HOST: http://localhost:9200
ES_USER: elastic
ES_PASSWORD: your_password
# Production
ES_HOST: https://search.yourcompany.com
ES_API_KEY: prod_api_key
Kiểm thử API Elasticsearch với Apidog - miễn phí
Các lỗi và cách khắc phục phổ biến
403 Bị cấm
Nguyên nhân: Xác thực thất bại hoặc quyền không đủ.
Cách khắc phục: Xác minh thông tin đăng nhập. Kiểm tra xem khóa API có quyền truy cập chỉ mục chính xác hay không.
404 index_not_found_exception
Nguyên nhân: Chỉ mục không tồn tại.
Cách khắc phục: Tạo chỉ mục trước, hoặc sử dụng tính năng tự động tạo (được bật theo mặc định nhưng không khuyến nghị cho môi trường sản xuất).
circuit_breaking_exception
Nguyên nhân: Truy vấn sử dụng quá nhiều bộ nhớ.
Cách khắc phục: Giảm tham số size, đơn giản hóa truy vấn, thêm bộ lọc để giảm tập kết quả.
search_phase_execution_exception
Nguyên nhân: Lỗi cú pháp truy vấn.
Cách khắc phục: Kiểm tra JSON của bạn. Các vấn đề thường gặp: thiếu dấu ngoặc kép, đường dẫn trường không chính xác.
Các lựa chọn thay thế và so sánh
| Tính năng | Elasticsearch | OpenSearch | Meilisearch | Typesense |
|---|---|---|---|---|
| Cài đặt | Tự lưu trữ | Tự lưu trữ | Một tệp nhị phân duy nhất | Một tệp nhị phân duy nhất |
| Chất lượng tìm kiếm | Xuất sắc | Tốt | Xuất sắc | Tốt |
| Đường cong học tập | Dốc | Dốc | Dễ dàng | Dễ dàng |
| Khả năng mở rộng | Xuất sắc | Xuất sắc | Tốt | Tốt |
| Dịch vụ đám mây | Elastic Cloud | OpenSearch Serverless | Meilisearch Cloud | Typesense Cloud |
Elasticsearch có nhiều tính năng và cộng đồng lớn nhất. Meilisearch và Typesense đơn giản hơn cho các tìm kiếm cơ bản.
Các trường hợp sử dụng thực tế
Tìm kiếm thương mại điện tử. Một trang web bán lẻ lập chỉ mục 100.000 sản phẩm. Người dùng tìm kiếm theo tên, mô tả, danh mục và khoảng giá. Tự động hoàn thành gợi ý sản phẩm khi họ nhập. Bộ lọc thu hẹp kết quả theo danh mục và tình trạng có sẵn.
Nhật ký ứng dụng. Một nhóm DevOps gửi nhật ký đến Elasticsearch qua Filebeat. Các kỹ sư tìm kiếm nhật ký theo dịch vụ, mức độ nghiêm trọng và khoảng thời gian. Bảng điều khiển hiển thị tỷ lệ lỗi và thời gian phản hồi.
Phân tích bảo mật. Một nhóm bảo mật lập chỉ mục nhật ký mạng. Họ tìm kiếm các địa chỉ IP đáng ngờ, trực quan hóa các mẫu lưu lượng và cảnh báo về các bất thường được phát hiện thông qua tổng hợp.
Tóm tắt lại
Đây là những gì bạn đã học:
- Lập chỉ mục tài liệu dưới dạng JSON
- Truy vấn bằng DSL của Elasticsearch
- Sử dụng tổng hợp để phân tích
- Cấu hình ánh xạ để tìm kiếm tối ưu
- Giám sát tình trạng cụm
Các bước tiếp theo của bạn:
- Chạy Elasticsearch cục bộ
- Tạo một chỉ mục với ánh xạ
- Lập chỉ mục một số tài liệu kiểm thử
- Viết các truy vấn tìm kiếm
- Thử các tổng hợp
Kiểm thử API Elasticsearch với Apidog - miễn phí
Câu hỏi thường gặp
Sự khác biệt giữa Elasticsearch và Solr là gì?Cả hai đều là công cụ tìm kiếm dựa trên Lucene. Elasticsearch có thiết kế phân tán và API tốt hơn. Solr có nhiều tính năng dành cho doanh nghiệp hơn. Hầu hết các dự án mới đều chọn Elasticsearch.
Làm thế nào để tôi xử lý các ký tự đặc biệt trong tìm kiếm?Thoát các ký tự đặc biệt: ()[]{}:^\"\\+-!~*?| bằng dấu gạch chéo ngược. Hoặc sử dụng simple_query_string dễ tính hơn.
Shard là gì?Shard là các phần của một chỉ mục. Mỗi shard là một chỉ mục Lucene. Các shard chính dùng để ghi, các shard bản sao là bản sao để mở rộng quy mô đọc và chịu lỗi.
Tôi nên tạo bao nhiêu shard?Quy tắc chung: 20-50GB cho mỗi shard. Bắt đầu với 1 shard chính, sau đó thêm các bản sao. Chỉ tăng số lượng shard chính khi cần (không thể giảm).
Tôi có thể thay đổi ánh xạ sau khi lập chỉ mục không?Một phần. Có thể thêm trường mới tự do. Để thay đổi loại trường hiện có, phải lập chỉ mục lại dữ liệu. Sử dụng mẫu chỉ mục để quản lý ánh xạ một cách nhất quán.
Tham số _routing là gì?Định tuyến tài liệu đến các shard cụ thể dựa trên giá trị trường. Mặc định là _id. Sử dụng định tuyến khi các truy vấn luôn lọc theo một trường cụ thể (như user_id) để có hiệu suất tốt hơn.
Làm thế nào để tôi xử lý dữ liệu dựa trên thời gian?Sử dụng các chỉ mục dựa trên ngày: logs-2026.03.24. Điều này cho phép bạn xóa dữ liệu cũ bằng cách loại bỏ các chỉ mục và cải thiện hiệu suất truy vấn bằng cách tìm kiếm ít chỉ mục hơn.
