> For the complete documentation index, see [llms.txt](https://learnsql.gitbook.io/lernmysql/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learnsql.gitbook.io/lernmysql/elasticsearch-la-gi.md).

# Elasticsearch là gì ?

## Elasticsearch là gì ?

This post has been more than **2 years** since it was last updated.

![](https://viblo.asia/uploads/76096a98-af0b-4a57-a4cf-e5c638c4f6b9.png)

## Lời nói đầu. <a href="#loi-noi-dau-0" id="loi-noi-dau-0"></a>

`Elasticsearch` có lẽ là thứ không phải xa lạ gì với anh em developer chúng ta nhưng không phải ai cũng hiểu rõ ràng và cụ thể về nó. Ngày hôm nay mình xin phép trình bày một số khái niệm bạn cần phải biết trước khi tiến tới sử dụng Service này !

## Elasticsearch là gì ? <a href="#elasticsearch-la-gi--1" id="elasticsearch-la-gi--1"></a>

`Elasticsearch` là một công cụ tìm kiếm dựa trên nền tảng `Apache Lucene`. Nó cung cấp một bộ máy tìm kiếm dạng phân tán, có đầy đủ công cụ với một giao diện web HTTP có hỗ trợ dữ liệu JSON. Elasticsearch được phát triển bằng Java và được phát hành dạng nguồn mở theo giấy phép Apache. (Theo `wikipedia`)

Nếu bạn thắc mắc có cần tìm hiểu `Apache Lucene` để rõ ràng về `Elasticsearch` không thì mình xin trả lời đương nhiên là có, tuy nhiên việc tìm hiểu này sẽ rất mất thời gian vào công sức nên nếu bạn có thời gian thì có thể tìm hiểu thêm. Còn nếu không có thời gian thì bạn chỉ cần hiểu đơn giản `Apache Lucene` nó core của `Elasticsearch` như `php` là core của `laravel` vậy. Bạn chỉ cần hiểu `Elasticsearch` thôi vì chúng ta chỉ làm việc với `Elasticsearch` còn `Apache Lucene` bạn hiểu được thì nó là 1 điểm cộng, còn không thì cũng chả sao cả.

Tóm lại :

* `Elasticsearch` là một `search engine`.
* `Elasticsearch` được kế thừa từ `Lucene Apache`
* `Elasticsearch` thực chất hoặt động như 1 web server, có khả năng tìm kiếm nhanh chóng (near realtime) thông qua giao thức RESTful
* `Elasticsearch` có khả năng phân tích và thống kê dữ liệu
* `Elasticsearch` chạy trên server riêng và đồng thời giao tiếp thông qua RESTful do vậy nên nó không phụ thuộc vào client viết bằng gì hay hệ thống hiện tại của bạn viết bằng gì. Nên việc tích hợp nó vào hệ thống bạn là dễ dàng, bạn chỉ cần gửi request http lên là nó trả về kết quả.
* `Elasticsearch` là 1 hệ thống phân tán và có khả năng mở rộng tuyệt vời (horizontal scalability). Lắp thêm node cho nó là nó tự động auto mở rộng cho bạn.
* `Elasticsearch` là 1 `open source` được phát triển bằng `Java`

## Người sử dụng : <a href="#nguoi-su-dung--2" id="nguoi-su-dung--2"></a>

* Wikimedia
* athenahealth
* Adobe Systems
* Facebook
* StumbleUpon Mozilla,
* Amadeus IT Group
* Quora
* Foursquare
* Etsy
* SoundCloud
* GitHub
* FDA
* CERN
* Stack Exchange
* Center for Open Science
* Reverb
* Netflix
* Pixabay
* Motili
* Sophos
* Slurm Workload Manager

## Các khái niệm cần biết <a href="#cac-khai-niem-can-biet-3" id="cac-khai-niem-can-biet-3"></a>

### 1, Document <a href="#id-1-document-4" id="id-1-document-4"></a>

Document là một JSON object với một số dữ liệu. Đây là basic information unit trong ES. Hiểu 1 cách cơ bản thì đây là đơn vị nhỏ nhất để lưu trữ dữ liệu trong `Elasticsearch`.

### 2, Index. <a href="#id-2-index-5" id="id-2-index-5"></a>

`Index` có lẽ là 1 khái niệm quá quen thuộc đối với các anh em dùng `Mysql` rồi. Khi đọc đến đây có lẽ ae đã thừa hiểu chức năng của `index` là gì rồi. Tuy nhiên nếu các bạn nghĩ rằng `index` trong `ES` hoàn toàn giống trong `Mysql` thì các bạn nhầm rồi nhé !

Trong `Elasticsearch` , sử dụng một cấu trúc được gọi là `inverted index` . Nó được thiết kế để cho phép tìm kiếm `full-text search`. Cách thức của nó khá đơn giản, các văn bản được phân tách ra thành từng từ có nghĩa sau đó sẽ đk map xem thuộc văn bản nào. Khi search tùy thuộc vào loại search sẽ đưa ra kết quả cụ thể.

VÍ dụ : Chúng ta có 2 văn bản cụ thể như sau :

```
1,The quick brown fox jumped over the lazy dog
2,Quick brown foxes leap over lazy dogs in summer
```

Để tạo ra một `inverted index`, trước hết chúng ta sẽ phân chia nội dung của từng tài liệu thành các từ riêng biệt (chúng tôi gọi là `terms`), tạo một danh sách được sắp xếp của tất cả `terms` duy nhất, sau đó liệt kê tài liệu nào mà mỗi thuật ngữ xuất hiện. Kết quả như sau:

```
Term      Doc_1  Doc_2
-------------------------
Quick   |       |  X
The     |   X   |
brown   |   X   |  X
dog     |   X   |
dogs    |       |  X
fox     |   X   |
foxes   |       |  X
in      |       |  X
jumped  |   X   |
lazy    |   X   |  X
leap    |       |  X
over    |   X   |  X
quick   |   X   |
summer  |       |  X
the     |   X   |
------------------------
```

Bây giờ, nếu chúng ta muốn tìm kiếm màu `quick brown`, chúng ta chỉ cần tìm trong các tài liệu trong đó mỗi thuật ngữ có xuất xuất hiện hay không. Kết quả như sau:

```
Term      Doc_1  Doc_2
-------------------------
brown   |   X   |  X
quick   |   X   |
------------------------
Total   |   2   |  1
```

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 <a href="#id-3-shard-6" id="id-3-shard-6"></a>

* `Shard` là đối tượng của `Lucene` , là tập con các `documents` của 1 Index. Một Index có thể được chia thành nhiều shard.
* Mỗi `node` bao gồm nhiều `Shard` . 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ác `Shard` khi cần thiết.
* Có 2 loại `Shard` là : `primary shard` và `replica shard.`

#### 3.1 : Primary Shard <a href="#id-31--primary-shard-7" id="id-31--primary-shard-7"></a>

* `Primary Shard` là sẽ lưu trữ dữ liệu và đánh `index` . Sau khi đánh xong dữ liệu sẽ được vận chuyển tới các `Replica Shard`.
* Mặc định của `Elasticsearch` là mỗi `index` sẽ có 5 `Primary shard` và với mỗi `Primary shard` thì sẽ đi kèm với 1 `Replica Shard`.

#### 3.2 : Replica Shard <a href="#id-32--replica-shard-8" id="id-32--replica-shard-8"></a>

* `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ủa `Primary Shard`
* `Replica Shard` có vai trò đảm bảo tính toàn vẹn của dữ liệu khi `Primary 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ượng `Replica Shard` nhiều hơn mặc định của `ES`

Để hiểu hơn về `Primary Shard` hay `Replica Shard` mọi người có thể vào [đây](https://viblo.asia/p/elasticsearch-distributed-search-ZnbRlr6lG2Xo#replica-shard-6) để tìm hiểu rõ hơn. Trong bài này anh Long đã viết khá chi tiết về các khái niệm cũng như cách thức hoạt động lưu trữ và tìm kiểm của `ES` nên mình xin phép không nói thêm gì về phần này.

### 4, Node <a href="#id-4-node-9" id="id-4-node-9"></a>

* 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úa `cluster` 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 <a href="#id-5-cluster-10" id="id-5-cluster-10"></a>

* Tập hợp các `nodes` hoạt động cùng với nhau, chia sẽ cùng thuộc tính `cluster.name`. Chính vì thế `Cluster` sẽ được xác định bằng 1 'unique name'. Việc định danh các `cluster` 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ều `nodes`. 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ều `nodes` 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ác `node` có thể tìm thấy nhau để hoạt động trên cùng 1 cluster qua giao thức `unicast`.

Chức năng chính của `Cluster` đó chính là quyết định xem `shards` nào được phân bổ cho `node` nào và khi nào thì di chuyển các `Cluster` để cân bằng lại `Cluster`

## Ưu nhược điểm của ES <a href="#uu-nhuoc-diem-cua-es-11" id="uu-nhuoc-diem-cua-es-11"></a>

### Ưu điểm <a href="#uu-diem-12" id="uu-diem-12"></a>

* 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.Các bạn có thể tìm hiểu thêm tại [đây](https://viblo.asia/p/query-dsl-trong-elasticsearch-Eb85oJq2l2G)
* Hỗ trợ nhiều `Elasticsearc` client như `Java`, `PhP`, `Javascript`, `Ruby`, `.NET`, `Python`

### Nhược điểm <a href="#nhuoc-diem-13" id="nhuoc-diem-13"></a>

* `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ệm `database transaction` , tức là nó sẽ không đảm bảo được toàn vẹn dữ liệu trong các hoạt động`Insert`, `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ến `elasticsearch` 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.

## Tồng kết. <a href="#tong-ket-14" id="tong-ket-14"></a>

Bài viết trên mình đã đưa ra các khái niệm cần biết và khái quát lại ưu nhược điểm của `ES` cho các bạn. Nhìn chung thì mình thấy rằng nó khá thú vị và mạnh mẽ và theo quan điểm cá nhân mình thì mình thấy nó rất phù hợp với công việc tổng hợp và thống kê dữ liệu, nên các bạn nên xem xét nhé

P.s : VÌ bài viết về `ES` khá nhiều nên bài viết của mình có tổng hơp khá nhiều từ các bài viết khác, nên có gì ae nhẹ tay và xin đừng gạch đá nhé . Thân

## Tài liệu tham khảo <a href="#tai-lieu-tham-khao-15" id="tai-lieu-tham-khao-15"></a>

<https://www.elastic.co/guide/index.html> <https://viblo.asia/p/elasticsearch-distributed-search-ZnbRlr6lG2Xo>
