- 1 Giới thiệu tổng quan về Elasticsearch
- 2 Kiến trúc cơ bản của Elasticsearch
- 3 Elasticsearch hoạt động như thế nào?
- 4 Các thành phần trong hệ sinh thái Elastic Stack
- 5 Hướng dẫn cài đặt và cấu hình Elasticsearch
- 6 Index và Mapping trong Elasticsearch
- 7 Truy vấn dữ liệu với Elasticsearch
- 8 Ứng dụng thực tế của Elasticsearch
- 9 So sánh Elasticsearch với các công nghệ khác
- 10 Tối ưu hiệu suất Elasticsearch
- 11 Bảo mật và mở rộng Elasticsearch
- 12 Kết luận & lời khuyên
- 13 Tài nguyên & liên kết hữu ích
Giới thiệu tổng quan về Elasticsearch
Elasticsearch là gì?
Elasticsearch là một công cụ tìm kiếm và phân tích dữ liệu phân tán mã nguồn mở, được xây dựng trên thư viện Apache Lucene. Nó cho phép lưu trữ, tìm kiếm và phân tích dữ liệu theo thời gian thực với khả năng mở rộng cao. Điểm mạnh nổi bật của Elasticsearch là khả năng tìm kiếm toàn văn (full-text search) cực kỳ nhanh và chính xác, ngay cả với tập dữ liệu lớn hàng tỷ bản ghi.
Elasticsearch thường được sử dụng như một phần của Elastic Stack (ELK Stack: Elasticsearch, Logstash, Kibana), dùng để xây dựng các hệ thống phân tích log, công cụ tìm kiếm cho website, ứng dụng thương mại điện tử, và các nền tảng phân tích dữ liệu lớn (big data).
Vì sao Elasticsearch trở thành công cụ tìm kiếm phổ biến?
- Tốc độ cao: Nhờ kiến trúc inverted index và khả năng truy vấn phân tán, Elasticsearch có thể xử lý hàng triệu truy vấn mỗi giây.
- RESTful API dễ dùng: Elasticsearch hỗ trợ API dựa trên HTTP/JSON, thân thiện với lập trình viên.
- Khả năng mở rộng linh hoạt: Elasticsearch dễ dàng mở rộng theo chiều ngang với nhiều node trong cluster.
- Tìm kiếm mạnh mẽ: Hỗ trợ từ tìm kiếm đơn giản đến truy vấn phức tạp (DSL), autocomplete, suggest, highlight…
- Phân tích dữ liệu theo thời gian thực: Hỗ trợ aggregation, filter, và dashboard trực quan qua Kibana.
- Tích hợp đa nền tảng: Tương thích với nhiều ngôn ngữ như Python, Java, Node.js, Go…
Lịch sử và sự phát triển
Elasticsearch được phát triển bởi Shay Banon vào năm 2010, với mục tiêu xây dựng một công cụ tìm kiếm phân tán dễ cài đặt, cấu hình và mở rộng. Từ đó đến nay, nó đã trở thành một phần không thể thiếu trong các hệ thống data-driven hiện đại.
- 2012: Elastic được thành lập, phát triển các công cụ liên quan (Kibana, Logstash).
- 2015: Ra mắt Elastic Stack – giải pháp end-to-end cho thu thập, tìm kiếm và phân tích dữ liệu.
- Hiện tại: Elasticsearch được dùng bởi các công ty lớn như Netflix, Uber, eBay, LinkedIn, GitHub, và cả trong DevOps/Observability.
Kiến trúc cơ bản của Elasticsearch
Để hiểu rõ cách Elasticsearch hoạt động, lập trình viên cần nắm vững kiến trúc cơ bản của hệ thống:
1. Cluster
Một cluster là tập hợp các node Elasticsearch hoạt động cùng nhau, dùng chung một tên cluster name. Cluster đảm bảo tính sẵn sàng và mở rộng.
2. Node
Node là một instance Elasticsearch. Có nhiều loại node:
- Master Node: quản lý metadata, phân chia shard.
- Data Node: lưu trữ dữ liệu và xử lý truy vấn.
- Client/Coordinating Node: nhận request và phân phối đến các node khác.
3. Index
Giống như database trong RDBMS, một index chứa nhiều document, và mỗi index có thể có nhiều shard để phân phối dữ liệu.
4. Document & Field
Dữ liệu trong Elasticsearch được lưu dưới dạng JSON document, có các field tương ứng với từng thuộc tính.
{
"title": "Giới thiệu Elasticsearch",
"tags": ["search", "elasticsearch"],
"published_at": "2024-05-01"
}
Shard và Replica
- Shard: Elasticsearch tự động chia index thành các phần nhỏ (shard) để lưu trữ phân tán.
- Replica: là bản sao của shard nhằm tăng tính sẵn sàng và hiệu năng truy vấn.
✅ Ví dụ: Một index có 3 shards và mỗi shard có 1 replica → tổng cộng 6 phân vùng dữ liệu sẽ được phân phối trên các node.

