+3

Elasticsearch - Giải quyết bài toán tìm kiếm và truy vấn dữ liệu

1. Vấn đề

  • Chúng ta có các dịch vụ microservices hoạt động với các dữ liệu khác nhau nhưng chúng có liên quan tới nhau. Yêu cầu đặt ra: Chúng ra muốn có khả năng tổng hợp, sắp xếp và lọc các dữ liệu này trên giao diện người dùng.
  • Yêu cầu việc lọc dữ liệu cần phải diễn ra nhanh chóng trong vòng vài giây và tuyệt đối không thể làm mất dữ liệu.
  • Làm thế nào để bạn giải quyết vấn đề kết hợp dữ liệu từ nhiều dịch vụ trong quá trình chạy các truy vấn tìm kiếm?

2. Giải pháp được đưa ra

  • Trong tình huống mô tả trên, khi chúng ta cần phải làm việc với nhiều dữ liệu độc lập trên các services khác nhau. Việc tổng hợp, sắp xếp và lọc dữ liệu này là một bài toán khó và Elasticsearch có thể là một giải pháp hữu ích.
  • Bài viết này sẽ đưa đến cho bạn đọc một cái nhìn tổng quan nhất về Elasticsearch.

3. Elasticsearch là gì?

  • Elasticsearch là một hệ thống tìm kiếm và phân tích dữ liệu mã nguồn mở, được xây dựng trên nền tảng Apache Lucene. Nó được thiết kế để tìm kiếm, lọc, sắp xếp và tổng hợp dữ liệu một cách nhanh chóng và hiệu quả từ các nguồn dữ liệu lớn và phức tạp. Elasticsearch có khả năng xử lý dữ liệu văn bản, dữ liệu có cấu trúc và bán cấu trúc, cũng như hỗ trợ các truy vấn địa lý và dữ liệu theo thời gian thực.
  • Một vài điểm nổi bật của Elasticsearch đánh dấu sự ảnh hưởng mạnh mẽ của nó đối với việc xử lý dữ liệu
    • Tìm kiếm hiệu quả: Elasticsearch sử dụng Lucene - một thư viện tìm kiếm mã nguồn mở - để thực hiện tìm kiếm ngược. Điều này cho phép nhanh chóng truy vấn và trả về kết quả tìm kiếm chính xác.
    • Phân tán và Mở rộng: Thiết kế phân tán của Elasticsearch cho phép hoạt động trong môi trường phức tạp và khả năng mở rộng theo chiều ngang thông qua việc thêm các node và cluster mới giúp nâng cao hiệu suất và khả năng chịu tải.
    • Khả năng tìm kiếm toàn văn bản: Elasticsearch hỗ trợ tìm kiếm và đánh giá độ phù hợp của văn bản dựa trên nội dung sử dụng kỹ thuật TF-IDF để xác định sự quan trọng của từ trong văn bản.
    • Tìm kiếm địa lý và Thời gian thực: Elasticsearch hỗ trợ truy vấn địa lý và dữ liệu theo thời gian thực giúp bạn tìm kiếm và phân tích dữ liệu dựa trên vị trí và thời gian, đáp ứng nhu cầu phân tích thời gian thực.
    • Giao diện RESTful API: Elasticsearch cung cấp giao diện RESTful API dễ dàng sử dụng, cho phép thực hiện các truy vấn và thao tác trên dữ liệu một cách linh hoạt.
    • Tích hợp dễ dàng: Elasticsearch tích hợp dễ dàng với nhiều ngôn ngữ lập trình, framework và các công cụ phổ biến như Java, Python, NodeJs.
    • Phân tích dữ liệu: Khả năng phân tích dữ liệu của Elasticsearch không chỉ giới hạn ở việc tìm kiếm. Elasticsearch sử dụng Natural Language Processing và cung cấp các tính năng tổng hợp dữ liệu giúp chúng ta khám phá được những thông tin ẩn sau dữ liệu.

4. Thành phần trong Elasticsearch

