Tìm hiểu Elasticsearch: Công cụ tìm kiếm mạnh mẽ cho developer

Tìm hiểu Elasticsearch: Công cụ tìm kiếm mạnh mẽ cho developer
Mục lục ẩn

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.

Khởi đầu website của bạn thật mạnh mẽ, mượt mà với hệ thống hosting cấu hình cao cấp tại AZDIGI.

  • 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.

image 41

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ẽ:

  1. Phân tích nội dung (tokenization)
  2. Xây dựng inverted index
  3. 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):

image 42

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

image 43

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
textDữ liệu cần phân tích, full-text search
keywordDữ liệu phân loại (tags, status)
dateThời gian ISO hoặc epoch
integer, floatSố học
booleanTrue/False
geo_pointDữ 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ệu
  • POST/PUT: index dữ liệu
  • DELETE: xóa document/index
  • SEARCH: 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ăngElasticsearchMongoDB 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ốElasticsearchSolr
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 keyword thay vì text nế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ùng address: { 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 filter thay vì must khi 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 API thay 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ả

Tài nguyên & liên kết hữu ích

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

For security, use of CloudFlare's Turnstile service is required which is subject to the CloudFlare Privacy Policy and Terms of Use.

scroll to top