ElasticSearch là gì.

Gần đây tôi có dịp tiếp xúc với một kỹ thuật tên Elasticsearch, tôi nhận thấy nó khá thú vị cùng với nhiều tính năng mạnh phụ vụ cho việc tìm kiếm và phân tích trong thời gian thực (search & analyze in real time) dữ liệu ở tầm cỡ lớn (big data) nên có tìm hiểu đôi chút.



Giới Thiệu ElasticSearch:

Đầu tiên ta cần hiểu ElasticSearch là một công cụ tìm kiếm cấp doanh nghiệp (enterprise-level search engine). Mục tiêu của nó là tạo ra một công cụ, nền tảng hay kỹ thuật tìm kiếm và phân tích trong thời gian thực (ý nói ở đây là nhanh chóng và chính xác), cũng như cách để nó có thể áp dụng hay triển khai một cách dễ dàng vào nguồn dữ liệu (data sources) khác nhau.

Nguồn dữ liệu nói ở trên trên bao gồm các cơ sở dữ liệu nổi tiếng như MS SQL, PostgreSQL, MySQL,... mà nó có thể văn bản (text), thư điện tử (email), pdf,... nói chung tất tần tật mọi thứ liên quan tới dữ liệu có văn bản. Vấn đề này tôi sẽ giải thích rõ hơn trong phần bên dưới.

ElasticSearch được phát triển bởi Shay Banon và dựa trên Apache Lucene, ElasticSearch là một bản phân phối mã nguồn mở cho việc tìm kiếm dữ liệu trên máy chủ. Đây là một giải pháp mở rộng, hỗ trợ tìm kiếm thời gian thực mà không cần có một cấu hình đặc biệt. Nó đã được áp dụng bởi một số công ty, bao gồm cả StumbleUpon và Mozilla. ElasticSearch được phát hành theo Giấy phép Apache 2.0.


Một Số Thông Tin Về ElasticSearch:
  • Elasticsearch là một search engine.
  • Elasticsearch được xây dựng để hoạt động như một server cloud theo cơ chế của RESTful.
  • Kế thừa và phát triển từ Lucene Apache.
  • Phát triển bằng ngôn ngữ Java.
  • Là phần mềm open-source được phát hành theo giất phép của Apache License.
  • Tương tự như Solr (Apache).
  • ELASTIC-SEARCH có thể tích hợp được với tất cả các ứng dụng sử dụng các loại ngôn ngữ sau.
    • Java
    • JavaScript
    • Groovy
    • .NET
    • PHP
    • Perl
    • Python
    • Ruby
  • Những ai đã dùng Elasticsearch :
    • Mozilla
    • Quora
    • SoundCloud
    • GitHub
    • Stack Exchange
    • Center for Open Science
    • Reverb
    • Netflix.


Cơ Chế Hoạt Động Của ElasticSearch:

Bạn lưu ý đây là nền tảng cơ chế xử lý của ElasticSearch đã được công bố và giải thích theo cách hiểu của tôi, còn trong thực tế thì cơ chế hoạt động của nó có thể phức tạp hơn nhiều ^^! vì bất kỳ nhà phát triển cũng không bao giờ chia sẻ hết các kỹ thuật của họ.

Chắc các bạn hẳn sẽ để ý tới từ "real time" thời gian thực mà tôi thường hay nói tới ở phía trên, đây cũng là tiêu chí phát triển của của Elasticsearch, sở dĩ Elasticsearch được gọi là "search & analyze in real time" là vì nó có khả năng trả về kết quả tìm kiếm một cách nhanh chóng và chính xác trong một nguồn dữ liệu lớn (big data source).

Vậy nó làm như thế nào? Để giải thích điều này ta quay trở về nguồn dữ liệu (data source) mà tôi đã nói ở trên nó không chỉ bao gồm các nguồn lưu trữ cơ sở dữ liệu nổi tiếng như MySQL, MS SQL, PostgreSQL, mà nó có thể là văn bản (text), pdf, doc,...

Để giải thích điều này tôi ví dụ nguồn dữ liệu lưu trữ của bạn là các email, trong trường hợp bạn muốn tìm kiếm một email nếu bạn nhớ các thông tin như tiêu đề, người ngưởi, ngày gửi, thì việc tìm kiếm nó vô cùng dễ dàng, nhưng đặt trường hợp bạn không nhớ chỉ nhớ mang máng nội dung, hoặc chẳng hạn như bạn muốn tìm những email có nội dung tương tự thì phải làm thế nào? Khi nguồn dữ liệu của bạn không được lưu trữ theo một cấu trúc và trên một cơ sở dữ liệu nổi tiếng có đày đủ các sự hỗ trợ cần thiết.

