Những phần hướng dẫn này viết theo nguồn từ Document của Elasearch, tương tác với Elasticsearch thực hiện bằng lệnh curl để tạo ra các yêu cầu HTTPD GET, PUSH, UPDATE, DELETE tới Elaticsearch.

Bạn có thể sử dụng ngôn ngữ lập trình của mình với các thư viện thích hợp thay vì dùng trực tiếp cUrl, miễn là tạo được HTTP Request với các phương thức như PUT, GET ... kèm dữ liệu JSON (REST API) gủi đến server Elasticsearch

Tương tác với Elaticsearch với cURL

Giả sử Elaticsearch của bạn truy cập được bằng địa chỉ http://localhost:9200 để thực hiện HTTP Request đến nó gõ lệnh curl với tham số -X sau đó là tên phương thức (POST, GET, DELETE ...) rồi đến địa chỉ Elaticsearch

curl -X PHƯƠNG_THỨC http://localhost:9200
Ví dụ:
curl -X GET http://localhost:9200

HTTP Request với dữ liệu JSON (REST API): khi cần gửi dữ liệu JSON đi kèm, cần chỉ định HEADER Content-Type: application/json để làm điều này cho vào tham số curl đoạn mã -H 'Content-Type: application/json', sau đó là nội dung JSON-d '{Nội dung JSON}'

Ví dụ sau gửi nội dung JSON

{
    "name": "XuanThuLab",
    "age": "20"
}

Đến địa chỉ localhost:9200/customer/_doc/1?pretty bằng phương thức PUT

curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: appliation/json' -d' { "name": "John Doe", "age": "20" } '

Tương tác Elasticsearch bằng Kibana

Kibana là công cụ quản lý, tương tác với Elasticsearch thông qua nền web, ở phần trước đã cài đặt Kibana cùng với Elasticsearch, bạn chỉ cần truy cập đến địa chỉ http://localhost:5601 để vào công cụ này.

Kibana

Tạm thời chưa đi sâu vào công cụ này, ở đây bạn chỉ cần vào mục Dev Tools (xem ở trên), để truy cập vào công cụ Console, tại đó bạn gõ các HTTP Request và gửi đến Elastic một cách trực quan (kể cả kết quả trả về).

Ví dụ tạo truy vấn PUT chèn, cập nhật dữ liệu như hình dưới, rất trực quan!

Kibana

Sử dụng Elasticsearch cơ bản

Kiểm tra sức khỏe của Elasticsearch

Trong quá trình Elasticsearch vận hành, cần giám sát tình trạng của nó, để kiểm tra thực hiện HTTP/REST đến _cat/health?v bằng curl sau:

curl -X GET "localhost:9200/_cat/health?v"
Hoặc Kibana:
Kibana

Kết quả cho thấy tên của cluster là elasticsearch và trạng thái là yellow, có ba trạng thái:

  • Green Mọi thứ OK, cluster có thể thực hiện đầy đủ chức năng
  • Yellow Dữ liệu ổn, nhưng có các bản backup replicas
  • Red dữ liệu có vấn đề

Tương tự, kiểm tra danh sách các node (server) thực hiện GET đến /_cat/nodes?v

curl -X GET "localhost:9200/_cat/nodes?v"

ip         heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
172.30.0.3           27          95   2    0.13    0.10     0.08 mdi       *      elasticsearch

Ở đây trả về có một node (server) trong cluster, node này có tên là elasticsearch

Liệt kê các Index

Muốn liệt kê các Index thì GET đến /_cat/indices?v

curl -X GET "localhost:9200/_cat/indices?v"

Khởi tạo một Index

Ở phần trước đề cập, Index là một tập hợp những dữ liệu có chung một số tên thuộc tính, tính chất - nó giống như một table trong SQL. Giờ ta sẽ tiến hành tạo một index có tên là customer, thật đơn giản chỉ việc PUT đến địa chỉ /customer?pretty

curl -X PUT "localhost:9200/customer?pretty"
Hoặc Kibana:
PUT /customer?pretty

Xóa một index

Xóa đi một index có tên indexname

DELET /indexname?pretty

Lưu tài liệu vào Index / Thay thế tài liệu

Như đã biết các đơn vị dữ liệu là các Document, những Document này được biểu diễn bằng JSON, ví dụ đây là một dữ liệu:

{
  "name": "XuanThu Lab",
  "age": "20"
}

Mỗi dữ liệu lưu vào Index sẽ có một id gán cho nó, giờ sẽ lưu dữ liệu trên vào Index customer và gán cho nó id là 1, để làm điều đó thực hiện phương thức PUT đến /customer/_doc/1?pretty đính kèm dữ liệu JSON

curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
  "name": "XuanThu Lab",
  "age": "20"
}
'
Hoặc Kibana:
PUT /customer/_doc/1?pretty
{
  "name": "XuanThu Lab",
  "age": "20"
}

Sau khi chạy lệnh PUT, kết quả ES trả về là:

{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

Cho biết lưu thành công dữ liệu vào index customer, với id là 1

Nếu thực hiện PUT theo cú pháp trên, nếu id tài liệu đã tồn tại trước đó, nó sẽ được thay thế bởi dữ liệu mới => CẬP NHẬT

Nếu thực hiện PUT và không chỉ ra id thì ES sẽ tự sinh ID cho tài liệu mới. Bạn có thể dùng POST để tạo mới cho trường hợp này POST /customer/_doc/?pretty

curl -X POST "localhost:9200/customer/_doc?pretty" -H 'Content-Type: application/json' -d'
{
  "name": "Example Name"
}'

Đọc tài liệu từ Index

Nếu đã biết id của tài liệu trong Index customer, việc đọc nội dung của nó thực hiện bằng GET đến địa chỉ /customer/_doc/1?pretty

curl -X GET "localhost:9200/customer/_doc/1?pretty"

{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "XuanThu Lab",
    "age" : "20"
  }
}

Dữ liệu trả về là nội dung của tài liệu ở khóa _source đi kèm các thông tin như index, id ...

Nếu tài liệu không tồn tại, ví dụ GET với id = 5, thì nó sẽ thông báo không tìm thấy found = false

curl -X GET "localhost:9200/customer/_doc/5?pretty"

{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "5",
  "found" : false
}

Xóa tài liệu khỏi Index

Để xóa tài liệu với id chỉ việc thực hiện DELETE đến địa chỉ /indexname/_doc/id?pretty

curl -X PUT "localhost:9200/customer/_doc/3?pretty" -H 'Content-Type: application/json' -d' { "name": "Testname"}'

curl -X DELETE localhost:9200/customer/_doc/3?pretty

Thậm chí nếu muốn xóa cả index có tên là indexname cũng thực hiện DELETE đến /indexname?pretty

curl -X DELETE localhost:9200/customer?pretty

Thực hiện cả một bó lệnh

Các thao tác trên tài liệu như update, create, delete có thể tập hợp vào một file JSON gồm cả dữ liệu rồi yêu cầu ES thực hiện tập lệnh đó bằng cách POST tới /_bulk.

Cơ bản thì file JSON mổ tả cấu trúc dữ liệu trên từng dòng dạng:

lệnh_và_dữ_diệu_meta\n
dữ_liệu_tùy_chọn\n
lệnh_và_dữ_diệu_meta\n
dữ_liệu_tùy_chọn\n
lệnh_và_dữ_diệu_meta\n
dữ_liệu_tùy_chọn\n
...

Như vậy mỗi lệnh được mô tả bởi hai dòng liên tiếp. Ví dụ dữ liệu sau:

{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
  • Hai dòng dòng đầu cho biết tạo Document mới với id 1, lưu vào Index test, dữ liệu là { "field1" : "value1" }
  • Dòng 3 cho biết thực hiện xóa ...

Để thực hiện bó lệnh lệnh, chỉ việc truyền dữ liệu đó tới /_bulk bằng POST

curl -X POST "localhost:9200/_bulk" -H 'Content-Type: application/json' -d'
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
'

Hoặc nếu dữ liệu này lưu ở file data.json thì thực hiện nạp vào bằng cách

$ curl -s -H "Content-Type: application/x-ndjson" -XPOST localhost:9200/_bulk --data-binary "@data.json";

Trên đây là các lệnh cơ bản liên quan đến tạo, cập nhật, xóa tài liệu. Sau khi dữ liệu được đánh chỉ mục như vậy vào các Index, lúc này bạn có thể thực hiện truy vấn để khai thác khả năng tìm kiếm mạnh mẽ của ES. Đến phần tiếp theo API tìm kiếm dữ liệu Elasticsearch


Đăng ký nhận bài viết mới