Quay lại

Bài 2: Elasticsearch và Kibana: Hướng Dẫn Thao Tác Cơ Bản Chuyên mục Elasticsearch    2024-03-28    18 Lượt xem    17 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Bài 2: Elasticsearch và Kibana: Hướng Dẫn Thao Tác Cơ Bản

Giới Thiệu

Elasticsearch và Kibana là hai công cụ mạnh mẽ trong hệ sinh thái Elastic Stack, được sử dụng rộng rãi cho việc lưu trữ, tìm kiếm và phân tích dữ liệu lớn. Trong bài viết này, chúng ta sẽ khám phá cách thực hiện các thao tác cơ bản với Elasticsearch thông qua giao diện Kibana, từ việc tạo chỉ mục, thêm, cập nhật, truy vấn đến xóa Documents.

Đầu tiên, chúng ta sẽ bắt đầu với việc tạo chỉ mục và cấu hình shard trong Elasticsearch để chuẩn bị cho việc lưu trữ dữ liệu. Sau đó, chúng ta sẽ tìm hiểu cách thêm các Documents vào chỉ mục, cũng như làm thế nào để truy vấn thông tin từ các Documents đã lưu.

Tiếp theo, chúng ta sẽ xem xét các chức năng khác như cập nhật, xóa Documents và kiểm tra sự tồn tại của chúng trong chỉ mục. Chúng ta cũng sẽ tìm hiểu cách xem mapping của chỉ mục để hiểu cấu trúc của dữ liệu được lưu trữ.

Cuối cùng, chúng ta sẽ khám phá các chức năng mạnh mẽ khác của Elasticsearch như bulk operations và cách thực hiện các thao tác nâng cao như tìm kiếm văn bản và phân tích dữ liệu.

Hãy cùng bắt đầu hành trình của chúng ta vào thế giới phức tạp nhưng thú vị của Elasticsearch và Kibana!

Tất cả các bước mình làm đều có trên doc của elasticsearch các bạn có thể lên đó để tham khảo nhé!

Thực Hành

1. Tạo Chỉ mục (Index) và Shard

Đầu tiên, chúng ta cần tạo một chỉ mục mới trong Elasticsearch. Một chỉ mục là một bộ sưu tập các Documents có cùng cấu trúc.

PUT products​

Tạo index với cấu hình shards trên môi trường cluster.

PUT products
{
  "settings": {
    "number_of_shards": 2
  }
}​

Khi bạn tạo một chỉ mục mới trong một môi trường cụm (cluster) Elasticsearch, các shard của chỉ mục đó sẽ được phân bố đến các node trong cụm một cách tự động. Quá trình phân bố này sẽ tuân theo các chiến lược và cấu hình phân tán mặc định hoặc được cấu hình bởi bạn.

Mặc định, Elasticsearch sẽ tự động phân bố các shard vào các node trong cụm để tối ưu hóa việc phân tải công việc và tăng cường tính khả dụng. Cụ thể, các shard sẽ được phân bố đều đặn trên các node có sẵn và sẽ không có một node nào có quá nhiều shard hoặc quá ít shard.

  1. API Cluster Health:

    • Gửi một yêu cầu GET tới /_cluster/health/{index} để kiểm tra trạng thái của chỉ mục.
    • Trong câu trả lời, bạn sẽ thấy một số thông tin, bao gồm số lượng shard và số lượng shard replica được phân bố trên các node.
    • Kiểm tra xem số lượng shard và shard replica có đủ và đều đặn không.
    • GET _cluster/health/data
  2. API Cluster State:

    • Gửi một yêu cầu GET tới /_cluster/state/{index} để lấy thông tin chi tiết về trạng thái của chỉ mục.
    • Trong câu trả lời, bạn sẽ thấy danh sách các shard và shard replica được phân bố trên các node.
    • GET _cluster/state/data

Khi bạn chạy API Cluster Health

{
  "cluster_name": "docker-cluster",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 3,
  "number_of_data_nodes": 3,
  "active_primary_shards": 3,
  "active_shards": 6,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 0,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting_in_queue_millis": 0,
  "active_shards_percent_as_number": 100
}

Các ban có thể thấy rằng các shard của chỉ mục đã được phân bố đều đặn trên các node trong cụm Elasticsearch. Dưới đây là một số lý do để đi đến kết luận này:

  1. "number_of_nodes": 3: Cụm Elasticsearch của bạn có tổng cộng 3 node.

  2. "number_of_data_nodes": 3: Tất cả các node trong cụm đều là các node dữ liệu, nghĩa là chúng đều có khả năng lưu trữ shard dữ liệu.

  3. "active_primary_shards": 3: Tất cả các shard chính (primary shards) trong chỉ mục đều đang hoạt động.

  4. "active_shards": 6: Tổng số lượng shard đang hoạt động trên cụm là 6. Vì mỗi shard chính (primary shard) đi kèm với một shard replica, nên số lượng shard hoạt động sẽ gấp đôi số lượng shard chính.

  5. "relocating_shards": 0, "initializing_shards": 0, "unassigned_shards": 0: Không có shard nào đang được di chuyển (relocating), khởi tạo (initializing), hoặc chưa được phân bổ (unassigned).