Cụ thể hơn ta sẽ lấy ví dụ là một trang Website cho phép lưu trữ các tập tin DOC, PDF, TXT chẳng hạn, đối với những trang này ta không tìm dữ liệu trên cơ sở dữ liệu mà là tìm trực tiếp trên các tập tin này, thử ý một chút 1 file cỡ 10 trang thôi đã tìm mệt, vậy 100 file 1000 ngàn file thì sẽ như thế nào? Và ý tưởng ElasticSearch cũng được hình thành từ đây.

Dựa trên ví dụ trang Website lưu trữ các tâp văn bản trên ta sẽ tìm hiểu về cơ chế hoạt động của ElasticSearch. Ta giả dụ là mỗi tập tin là một quyên sách vậy để tìm kiếm nội dụng trong quyển sách thì ta phải làm như thế nào? Theo như cách thông thường mà ai tường học qua cơ sở dữ liệu Database đều biết thì ta có hai cách là:

  • Cách 1: Lật từng trang để tìm kiếm (No Index).
  • Cách 2: Tìm tới phần mục lục để tìm kiếm (Index).

Hai cách này trong cơ sở dữ liệu ta thường gọi là None Index và Index, bạn có thể tìm hiểu thêm về chúng thông qua hai bài viết trước đây của tôi.

Về cơ bản thì ElasticSearch cũng áp dụng giải pháp giống với Index, tuy nhiên về mặt cơ chế xử lý và tìm kiếm thì có sự khác biệt, Index trong ElasticSearch được gọi là inverted index, giải thích thì dài dòng bạn hãy xem sơ đồ mô tả dưới đây trước tôi sẽ giải thích cụ thể sau.



Như bạn thấy trong hình trên ta có 3 tài liệu với nội dung như sau:
  • Document 1: The bright blue butterfly hangs on the breeze.
  • Document 2: It's best to forget the great sky and to retire from every wind.
  • Document 3: Under blue sky, in bright sunlight, one need not search around.

Từ 3 document này ta tạo ra được một bảng "Inverted Index" tập hợp vị trí của từng từ như sau:
  • best = {2:3}
  • blue = {1:3}{3:2}
  • bright = {1:2}{3:5}
  • butterfly = {1:4}
  • breeze = {1:8}
  • forget = {2:5}
  • great = {2:7}
  • hangs = {1:5}
  • needs = {3:8}
  • retire = {2:11}
  • search = {3:10}
  • sky = {2:8}{3:3}
  • wind = {2:14}

Và giờ ta truy vấn (query) thì ta sẽ được các tập hợp index gì?
  • blue = {1:3}{3:2}
  • sky = {2:8}{3:3}

Như bạn thấy tập index tìm kiếm được ở trên thì ta nhập thấy chữ "blue" và "sky" đều xuất hiện trong cùng một document 3 vì thế kết quả trả về tại document 3 là hợp lý và chuẩn xác nhất.

Tôi xin nói thêm một chút trong trường hợp giả sử tại Document 3 không tồn tại chữ "sky", thì lúc đó ta sẽ nhận được một tập kết quả trả về vừa tồn tại "blue" vừa tồn tại "sky" tất nhiên như vậy thì độ tìm kiếm chính xác đã bị giảm đi, cụ thể là ta nhận được là:
  • blue ở vị trí {1:3} và {3:2}
  • sky ở vị trí {2:8}

*Note: Nếu ở đây nếu bạn thiết lập một phương thức tìm kiếm chính xác thì sẽ không có kết quả nào được trả về.

Tất nhiên đây chỉ là một ví dụ đơn giản để mô tả về ElasticSearch, về cơ bản nó cũng cho phép bạn tạo ra các "Inverted Index" theo nhưng mục đích cụ thể hoặc phù hợp với câu query để đạt chuẩn tốc độ cao hơn và chính xác hơn.

Như tôi đã trình bày bạn thấy rất rõ ElasticSearch rất thích hợp áp dụng cho các Website hơn so với applicaiton, nhưng với sự vượt trội về hiệu suất (performance) mà nó mang lại nên một số applicaiton hoặc application services cũng đã áp dụng kỹ thuật này.

Bài viết xin được dừng tai đây, nếu có gì thiếu xót hoặc chưa chính xác rất mong nhận được ý kiến đóng góp của các bạn.



5 comments: