Hướng dẫn tạo Document và quản lý Document cơ bản trong Elasticsearch

Hướng dẫn tạo Document và quản lý Document cơ bản trong ElasticsearchCuongquach.com | Tiếp nối series về Elasticsearch, sau khi bạn đã tìm hiểu các kiến thức khái niệm căn bản về Index, Document, Shard,… thì ở bài viết này chúng ta sẽ cùng tìm hiểu cách tạo một Document và vài thao tác quản lý Document cơ bản thường sử dụng trong Elasticsearch khi các bạn mới tiếp cận hệ thống ELK.

tạo document quản lý document trong elasticsearch

Có thể bạn quan tâm chủ đề khác
Tìm hiểu dịch vụ logstash trong hệ thống ELK Stack Logging
Ebook Beginning Elastic Stack
Giám sát log server Linux thời gian thực với công cụ Log.io
Các khái niệm về log trong Linux

Document trong Elasticsearch là gì ?

Document trong Elasticsearch là một đối tượng JSON (JSON Object) với thông tin cụ thể được lưu trữ bên trong một Elasticsearch Index. Một document là một đơn vị thông tin có thể được sử dụng để index. Ví dụ, bạn có thể có 1 document cho 1 khách hàng, hoặc cũng có thể có một document cho một sản phẩm, thậm chí một document cho một đơn hàng.

Document này được thể hiện thông tin theo cấu trúc dữ liệu JSON rất phổ biến. Dữ liệu trong document được định nghĩa giống JSON được xây dựng trên 2 phần đó là key và value, điều này tương ứng trong CSDL là tên field và giá trị của nó ở một record nào đó. Nếu mà so sánh với các Cơ Sở Dữ Liệu quan hệ như SQL thì có thể xem document với một row của 1 bảng.

Xem thêm nội dung về Index – Elasticsearch
– Hướng dẫn tạo Index và quản lý Index trong Elasticsearch

Tương tác với Elasticsearch

Nhằm nhắc lại với bạn rằng chúng ta sẽ tương tác với Elasticsearch qua REST API với các phương thức HTTP Method như “GET, POST, PUT, DELETE” trong phần thực hành của bài viết này. REST API sẽ có format như sau :

http://host:port/[index]/[type]/[_action/id]

Với các ví dụ ở dưới thì ‘localhost‘ chính là máy chủ ES của bạn, bạn đang đứng ở terminal thực thi lệnh trên máy chủ ES. Bạn có thể sử dụng một số chương trình API Tool Client như Postman,.. hoặc có thể sử dụng chương trình lệnh ‘curl‘ trên Linux.

1. Tạo document với ID cụ thể

Nếu bạn biết cụ thể thông tin ID mà bạn muốn gán cho document (document’s _id) chuẩn bị tạo, thì chỉ cần chỉ định ID đó trên cấu trúc URL API với cấu trúc :

POST /[index]/[type]/[document-id]

Giả sử lệnh dưới sẽ thêm thông tin document với ID là ‘mynewid‘ vào Index ‘cuongquach-company‘.

# curl -X POST -H 'Content-Type: application/json' 'localhost:9200/cuongquach-company/employee/mynewid?pretty' -d '
{
    "first_name": "Cuong",
    "last_name": "Quach",
    "email_address": "cuongquach.community@gmail.com"
}
'

{
  "_index" : "cuongquach-company",
  "_type" : "employee",
  "_id" : "mynewid",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

Phần ID Document cũng có thể là số như ‘4‘.

# curl -X POST -H 'Content-Type: application/json' 'localhost:9200/cuongquach-company/employee/4?pretty' -d '
{
    "first_name": "Cuong-4",
    "last_name": "Quach-4",
    "email_address": "cuongquach.community@gmail.com"
}
'

{
  "_index" : "cuongquach-company",
  "_type" : "employee",
  "_id" : "4",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

Chú thích:
_index : tên Index mà document thuộc về.
_type : tên Type mà document thuộc về.
?pretty : cách thức quy định dữ liệu json trả về của Elasticsearch có format dễ đọc.

Vậy là bạn đã có thể tạo một document thành công với một ID cụ thể. Vậy nếu bạn không hề muốn truyền thông tin ID cụ thể cho document thì sẽ như thế nào ?

2. Tạo Document với ID ngẫu nhiên trong Elasticsearch

Nếu vì lý do nào đó như nhận log ngẫu nhiên và không có tính toán trước các id cụ thể cho một log document thì bạn hoàn toàn có thể thêm dữ liệu document vào Index và Elasticsearch sẽ tự động khởi tạo ID ngẫu nhiên đại diện cho document đó.

Ví dụ, mình đẩy dữ liệu vào type ‘employee‘ của Index ‘cuongquach-company‘ mà không gán ID document cụ thể.

# curl -X POST -H 'Content-Type: application/json' 'localhost:9200/cuongquach-company/employee?pretty' -d '
{
    "class": "Cuongquach-Elasticsearch",
    "action": "Tao-Document-Thuc-Hanh",
    "email_address": "cuongquach.community@gmail.com"
}
'

{
  "_index" : "cuongquach-company",
  "_type" : "employee",
  "_id" : "4ep8dGUBQ123fjwMFEtj",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 3
}

Bạn sẽ thấy ngay ID là chuỗi kí tự ngẫu nhiên được ES khởi tạo cực kì xấu xí ‘4ep8dGUBQ123fjwMFEtj‘, nhưng nếu những dữ liệu log trong Index đó không quá quan trọng thì tuỳ thuộc vào nhu cầu của bạn thôi.

3. Đọc dữ liệu Document trong Elasticsearch

Để đọc dữ liệu một document trong Elasticsearch, chúng ta cần xác định các thông tin ‘_index‘, ‘_type‘ và ‘_id‘ của document , tiếp đó sử dụng phương thức HTTPGET.

GET /[index]/[type]/[type]?pretty

Ví dụ :

# curl -X GET -H 'Content-Type: application/json' 'localhost:9200/cuongquach-company/employee/1?pretty'
{
  "_index" : "cuongquach-company",
  "_type" : "employee",
  "_id" : "1",
  "_version" : 4,
  "found" : true,
  "_source" : {
    "first_name" : "Cuong",
    "last_name" : "Quach",
    "email_address" : "cuongquach.community@gmail.com"
  }
}

Đoạn dữ liệu trả về sẽ kèm trường ‘found‘ có value là ‘true’ cho việc tìm thấy dữ liệu document id được yêu cầu, hoặc là ‘false‘ cho trường hợp không tìm thấy document id bạn muốn.

Bên cạnh đó Elasticsearch cũng trả về mã lỗi ‘HTTP 404 Not found‘ kèm dữ liệu json phản hồi nếu không tìm thấy document.

# curl -i -X GET -H 'Content-Type: application/json' 'localhost:9200/cuongquach-company/employee/10?pretty'
HTTP/1.1 404 Not Found
content-type: application/json; charset=UTF-8
content-length: 97

{
  "_index" : "cuongquach-company",
  "_type" : "employee",
  "_id" : "10",
  "found" : false
}

+ Đọc nội dung theo phần của Document
Mặc định nếu bạn truy vấn GET như trên, thì Elasticsearch sẽ trả về toàn bộ thông tin về document được chứa trong trường ‘_source‘ kèm theo thông tin metadata của document như index, type và version. Còn nếu bạn chỉ muốn đọc một phần nội dung cụ thể trong dữ liệu documnet. Thì đơn giản có thể tham khảo ví dụ cú pháp sau .

GET /[index]/[type]/[document]?_source=field1,field2

Bạn thêm tên biến ‘_source‘ vào sau tên của document id kèm theo các tên trường key mà bạn muốn trích xuất cách nhau bởi dấu phẩy.

Ví dụ:

# curl -X GET -H 'Content-Type: application/json' 'localhost:9200/cuongquach-company/employee/1?_source=first_name,email_address'
{
  "_index": "cuongquach-company",
  "_type": "employee",
  "_id": "1",
  "_version": 4,
  "found": true,
  "_source": {
    "email_address": "cuongquach.community@gmail.com",
    "first_name": "Cuong"
  }
}

hoặc bạn muốn dữ liệu trả về là nội dung chỉ là dữ liệu document nằm trong ‘_source‘ không cần metadata của document đó.

GET /[index]/[type]/[document]/_source

Ví dụ:

# curl -X GET -H 'Content-Type: application/json' 'localhost:9200/cuongquach-company/employee/1/_source'

{
    "first_name": "Cuong",
    "last_name": "Quach",
    "email_address": "cuongquach.community@gmail.com"
}

4. Cập nhật Document trong ES

Document trong Elasticsearch luôn ở trạng thái là ‘immutable‘ tức không thể thay đổi và chúng ta không thể thay đổi nội dung của document. Vậy làm cách nào nếu ta có nhu cầu cập nhật nội dung một document? Để làm được việc đó chúng ta sẽ ‘reindex‘ thay thế hoàn toàn document đang tồn tại bằng document mới.

Mường tượng thì giống như xoá cái document cũ, rồi index đổi tên document mới thành document id cũ. Thực ra nói thì dài dòng nhưng ES sẽ tự làm điều đó phía dưới hạ tầng khi chúng ta tạo dữ liệu mới với id cũ rồi gồm các bước :

  • Lấy dữ liệu JSON từ document cũ.
  • Thay đổi dữ liệu document.
  • Xoá document cũ.
  • Index lại document mới với ID cũ.

Ví dụ:
– Đầu tiên ta tạo một document mới rồi lát xem cập nhật document trong Elasticsearch thế nào nhé.

# curl -X POST -H 'Content-Type: application/json' 'localhost:9200/cuongquach-company/employee/100?pretty' -d '
{
    "class": "Cuongquach-Update-Document-1",
    "action": "Update-Document-1",
    "email_address": "cuongquach.community@gmail.com"
}
'

{
  "_index" : "cuongquach-company",
  "_type" : "employee",
  "_id" : "100",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 3
}

– Cập nhật lại document với cùng _id và nội dung mới.

# curl -X POST -H 'Content-Type: application/json' 'localhost:9200/cuongquach-company/employee/100?pretty' -d '
{
    "class": "Cuongquach-Update-Document-99",
    "action": "Update-Document-99",
    "email_address": "cuongquach.community@gmail.com"
}
'

{
  "_index" : "cuongquach-company",
  "_type" : "employee",
  "_id" : "100",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 3
}

– Sự khác biệt bạn có thể thấy chính là trường ‘_version‘ đã được thay đổi. Mỗi document đều có một số ‘_version‘, nếu bạn thường xuyên cập nhật thay đổi nội dung của document đó, thì mỗi lần thay đổi thì con số này sẽ được ES tăng tiến +1 lên để đánh dấu sự thay đổi. Số này chúng ta không thể can thiệp được.

# curl -X GET -H 'Content-Type: application/json' 'localhost:9200/cuongquach-company/employee/100?pretty'
{
  "_index" : "cuongquach-company",
  "_type" : "employee",
  "_id" : "100",
  "_version" : 2,
  "found" : true,
  "_source" : {
    "class" : "Cuongquach-Update-Document-99",
    "action" : "Update-Document-99",
    "email_address" : "cuongquach.community@gmail.com"
  }
}

5. Xoá một document trong ES

Chúng ta sẽ dùng phương thức HTTP DELETE và chỉ định ID của document thuộc Index/Type cụ thể để có thể tiến hành xoá document đó đi.

DELETE /[index]/[type]/[document]

Ví dụ: ta xoá document có ID ngẫu nhiên ở phần 2 là ‘4ep8dGUBQ123fjwMFEtj‘.

# curl -X DELETE -H 'Content-Type: application/json' 'localhost:9200/cuongquach-company/employee/4ep8dGUBQ123fjwMFEtj?pretty'
{
  "_index": "cuongquach-company",
  "_type": "employee",
  "_id": "4ep8dGUBQ123fjwMFEtj",
  "_version": 2,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 2,
  "_primary_term": 3
}

+ Timeout
Thời điểm mà primary shard được chỉ định thực hiện việc xoá Document mà vì lý do nào đó như quá tải hoặc có vấn đề sự cố không thể tiếp nhận xử lý việc xoá document. Thì mặc định ES sẽ đợi tầm 1 phút, đến khi primary shard có thể thực hiện thao tác xoá. Còn nếu bạn muốn chỉ định thời gian timeout lâu hơn như 3 phút thì thêm vào URL như sau :

DELETE /cuongquach-company/employee/1?timeout=5m

Tổng kết

Vậy là hẳn bạn đã hiểu qua các thao tác giúp bạn tạo một Document trong Elasticsearch cũng như các thao tác cơ bản giúp bạn quản lý Document. Tuy còn nhiều thao tác nâng cao liên quan đến Document sẽ được đề cập ở các bài viết khác, nhưng hy vọng với nội dung đây đủ để bạn từng bước từng bước chinh phục Elasticsearch.

Nguồn: https://cuongquach.com/

Previous articleEbook Mastering pfSense (PDF)
Next articleEbook Internet of Things cho người mới bắt đầu (PDF)
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !