Như các bạn đã thấy, cả 2 đoạn văn bản đều thích hợp với từ khóa. Tuy nhiên có thể dễ dàng nhận ra rằng Doc_1 chính xác hơn nhiều.
Bạn hoàn toàn có thể setup việc tìm kiếm 1 cách kỹ càng hơn, tuy nhiên minh sẽ đề cập đến vấn đề này trong bài viết sau nhé. Nếu bạn có hứng thú có thể vào tài liệu https://www.elastic.co/guide/en/elasticsearch/guide/current/inverted-index.html và https://www.elastic.co/guide/en/elasticsearch/guide/current/relevance-intro.html#relevance-intro để có cái nhìn rõ ràng hơn .
3. Shard
Shard
là đối tượng củaLucene
, là tập con cácdocuments
của 1 Index. Một Index có thể được chia thành nhiều shard.- Mỗi
node
bao gồm nhiềuShard
. Chính vì thếShard
mà là đối tượng nhỏ nhất, hoạt động ở mức thấp nhất, đóng vai trò lưu trữ dữ liệu. - Chúng ta gần như không bao giờ làm việc trực tiếp với các
Shard
vìElasticsearch
đã support toàn bộ việc giao tiếp cũng như tự động thay đổi cácShard
khi cần thiết. - Có 2 loại
Shard
là :primary shard
vàreplica shard.
3.1 : Primary Shard
Primary Shard
là sẽ lưu trữ dữ liệu và đánhindex
. Sau khi đánh xong dữ liệu sẽ được vận chuyển tới cácReplica Shard
.- Mặc định của
Elasticsearch
là mỗiindex
sẽ có 5Primary shard
và với mỗiPrimary shard
thì sẽ đi kèm với 1Replica Shard
.
3.2 : Replica Shard
Replica Shard
đúng như cái tên của nó, nó là nơi lưu trữ dữ liệu nhân bản củaPrimary Shard
Replica Shard
có vai trò đảm bảo tính toàn vẹn của dữ liệu khiPrimary Shard
xảy ra vấn đề.- Ngoài ra
Replica Shard
có thể giúp tăng cường tốc độ tìm kiếm vì chúng ta có thể setup lượngReplica Shard
nhiều hơn mặc định củaES
4. Node
- Là trung tâm hoạt động của Elasticsearch. Là nơi lưu trữ dữ liễu ,tham gia thực hiện đánh
index
cúacluster
cũng như thực hiện các thao tác tìm kiếm - Mỗi
node
được định danh bằng 1 unique name
5. Cluster
- Tập hợp các
nodes
hoạt động cùng với nhau, chia sẽ cùng thuộc tínhcluster.name
. Chính vì thếCluster
sẽ được xác định bằng 1 ‘unique name’. Việc định danh cáccluster
trùng tên sẽ gây nên lỗi cho các node vì vậy khi setup các bạn cần hết sức chú ý điểm này - Mỗi cluster có một
node
chính (master), được lựa chọn một cách tự động và có thể thay thế nếu sự cố xảy ra. Một cluster có thể gồm 1 hoặc nhiềunodes
. Các nodes có thể hoạt động trên cùng 1 server . - Tuy nhiên trong thực tế , một
cluster
sẽ gồm nhiềunodes
hoạt động trên các server khác nhau để đảm bảo nếu 1 server gặp sự cố thì server khác (node khác) có thể hoạt động đầy đủ chức năng so với khi có 2 servers. Cácnode
có thể tìm thấy nhau để hoạt động trên cùng 1 cluster qua giao thứcunicast
.
Chức năng chính của
Cluster
đó chính là quyết định xemshards
nào được phân bổ chonode
nào và khi nào thì di chuyển cácCluster
để cân bằng lạiCluster
Ưu nhược điểm của ES
Ưu điểm
- Tìm kiếm dữ liệu rất nhanh chóng, mạnh mẽ dựa trên Apache Lucene ( near-realtime searching)
- Có khả năng phân tích dữ liệu (Analysis data)
- Khả năng mở rộng theo chiều ngang tuyệt “vòi”
- Hỗ trợ tìm kiếm mờ (fuzzy), tức là từ khóa tìm kiếm có thể bị sai lỗi chính tả hay không đúng cú pháp thì vẫn có khả năng elasticsearch trả về kết quả tốt.
- Hỗ trợ Structured Query DSL (Domain-Specific Language ), cung cấp việc đặc tả những câu truy vấn phức tạp một cách cụ thể và rõ ràng bằng JSON.
- Hỗ trợ nhiều
Elasticsearc
client nhưJava
,PhP
,Javascript
,Ruby
,.NET
,Python
Nhược điểm
Elasticsearch
được thiết kế cho mục đích search, do vậy với những nhiệm vụ khác ngoài search như CRUD thì elastic kém thế hơn so với những database khác như Mongodb, Mysql …. Do vậy người ta ít khi dùng elasticsearch làm database chính, mà thường kết hợp nó với 1 database khác.- Trong
elasticsearch
không có khái niệmdatabase transaction
, tức là nó sẽ không đảm bảo được toàn vẹn dữ liệu trong các hoạt độngInsert
,Update
,Delete
.Tức khi chúng ta thực hiện thay đổi nhiều bản ghi nếu xảy ra lỗi thì sẽ làm cho logic của mình bị sai hay dẫn tới mất mát dữ liệu. Đây cũng là 1 phần khiếnelasticsearch
không nên là database chính. - Không thích hợp với những hệ thống thường xuyên cập nhật dữ liệu. Sẽ rất tốn kém cho việc đánh index dữ liệu.
Cài đặt ElasticSearch
Yêu cầu
Elasticsearch yêu cầu Java 8 trở lên và phải thiết lập biến môi trường JAVA_HOME
cho java, do đó trước khi cài Elasticsearch, hãy chắc chắn rằng bạn đã cài Java version >= 8 trên máy.
Kiểm tra bằng lệnh java -version
để biết máy máy mình đã cài Java chưa và phiên bản Java đang cài là bao nhiêu. Kiểm tra biến môi trường JAVA_HOME
đã được thiết lập chưa bằng lệnh: echo $JAVA_HOME
Cài đặt
Download và cài đặt Elasticsearch PGP Key bằng lệnh sau:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
Để cài đặt Elasticsearch trên Ubuntu ta có 2 cách là cài từ Repository hoặc cài từ file .deb
Cách 1: Cách Elasticsearch bằng APT Repository
Cài gói apt-transport-https
sudo apt-get install apt-transport-https
Lưu định nghĩa repository vào /etc/apt/sources.list.d/elastic-6.x.list
:
(Repository mặc định ko có elasticsearch)
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
Cài đặt Elasticsearch bằng lệnh:
sudo apt-get update && sudo apt-get install elasticsearch
Done!
Cách 2: cài đặt elasticsearch bằng gói .deb
Chạy các lệnh dưới đây để tải và cài đặt elasticsearch bằng file .deb
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.deb
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.deb.sha512
shasum -a 512 -c elasticsearch-6.4.0.deb.sha512
sudo dpkg -i elasticsearch-6.4.0.deb
Done!
Chạy elasticsearch.
Elasticsearch sau khi được cài đặt sẽ không tự động chạy.
Để khởi động, start, stop elasticsearch ta làm như sau:
Lệnh để chạy server elasticsearch$ sudo systemctl start elasticsearch.service:
$ sudo systemctl start elasticsearch.service
Lệnh khởi tạo 1 index, mapping trong index đó và 1 document:
$ curl -X PUT http://localhost:9200/team/_mapping/member
Khởi tạo thành công , màn hình sẽ trả về dòng
{"acknowledged":true,"shards_acknowledged":true,"index":"team"}
Là khởi tạo thành công index “team”
Sử dụng câu lệnh để truy xuất dữ liệu trên ElasticSearch
- Lệnh liệt kê các index có trong ES:
$ curl -X GET "localhost:9200/_cat/indices?v"
- Lệnh tạo document của index: ở đây là thêm member với các trường thuộc tính
$ curl -X PUT http://localhost:9200/team/_mapping/member?{&"properties"= {&"id"= { "type": "text" },&"name"= { "type": "text" },&"email"= { "type": "text" },&"age"= { "type": "integer" },&"phone"= { "type": "text" },&"image"= { "type": "text" },&"technologies"= {"type" : "text" }&}&}
- Lệnh kiểm tra tất cả index đã khởi tạo:
$ curl -X GET http://localhost:9200/team?pretty
- Lệnh thêm, sửa dữ liệu vào index trên(team), ở đây là dữ liệu do nhóm em fake ra và insert vào
$ curl -X PUT http://localhost:9200/team/member/_bulk?{"create"= { "_id": 1, "_type": "member"}&{"id"= "5510ce4ee174054836ef3c5a","name": "Vargas Rosa","email": "[email protected]","age": 25,"phone": "+1 (807) 530–3567","image": "http://api.randomuser.me/portraits/men/78.jpg","description": "enim Lorem upidatat et nostrud ut irure qui qui nulla qui deserunt fugiat laborum elit","technologies": "ios javascript python"}&{"create"= { "_id": 2, "_type": "member"}&{"id"= "5510ce4e24ecdab88fe18d06","name": "Navarro Thornton","email": "[email protected]","age": 34,"phone": "+1 (896) 579–3364","image": "http://api.randomuser.me/portraits/men/59.jpg","description": "sit enim velit cillum magna commodo tempor","technologies": "swift erlang java"}&{"create"= { "_id": 3, "_type": "member"}&{"id"= "5510ce4e6e7bbdbc120c9a89","name": "Francine Aguirre","email": "[email protected]","age": 30,"phone": "+1 (963) 492–3402","image": "http://api.randomuser.me/portraits/men/82.jpg","description": "cu et sit ullamco tempor Lorem excepteur magna pariatur","technologies": "javascript ionic ruby"}&{"create"= { "_id": 4, "_type": "member"}&{"id"= "5510ce4ebd2a509edd8c6b50","name": "Krystal Simmons","email": "[email protected]","age": 40,"phone": "+1 (857) 418–2040","image": "http://api.randomuser.me/portraits/women/10.jpg","description": "ea dolor ex proident eiusmod et ut irure esse","technologies": "ruby c c"}
- Lệnh hiển thị thông tin các dữ liệu trong document và của từng doccument sau khi đã thêm
$ curl -X GET http://localhost:9200/team/member/4?pretty
- Lệnh tìm kiếm tất cả dữ liệu các document trong index sử dụng API Search
$ curl -X GET http://localhost:9200/_search?pretty=true
- Lệnh tìm kiếm theo text nhập ở tất cả các trường trong document , ở đây key search của mình là ruby, đây cũng chính là điểm mạnh của Elasticsearch, nó không giống với query like như thao tác với DB vì nó cần phải nhập đầy đủ text đó ví dụ như ruby ở trên sẽ trả về các document member có text là ruby trong tất cả các field
$ curl -X GET http://localhost:9200/_search?q=ruby
- Lệnh xóa 1 index
$ curl -X DELETE "localhost:9200/cuongquach-company"
Tài liệu tham khảo Elasticsearch là gì?
Vẫn còn một số các hoạt động, các API để xử lý vào thao tác với Index trong Elasticsearch, nhưng với phần tìm hiểu ở trên về một công cụ mạnh mẽ như elasticsearch là đủ để có thể thao tác, sử dụng và làm quen với elasticsearch. Các bạn có thể tham khảo ở các trang dưới đây.