Elasticsearch là một nền tảng mạnh mẽ và đa dạng, được xây dựng từ nhiều thành phần cốt lõi làm việc cùng nhau để tạo ra một hệ thống tìm kiếm và phân tích dữ liệu đáng tin cậy. Dưới đây là một cái nhìn tổng quan về các thành phần quan trọng trong Elasticsearch:

  • NODE: Là một thành phần cơ bản của Elasticsearch, thường là một thực thể độc lập chạy trên máy chủ hoặc một container. Hệ thống Elasticsearch có thể có nhiều Node hoạt động song song, cùng cung cấp khả năng mở rộng và sự dự phòng.
  • CLUSTER: Là một tập hợp các Node hoạt động cùng nhau. Việc kết hợp nhiều Node vào một cụm giúp tăng cường hiệu suất, khả năng mở rộng và sẵn sàng cho hệ thống.
  • INDEX: Tương ứng với tập hợp các tài liệu có cùng cấu trúc và thuộc tính. Đây có thể hiểu như một table trong CSDL SQL. Với mỗi tài liệu trong index có một ID và ID này là duy nhất.
  • DOCUMENT: Là tài liệu thực chứa dữ liệu được lưu trữ trong Elasticsearch. Mỗi tài liệu có cấu trúc dữ liệu riêng, được xác định bởi một ánh xạ (mapping).
  • MAPPING: Định rõ cấu trúc của dữ liệu trong một index. Nó xác định loại dữ liệu cho từng field bao gồm cả kiểu dữ liệu và các thuộc tính như chỉ mục hoặc độ tương đồng.
  • SHARD: Mỗi index có thể được chia thành các phần nhỏ gọi là Shard. Shard giúp Elasticsearch phân phối dữ liệu qua nhiều Node trong cụm để tối ưu hiệu suất và khả năng mở rộng.
  • REPLICA: Là bản sao của Shard, mang tính dự phòng. Nó cung cấp sự an toàn cho dữ liệu và giúp tăng khả năng đồng thời truy vấn bằng cách phân tải lên nhiều Node.
  • QUERY: Là yêu cầu tìm kiếm hoặc truy vấn trong Elasticsearch. Được xây dựng bằng ngôn ngữ DSL, query cho phép bạn tìm kiếm và lọc dữ liệu theo nhiều tiêu chí.
  • AGGREGATION: Cho phép thực hiện các phân tích phức tạp trên dữ liệu như tính tổng, trung bình, lọc và nhóm dữ liệu.
  • ANALYZER: Xác định cách dữ liệu văn bản được phân tách, chuẩn hóa và chỉ mục.
  • INGESTNODE: Cho phép xử lý và biến đổi dữ liệu trước khi lưu trữ.

5. Elasticsearch Query

  • Match Query: Là câu query cơ bản và nổi bật của Elasticsearch, trả về kết quả nếu bất kỳ document nào chứa query truyền lên.
GET customers/_search
{
  "query": {
    "match": {
      "name": "Nguyen Van A"
    }
  }
}
//Kết quả tìm thấy sẽ chứa tất cả các documment có chứa từ Nguyen hoặc Van hoặc A được trả về
  • Match-phrase Query: Giống match query tuy nhiên match-phrase query là search chính xác. Nó chỉ trả về các documment nào chứa chính xác giống query truyền lên.
 GET customers/_search
{
  "query": {
    "match_phrase": {
      "name": "Nguyen Van A"
    }
  }
}
//Kết quả trả về những documment nào có text là Nguyen Van A
  • Multi-match query: Giống như search theo match query và match-phrase query nhưng nó search được trên nhiều field khác nhau.
GET customers/_search
{
  "query": {
    "multi_match": {
      "query": "Nguyen Van A",
      "fields": ["name", "depscription"],
      "type": "phrase"
    }
  }
}
//query: là query bạn truyền lên
//fields: là các field mà bạn muốn search trong đó. Ở đây mình muốn tìm kiếm các documment có text Nguyen Van A trong field name và depscription Customer
//type: là kiểu mà bạn muốn search. Mặc định khi không truyền lên trường này thì sẽ hiểu đang search theo kiểu match.
  • Term query, terms query: Truy vấn này thường được dùng cho việc search các field có kiểu dữ liệu dạng số, ngày tháng. Nếu search text chúng ta nên sử dụng match query. Term query là search chính xác
GET customers/_search
{
  "query": {
    "term": {
      "customer_id": 1
    }
  }
}
//Query lấy ra customer có id =1.

GET customers/_search
{
  "query": {
    "terms": {
      "customer_id": [1,2]
    }
  }
}
//Customer có id =1 hoặc id =2.
  • Range query: Loại query trả về các documment trong 1 khoảng điều kiện query. Range query thường được sử dụng search khoảng time, khoảng tuổi, …
GET customers/_search
{
  "query": {
    "range": {
      "birthday": {
        "gte": "2001/01/01",
        "lte": "2001/12/31"
      }
    }
  }
}
//gt: tùy chọn lớn hơn, gte: lớn hơn hoặc bằng
//lt: nhỏ hơn, lte: nhỏ hơn hoặc bằng
  • Bool query: Loại query cho phép kết hợp nhiều query khác nhau cùng 1 lúc
GET customers/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase": {
            "name": "Nguyen Van A"
          },
          "term": {
            "customer_id": 1
          }
        }
      ]
    }
  }
}
//must giống như điều kiện AND tức là kết quả được lấy ra phải thóa mãn tất cả các query truyền lên
//should: search theo điều kiện OR, thỏa mãn 1 trong các điều kiện query truyền lên là được

6. Sử dụng Kibana kết hợp với Elasticsearch

Kibana và Elasticsearch là hai công cụ không thể tách rời trong việc xây dựng và quản lý hệ thống tìm kiếm và phân tích dữ liệu mạnh mẽ. Elasticsearch là hệ thống tìm kiếm và phân tích dữ liệu cốt lõi, trong khi Kibana là giao diện đồ họa dễ sử dụng, cho phép bạn tương tác với dữ liệu và trực quan hóa thông tin. Sử dụng Kibana để tối ưu hóa trải nghiệm sử dụng Elasticsearch.

  • Khám phá dữ liệu một cách trực quan: Kibana cung cấp giao diện đồ họa cho việc trực quan hóa dữ liệu. Bằng cách sử dụng biểu đồ, biểu đồ tròn và bản đồ địa lý, bạn có thể nhanh chóng hiểu và phân tích các mẫu và xu hướng trong dữ liệu một cách trực quan.
  • Tạo bảng điều khiển tùy chỉnh: Với Kibana, bạn có thể tạo các bảng điều khiển tùy chỉnh để tổng hợp thông tin từ Elasticsearch và hiển thị nó theo cách bạn muốn. Bạn có thể tạo các bảng điều khiển cho các biểu đồ thống kê, bản đồ địa lý, và thậm chí là các bảng dữ liệu.
  • Truy vấn dữ liệu dễ dàng: Kibana cung cấp giao diện trực quan để bạn tạo và thực thi các truy vấn đến Elasticsearch. Bạn có thể tìm kiếm, lọc và sắp xếp dữ liệu một cách dễ dàng thông qua các giao diện trực quan.
  • Xem log và sự kiện: Với tích hợp Logstash - một phần của Stack ELK (Elasticsearch, Logstash, Kibana), Kibana cho phép bạn trực quan hóa và tìm kiếm các log và sự kiện hệ thống. Điều này rất hữu ích trong việc theo dõi và phân tích hoạt động hệ thống.
  • Tùy chỉnh mở rộng: Kibana cho phép bạn tùy chỉnh và mở rộng giao diện để phù hợp với nhu cầu cụ thể của bạn. Bạn có thể tạo các trang tự thiết kế và bổ sung các plugin bên ngoài để mở rộng khả năng.
  • Tích hợp với khoảng thời gian thực: Với Elasticsearch hỗ trợ dữ liệu theo thời gian thực, Kibana cho phép bạn theo dõi và hiển thị dữ liệu theo thời gian thực thông qua biểu đồ và bảng điều khiển.
  • Dễ dàng chia sẻ thông tin: Kibana cho phép bạn chia sẻ các bảng điều khiển, biểu đồ và thông tin phân tích với người khác. Bạn có thể tạo các liên kết chia sẻ để đồng chia sẻ thông tin với đồng đội.

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí