Chào xìn anh em!!!! Mình là Nguyễn Đức Thảo, sau cơ số ngày luyện công với thằng Elasticsearch thì cũng có năm được những khái niệm và cách làm việc với thằng Elasticsearch này!
Bài viết này được viết ra với dựa trên những thứ mà mình biết, chỉ mang tính cá nhân thoy nhe
Có rất nhiều kiến thức sâu về thằng Elastic, nhưng bài viết này chỉ xoay quanh việc làm như thế nào để truy vấn dữ liệu và CRUD với Elasticsearch!
Elasticsearch là gì?
Trước khi tìm hiểu một vấn đề gì đó thì ta phải biết nó là gì đã!
Elasticsearch là một search engine (công cụ tìm kiếm) rất mạnh mẽ.
Elasticsearch cũng có thể coi là một document oriented database (1) , nó chứa dữ liệu giống như một database và thực hiện tìm kiếm trên những dữ liệu đó.
Đại khái là thay vì bạn tìm kiếm trên file, trên các database như MySQL, Oracle, MongoDB… thì bạn chuyển dữ liệu đó sang Elasticsearch và thực hiện tìm kiếm trên Elasticsearch sẽ mang lại hiệu quả rất lớn, đặc biệt là trong những trường hợp dữ liệu lớn.
Cái này mình coppy thôi chứ cũng lười viết lắm
(1) document oriented database là gì? - Thường thì khi làm việc với các database như mysql, sql server, oracle..v..v... thì ta phải define cấu trúc cho từng table, với document oriented database thì dữ liệu hiển thị dạng dưới object JSON, chính vì thế cấu trúc của nó sẽ có thể thay đổi theo ý muốn và không có cố định nào cả. Nôm na là thế
Bắt đầu đi vào việc thêm,sửa,xóa với Elasticsearch
NOTE: Trước khi đọc phần này thì hãy đọc bài viết những khái niệm của elasticsearch để hiểu cơ bản những khái niệm của ElasticSearch nhé !
Cài đặt Elasticsearch:
- Có thể vào đây và làm theo hướng dẫn để cài trên MacOS,Linux,Window..v..v.. từ nhà sản xuất!
- Nếu bạn không muốn cài nó trực tiếp vào máy của mình thì có thể sử dụng Docker theo các bước dưới đây:
- B1: Tạo 1 file docker-compose.yml cùng cấp với thư mục src
- B2: Coppy đoạn code này paste vào file này, nếu bạn không biết về Docker thì không cần quan tâm đến mấy dòng này Nhưng bạn phải cài Docker Desktop trên máy của mình trước nhé, cài như thế nào thì trên gg rất nhiều
version: "3"
services: elasticsearch: container_name: viet-cinema-elasticsearch image: docker.elastic.co/elasticsearch/elasticsearch:7.15.2 environment: - discovery.type=single-node - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - bootstrap.memory_lock=true ports: - 9200:9200 volumes: - C:/data-es:/usr/share/elasticsearch/data kibana: container_name: viet-cinema-kibana image: docker.elastic.co/kibana/kibana:7.15.2 environment: - ELASTICSEARCH_HOSTS=http://viet-cinema-elasticsearch:9200 ports: - 5601:5601
#volumes:
# data-es:
# driver: ./data-es
- B3 : Mở terminal ở trong IDE lên và chạy lệnh
docker-compose up -d
và nhấn enter và đợi khi nó chạy xong!
- B4: Sau khi chạy xong bạn mở chrome lên vào truy cập vào url
http://localhost:9200/
và nó ra kết quả như thế này là thành công:Do trên đoạn code trên mình có 1 phần là Kibana nhưng mình sẽ không dùng đến thằng này mà mình sẽ thay thế nó bằng PostMan nên các bạn cứ kệ nó ở đó đừng quan tâm đến nó
BẮT ĐẦU NÀO :
Ở trong elasticsearch sẽ public những API để ta làm việc với elasticsearch. Bắt đầu nào
API Hiển thị thông tin version, cluster
GET /
API Hiển thị chi tiết thông tin node:
GET /_cat/nodes?format=json
API liệt kê, hiển thị các Index trong Elasticsearch
GET /_cat/_indices?v
API tạo Index trong Elasticsearch
PUT /{index_name}
Cài đặt các field, số replica set, số shard khi tạo Index
PUT /index_name
{ "settings" : { "index" : { "number_of_shards" : 3, "number_of_replicas" : 2 } }
}
number_of_shard = 5 và number_of_replicas = 1
Lưu ý về quy tắc đặt tên Index:
- Chỉ được đặt tên index bằng chữ in thường
- Không bao gồm các ký tự , /, *, ?, ", <, >, |,
(khoảng trắng / dấu cách), ,, #
- Từ Elasticsearch 7+ không được sử dụng ký tự :
- Không được bắt đầu bằng các ký tự -, _, +
- Không thể là . hoặc .., tuy nhiên có thể dùng ký tự . và kết hợp với các ký tự khác
- Không được dài hơn 255 bytes
API xóa Index trong Elasticsearch
DELETE /index_name
Xóa nhiều index trong cùng 1 request
DELETE /index_name_1,index_name_2
Xóa tất cả Index trong 1 request
DELETE /_all
API Insert, thêm dữ liệu vào Elasticsearch
Cách 1: Dùng API POST
POST /index_name/type_name/id
{ "field" : "value"
}
Trong đó:
index_name
vàtype_name
là tên của Index và tên của Type, nếu chưa tồn tại thì sẽ được tự động tạo- id là id của document được tạo, nếu không truyền id thì nó sẽ tự động tạo ra 1 chuỗi để làm id.
Trường hợp mình không truyền id thì id của document mới sẽ được tự động tạo ra.
Trường hợp index, type và id truyền vào đã tồn tại thì nó sẽ tương đương với câu lệnh update.
Cách 2: Dùng API PUT
PUT /index_name/type_name/id
{ "field" : "value"
}
API get document Elasticsearch.
GET /index_name/type_name/id
Tuy nhiên trong dữ liệu trả về có khá nhiều field không cần thiết như index name, version… Để lấy data của mỗi document ta dùng thêm thẻ _source vào sau url
GET /index_name/type_name/id/_source
Trường hợp chỉ muốn lấy 1 số field trong document ta dùng tham số_source=field1,field2
API Update document Elasticsearch.
**Cách 1: Modifiy document bằng method **
PUT /index_name/type_name/id
{ "field": "data"
}
Cách 2: Update document bằng method
POST /index_name/type_name/id
{ "field": "data"
}
Hãy để ý dòng
Version
, cái này sẽ hiển thị số lần mà ta đã update cho document
Update document bằng method
POST
có tác dụng tương đương với methodPUT
Tuy nhiên bản chất của việc update document bằng method
POST
khác với methodPUT
ở chỗ là methodPUT
sẽ replace / sửa lại dữ liệu trên document đã có còn methodPOST
là xóa document cũ đi (nếu có tồn tại) và tạo 1 document mới.
API đọc dữ liệu – Tìm kiếm dữ liệu, document Elasticsearch
Tìm tất cả document trong tất cả các index
GET /_search
Hoặc
GET /_all/_search
Tìm tất cả document trong 1 type
GET /_search?q=word
Ví dụ tìm tất cả các document có chứa từ Đức trong field name
GET /_search?q=name:Đức
API Xóa dữ liệu trong Elasticsearch
Cách 1: Sử dụng DELETE API
DELETE /index_name/type_name/id
Ví dụ xóa document có
id = 1
nằm trong typeinfo
của indexnguyen-duc-thao
Cách 2: Xóa document bằng Query API
Để xóa document bằng Query API ta dùng method POST với thẻ _delete_by_query
POST /index_name/type_name/_delete_by_query
{ "query": { "match": { "message": "some message" } }
}
Kết
Như vậy là ta đã đi qua những hướng dẫn cơ bản để làm việc với elasticsearch rồi. Ở bài viết sau mình sẽ hướng dẫn áp dụng elasticsearch vào dự án spring boot