Elasticsearch hoạt động như thế nào?
Quá trình index dữ liệu
Khi bạn gửi dữ liệu mới vào Elasticsearch (qua API), nó sẽ:
- Phân tích nội dung (tokenization)
- Xây dựng inverted index
- Lưu trữ document trên một shard (do master node chỉ định)
Inverted Index là gì?
Đây là cấu trúc dữ liệu cốt lõi giúp Elasticsearch tìm kiếm nhanh. Thay vì lưu document tuần tự, nó lưu mapping từ term → document ID.
Ví dụ:
Document 1: "Elasticsearch là công cụ tìm kiếm"
Document 2: "Công cụ mạnh mẽ cho phân tích dữ liệu"
Inverted index:
"Elasticsearch" → [1]
"công" → [1, 2]
"công cụ" → [1, 2]
"tìm kiếm" → [1]
"phân tích" → [2]
Truy vấn dữ liệu (Query DSL)
Elasticsearch hỗ trợ một ngôn ngữ truy vấn JSON-based gọi là Query DSL, cho phép:
- Match query: tìm kiếm theo nội dung
- Bool query: kết hợp nhiều điều kiện
- Range query: tìm trong khoảng
- Aggregation: nhóm và thống kê
{
"query": {
"match": {
"title": "elasticsearch"
}
}
}
Tính điểm (Scoring) và xếp hạng
Kết quả truy vấn được xếp hạng theo điểm _score, tính dựa trên:
- Tần suất từ khóa (TF)
- Độ hiếm của từ khóa (IDF)
- Độ dài của document
Phân tích dữ liệu
Elasticsearch sử dụng Analyzer để phân tích văn bản:
- Tokenizer: cắt từ
- Filter: chuyển lowercase, bỏ stop word
Bạn có thể dùng analyze API để xem từ khóa được phân tích thế nào.
Các thành phần trong hệ sinh thái Elastic Stack
Elasticsearch không hoạt động một mình. Nó thường được dùng kết hợp với các công cụ khác tạo thành Elastic Stack (hay ELK Stack):

1. Kibana – Công cụ trực quan hóa dữ liệu
Kibana là giao diện frontend giúp lập trình viên và DevOps:
- Truy vấn dữ liệu trong Elasticsearch mà không cần viết mã
- Xây dựng biểu đồ, dashboard, phân tích thời gian thực
- Quản lý index, visualize log, monitor hệ thống
Ví dụ:
- Vẽ biểu đồ số lượng truy cập theo ngày
- Tạo heatmap thể hiện lỗi hệ thống theo khu vực
Kibana là công cụ không thể thiếu nếu bạn dùng Elasticsearch cho logging và observability.
Logstash – Pipeline xử lý dữ liệu
Logstash là một công cụ ETL (Extract – Transform – Load):
- Input: nhận log hoặc dữ liệu từ nhiều nguồn (file, syslog, Kafka, Beats…)
- Filter: chuyển đổi, parse, enrich dữ liệu (grok, mutate…)
- Output: gửi vào Elasticsearch, Kafka, stdout…
input { file { path => "/var/log/nginx/access.log" } }
filter { grok { match => { "message" => "%{COMMONAPACHELOG}" } } }
output { elasticsearch { hosts => ["localhost:9200"] } }
Beats – Lightweight agents thu thập dữ liệu
Beats là tập hợp các lightweight data shipper, ví dụ:
- Filebeat: gửi log file
- Metricbeat: gửi thông số CPU, RAM
- Packetbeat: phân tích gói tin mạng
Beats cực kỳ nhẹ, dễ triển khai trên hàng trăm server, lý tưởng để thu thập dữ liệu từ edge nodes hoặc hệ thống phân tán.
Hướng dẫn cài đặt và cấu hình Elasticsearch
Cài đặt Elasticsearch không quá phức tạp, nhưng bạn nên chọn đúng môi trường để triển khai tùy theo mục đích sử dụng.
1. Cài đặt trên Ubuntu
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update && sudo apt install elasticsearch
Sau đó chỉnh sửa file cấu hình /etc/elasticsearch/elasticsearch.yml:
cluster.name: my-cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["127.0.0.1"]
Chạy dịch vụ:
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
Chạy bằng Docker (nhanh và tiện lợi)
docker run -d --name elasticsearch \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
-p 9200:9200 \
docker.elastic.co/elasticsearch/elasticsearch:8.12.0
Kiểm tra hoạt động:
curl http://localhost:9200
Dùng Kibana Dev Tools để thử nghiệm truy vấn
Sau khi cài Kibana, bạn có thể vào tab Dev Tools để gửi truy vấn trực tiếp:
GET /_cat/indices?v=true
Đây là nơi cực kỳ hữu ích để test Query DSL mà không cần qua curl hay Postman.
Index và Mapping trong Elasticsearch

1. Index – đơn vị lưu trữ dữ liệu chính
Tương tự như một bảng trong database, Index chứa nhiều document JSON. Bạn có thể tạo index đơn giản như sau:
PUT /products
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
Mapping – định nghĩa schema cho document
Mapping là cách bạn định nghĩa kiểu dữ liệu cho các field, ví dụ:
PUT /products/_mapping
{
"properties": {
"name": { "type": "text" },
"price": { "type": "float" },
"created_at": { "type": "date" }
}
}
Nếu bạn không khai báo mapping, Elasticsearch sẽ dùng dynamic mapping để tự đoán loại dữ liệu – điều này có thể gây lỗi về sau.
Các kiểu dữ liệu thường dùng trong Elasticsearch
| Kiểu dữ liệu | Ý nghĩa |
|---|---|
text | Dữ liệu cần phân tích, full-text search |
keyword | Dữ liệu phân loại (tags, status) |
date | Thời gian ISO hoặc epoch |
integer, float | Số học |
boolean | True/False |
geo_point | Dữ liệu địa lý (latitude, longitude) |
Dynamic Mapping và khi nào nên tắt
Dynamic mapping tiện lợi khi thử nghiệm, nhưng trong production bạn nên tắt:
PUT /logs/_mapping
{
"dynamic": "strict"
}
Như vậy nếu có field lạ xuất hiện, Elasticsearch sẽ báo lỗi – giúp bạn giữ schema chặt chẽ hơn.
Truy vấn dữ liệu với Elasticsearch
Elasticsearch không chỉ lưu trữ dữ liệu – điểm mạnh thực sự nằm ở khả năng truy vấn phức tạp và cực kỳ linh hoạt thông qua một hệ thống gọi là Query DSL (Domain Specific Language).
Truy vấn với REST API
Elasticsearch cung cấp RESTful API cho tất cả các thao tác:
GET: lấy dữ liệuPOST/PUT: index dữ liệuDELETE: xóa document/indexSEARCH: thực hiện truy vấn
Ví dụ truy vấn đơn giản:
GET /products/_search?q=name:elasticsearch
Sử dụng Query DSL (JSON-based)
Query DSL là cú pháp chuẩn để mô tả các truy vấn phức tạp, ví dụ:
Match query
GET /products/_search
{
"query": {
"match": {
"name": "elasticsearch"
}
}
}
Bool query (AND/OR/NOT)
{
"query": {
"bool": {
"must": [
{ "match": { "category": "book" } },
{ "range": { "price": { "lte": 300 } } }
]
}
}
}
Term query (tìm exact match)
{
"query": {
"term": {
"status": "active"
}
}
}
Aggregation – nhóm và thống kê
Tương tự như GROUP BY trong SQL, Aggregation giúp phân tích dữ liệu:
{
"aggs": {
"avg_price": { "avg": { "field": "price" } }
}
}
Một số loại aggregation phổ biến:
terms: nhóm theo giá trịdate_histogram: nhóm theo ngày/giờstats,min,max,sum,avg: thống kê cơ bản
Highlight & Suggestion
Highlight – làm nổi bật từ khóa tìm được
{
"query": { "match": { "description": "search engine" } },
"highlight": {
"fields": {
"description": {}
}
}
}
Suggestion – gợi ý từ khóa
{
"suggest": {
"text": "elastik",
"spellcheck": {
"term": {
"field": "name"
}
}
}
}
Autocomplete – tìm kiếm khi gõ
Sử dụng custom analyzer và edge-ngram filter, bạn có thể triển khai autocomplete tương tự như Google Search, phù hợp với các ứng dụng thương mại điện tử hoặc CMS.
Ứng dụng thực tế của Elasticsearch
Elasticsearch không chỉ là một công cụ tìm kiếm. Với hiệu năng cao và khả năng mở rộng mạnh mẽ, nó được ứng dụng trong nhiều lĩnh vực:
1. Search Engine cho website hoặc app
- Tìm kiếm toàn văn (full-text search) trong nội dung bài viết, sản phẩm
- Autocomplete, Suggest, Highlight
- Gợi ý nội dung liên quan (related content)
Ví dụ: Tiki, Shopee, Medium đều dùng Elasticsearch để phục vụ truy vấn nhanh theo từ khóa.
2. Phân tích log hệ thống
Kết hợp cùng Filebeat + Logstash + Kibana, Elasticsearch có thể:
- Thu thập log từ hàng ngàn server
- Phân tích lỗi, truy vết exception
- Giám sát an ninh, cảnh báo xâm nhập (SIEM)
Đây là lý do Elasticsearch phổ biến trong DevOps và SecOps.
3. Recommendation System
Sử dụng các kỹ thuật phân cụm, lọc cộng tác (collaborative filtering), Elasticsearch có thể:
- Đề xuất sản phẩm theo hành vi người dùng
- Phân tích session để cá nhân hóa nội dung
4. Analytics thời gian thực
Nhờ vào khả năng tính toán Aggregation và cập nhật gần như tức thì, bạn có thể xây dựng dashboard:
- Thống kê đơn hàng, lượt xem theo thời gian
- Phân tích tỷ lệ chuyển đổi (conversion rate)
- Theo dõi hiệu suất campaign marketing
5. E-commerce và các hệ thống ERP
- Lọc sản phẩm đa điều kiện (filter theo brand, giá, size…)
- Xử lý tìm kiếm hàng tồn kho
- Kết nối với hệ thống BI để phân tích dữ liệu mua bán
So sánh Elasticsearch với các công nghệ khác
1. Elasticsearch vs MongoDB (Text Search)
| Tính năng | Elasticsearch | MongoDB Full-text |
|---|---|---|
| Tìm kiếm toàn văn nâng cao | ✅ Có | ⚠️ Giới hạn |
| Scoring & Relevance | ✅ Có hỗ trợ chi tiết | ❌ Không có tính điểm |
| Aggregation mạnh mẽ | ✅ | ⚠️ Có nhưng chậm hơn |
| Hiệu năng tìm kiếm lớn | ✅ Tối ưu shard | ⚠️ Không phân tán tốt |
| Quản lý dữ liệu | ❌ Không thay DB | ✅ Là database chính |
Elasticsearch không thay thế MongoDB, nhưng là complement tuyệt vời nếu bạn cần tìm kiếm nâng cao.
2. Elasticsearch vs Apache Solr
| Yếu tố | Elasticsearch | Solr |
|---|---|---|
| Dễ triển khai | ✅ Docker, REST API | ❌ Cấu hình phức tạp hơn |
| Community | ✅ Rộng, Elastic Stack | ⚠️ Hẹp hơn |
| API REST | ✅ JSON-based | ⚠️ XML-based |
| Scaling | ✅ Dynamic | ⚠️ Manual config |
Solr cũng rất mạnh, nhưng Elasticsearch vượt trội về tính thân thiện và tích hợp DevOps hiện đại.
3. Khi nào nên chọn Elasticsearch?
Bạn nên dùng Elasticsearch khi:
- Cần tìm kiếm full-text mạnh mẽ
- Dữ liệu lớn, cần phân tán
- Muốn realtime analytics
- Hệ thống log phức tạp
- Dashboard trực quan cho dữ liệu phi cấu trúc
Ngược lại, nếu bạn chỉ cần lưu trữ transactional, hãy dùng PostgreSQL/MongoDB/MySQL.
Tối ưu hiệu suất Elasticsearch
Triển khai Elasticsearch ở quy mô nhỏ khá dễ dàng, nhưng khi hệ thống mở rộng với hàng trăm triệu bản ghi, việc tối ưu hóa hiệu suất trở nên cực kỳ quan trọng. Dưới đây là những chiến lược và best practices đã được kiểm chứng trong thực tế.
1. Thiết kế index và schema hợp lý
- Tránh index chứa quá nhiều field không cần thiết (giảm overhead).
- Dùng
keywordthay vìtextnếu không cần full-text search. - Gộp các trường dữ liệu có liên hệ thành object hoặc nested để tối ưu truy vấn.
Ví dụ: Thay vì lưu
address_line_1,address_line_2, hãy dùngaddress: { line_1, line_2 }.
2. Giảm số lượng shard không cần thiết
Quá nhiều shard dẫn đến:
- Overhead RAM và CPU cho cluster
- Gây chậm khi phân tán dữ liệu
Gợi ý:
- Với index < 50GB → dùng 1–3 shard là đủ
- Dùng Shrink API để gộp shard
3. Batch indexing thay vì ghi từng bản ghi
Ghi dữ liệu hàng loạt (bulk) tiết kiệm rất nhiều tài nguyên:
POST _bulk
{ "index": { "_index": "logs" } }
{ "message": "Lỗi 500", "level": "error" }
{ "index": { "_index": "logs" } }
{ "message": "Thành công", "level": "info" }
Bulk API là công cụ bắt buộc khi insert log, event hoặc đồng bộ dữ liệu từ hệ thống khác.
4. Caching và filter context
Elasticsearch tự động cache:
filter(vì không tính _score)- aggregation thường dùng
Tận dụng bằng cách:
- Dùng
filterthay vìmustkhi có thể - Hạn chế dùng script trong truy vấn
5. Theo dõi hiệu suất với Kibana
Sử dụng Stack Monitoring để theo dõi:
- Memory/CPU usage
- Shard hoạt động
- Query latency
- Indexing throughput
Bạn cũng có thể dùng các dashboard sẵn có như:
- Elasticsearch Performance Overview
- Log Rate & Error Rate by Host
Bảo mật và mở rộng Elasticsearch
Elasticsearch bản thương mại cung cấp nhiều tính năng bảo mật. Với phiên bản OSS (open source), bạn cũng có thể áp dụng một số biện pháp cơ bản sau:
1. Xác thực người dùng
Elasticsearch hỗ trợ:
- Basic Auth: dùng cho môi trường dev/test
- API Key: dùng trong microservice, script
- SSO/LDAP: với phiên bản cao cấp (Elastic Cloud)
curl -u "admin:password" http://localhost:9200
2. Mã hóa kết nối
Bật TLS cho cả HTTP và giao tiếp nội bộ giữa các node:
xpack.security.transport.ssl.enabled: true
xpack.security.http.ssl.enabled: true
3. Role-based access control (RBAC)
Phân quyền người dùng theo role:
read,write,monitor,manage_index_templates, …- Chỉ cho phép truy cập index cụ thể
Ví dụ:
{
"cluster": ["monitor"],
"indices": [
{
"names": ["logs-*"],
"privileges": ["read"]
}
]
}
4. Mở rộng hệ thống (scale out)
Tăng khả năng chịu tải bằng:
- Horizontal scaling: thêm node → tăng shard phân phối
- Dedicated node: tách biệt master/data/ingest node
- Cross-cluster search: tìm kiếm giữa nhiều cluster
Lưu ý: Luôn đặt
minimum_master_nodes = (n/2) + 1để tránh split-brain.
Kết luận & lời khuyên
Khi nào nên dùng Elasticsearch?
- Khi bạn cần truy vấn full-text mạnh mẽ
- Hệ thống có log phức tạp, cần real-time monitoring
- Cần dashboard thống kê linh hoạt mà SQL không đáp ứng được
- Tìm kiếm sản phẩm, văn bản, sự kiện ở quy mô lớn
Best Practices cho lập trình viên
- Tìm hiểu kỹ mapping trước khi nhập dữ liệu
- Luôn dùng
bulk APIthay vì ghi từng bản ghi - Sử dụng
filterđể tận dụng cache - Tách index theo thời gian nếu dữ liệu dạng time-series (logs)
- Tránh query wildcard và scripting nếu không cần thiết
Học gì tiếp theo?
- Khóa học miễn phí từ Elastic: https://www.elastic.co/training/
- Sách gợi ý: Elasticsearch: The Definitive Guide (Clinton Gormley, Zachary Tong)
- Các case study thực tế từ Uber, eBay, GitHub
Xem thêm: Vector Search là gì? Ứng dụng và cách triển khai hiệu quả