Mặc định mà Elasticsearch hoạt động khi phân phối shard và shard replica trên cụm:

  1. Primary Shard: Mỗi primary shard của một chỉ mục được lưu trữ trên một node cụ thể trong cụm. Elasticsearch sẽ quyết định node nào sẽ chứa primary shard dựa trên thuật toán phân chia phân tán mặc định hoặc các cấu hình tùy chỉnh. Số lượng primary shard được xác định khi tạo chỉ mục và không thể thay đổi sau đó mà không cần tái tạo chỉ mục.

  2. Shard Replica: Các shard replica của mỗi primary shard sẽ được phân bố đều trên các node còn lại trong cụm. Elasticsearch sẽ tự động sao chép primary shard sang shard replica và phân phối chúng trên các node khác nhau để đảm bảo tính sẵn sàng và khả năng phục hồi sau khi xảy ra sự cố.

Việc chia đều shard replica trên các node giúp tăng tính sẵn sàng và phân tải công việc trên cụm, vì khi một node gặp sự cố, shard replica có thể được sử dụng để thay thế mà không làm mất dữ liệu hoặc giảm hiệu suất của hệ thống.

2. Thêm Document

Tiếp theo, chúng ta có thể thêm các Documents vào chỉ mục và truy vấn chúng.

POST products/_doc
{
  "id" : 1,
  "name": "Product 1",
  "price": 300.444,
  "created_at": "20-2-2024"
}

POST products/_doc/2
{
  "id" : 2,
  "name": "Product 2",
  "price": 300.444,
  "created_at": "20-2-2024"
}

POST products/_create/3
{
  "id" : 3,
  "name": "Product 3",
  "price": 300.4441,
  "created_at": "20-2-20243"
}

POST products/_doc/112?op_type=create
{
  "id" : 4,
  "name": "Product 4",
  "price": 300.4441,
  "created_at": "20-2-20243"
}

3. Truy vấn để lấy 1 doc cụ thể

# GET doc with full source
GET products/_doc/2

#GET doc with specific source fields
GET products/_doc/1?_source=name,price

4. Truy vấn Nhiều Documents (MGET)

Chúng ta cũng có thể truy vấn nhiều Documents cùng một lúc bằng cách sử dụng MGET.

GET _mget
{
  "docs": [
    {
      "_index": "products",
      "_id": 1,
      "_source": ["name", "price"]
    }
  ]
}​

Nếu tất cả các Documents muốn lấy ra có cùng _index  thì chỉ cần truyền vào một Array các ids chứ không cần docs

GET products/_mget
{
  "ids": [2]
}

Nếu muốn lấy hết docs chúng ta có thể sử dụng:

GET customers/_search

5. Cập nhật

Elasticsearch cũng cho phép chúng ta cập nhật

PUT products/_doc/1
{
  "name": "Updated Product 1",
  "price": 400.00
}​
6. Xóa
DELETE products/_doc/1

5. Kiểm tra Sự Tồn Tại của Documents và Chỉ mục (HEAD)

Chúng ta có thể kiểm tra xem một Documents hoặc chỉ mục có tồn tại không bằng cách sử dụng HEAD.

Kiểm tra doc có tồn tại hay không

HEAD products/_doc/1​

Kiểm tra index có tồn tại hay không

HEAD products
7. Count docs
GET products/_count

6. Xem Mapping của Chỉ mục

Mapping mô tả cấu trúc của dữ liệu trong chỉ mục. Chúng ta có thể xem mapping của một chỉ mục bằng cách sau:

GET products/_mapping

7. Thay đổi Mapping Properties

Mapping properties mô tả kiểu dữ liệu của các trường trong chỉ mục. Chúng ta có thể thay đổi mapping properties của chỉ mục bằng cách sau:

PUT products/_mapping
{
  "properties" : {
    "number": {
      "type":  "integer"
    }
  }
}​

9. Thêm Nhiều Documents (Bulk)

Chúng ta cũng có thể thêm nhiều Documents cùng một lúc vào chỉ mục bằng cách sử dụng Bulk API.

POST products/_bulk
{"create": {}}
{"id" : 5, "name": "Product 5", "price": 300.444, "created_at": "20-2-2024"}
{"create": {}}
{"id" : 6, "name": "Product 6", "price": 300.444, "created_at": "20-2-2024"}
{"create": {}}
{"id" : 7, "name": "Product 7", "price": 300.444, "created_at": "20-2-2024"}​

Bulk không chỉ cung câp cho chúng ta phương thức create mà nó còn cung cấp các phương thức khác nữa:

POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title":"My first blog post" }
{ "index": { "_index": "website", "_type": "blog" }}
{ "title":"My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} }

10. Xóa Documents

Cuối cùng, Elasticsearch cho phép chúng ta xóa các Documents từ chỉ mục.

DELETE products/_doc/112​
POST products/_delete_by_query
{
 "query": {
    "match": {"id": 1} 
  }
}

Kết Luận

Trong bài viết này, chúng ta đã học cách thực hiện các thao tác cơ bản với Elasticsearch thông qua giao diện Kibana. Tuy nhiên, để sử dụng Elasticsearch hiệu quả, hãy tiếp tục tìm hiểu và thử nghiệm các chức năng và tính năng phức tạp hơn của nền tảng này. Chúc bạn thành công trong việc sử dụng Elasticsearch để phân tích và tìm kiếm dữ liệu!

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday