Tổng quan về ElasticSearch

elastic-search

Trong bài viết này, tôi muốn giới thiệu một số chi tiết cơ bản về ElasticSearch. Version 2.0.0 vừa được phát hành và đây là thời điểm tuyệt vời để nhắc lại lại công cụ xuất sắc này.

Tôi sẽ viết về một số trường hợp sử dụng cho ElasticSearch, các khái niệm chính của nó, và một số cân nhắc để xem có nên sử dụng nó hay không. Ngoài ra tôi sẽ cố gắng mô tả một số chi tiết về cách ElasticSearch store và retrieve document, và làm thế nào để extract chúng một cách tốt nhất. Tôi hy vọng rằng bạn sẽ dễ dàng làm quen với một số vấn đề kỹ thuật của ES và có thể bắt đầu áp dụng vào dự án của mình.

ElasticSearch là gì?

Điều đầu tiên cần hỏi chính là: ElasticSearch được hiểu chính xác là gì?

ES là một document oriented database. Rõ ràng nhiệm vụ của nó chính là store và retrieve document. Trong ES, tất cả các document được hiển thị trong JSON format. Nó được xây dựng trên Lucene – phần mềm tìm kiếm và trả về thông tin  (information retrieval software) với hơn 15 năm kinh nghiệm về full text indexing and searching.

Nếu bạn đã từng sử dụng MongoDB, nghĩa là bạn bạn sẽ dễ dàng quen với JSON storage service. Nhưng điều làm cho ES thực sự đặc biệt chính là nhờ vào khả năng phục hồi thông tin của nó. Sự kết hợp của storage và querying/aggregation service đã làm cho ES thực sự đặc biệt và khác xa 1 công cụ chỉ lưu trữ văn bản.

Với bản chất của nó, một điều quan trọng cần biết đó là: khi nào thì nên sử dụng ElasticSearch? Bạn không nên chuyển đổi SQL database sang ES. Chúng có những mục đích khác nhau và mỗi cái đều có ưu và nhược điểm riêng. Một số trường hợp nên sử dụng ES:

  • Tìm kiếm text thông thường – Searching for pure text (textual search)
  • Tìm kiếm text và dữ liệu có cấu trúc – Searching text and structured data (product search by name + properties)
  • Tổng hợp dữ liệu – Data aggregation
  • Tìm kiếm theo tọa độ – Geo Search
  • Lưu trữ dữ liệu theo dạng JSON – JSON document storage

Khái niệm cơ bản

Chúng ta hãy nhìn vào những khái niệm chính của ElasticSearch:

  • Cluster: Một tập hợp Nodes (servers) chứa tất cả các dữ liệu.
  • Node: Một server duy nhất chứa một số dữ liệu và tham gia vào cluster’s indexing and querying.
  • Index: Hãy quên SQL Indexes đi. Mỗi ES Index là 1 tập hợp các documents.
  • Shards: Tập con các documents của 1 Index. Một Index có thể được chia thành nhiều shard.
  • Type: Một định nghĩa về schema of a Document bên trong một Index (Index có thể có nhiều type).
  • Document: Một JSON object với một số dữ liệu. Đây là basic information unit trong ES.

Ưu và nhược điểm của ElasticSearch

Trước hết tôi muốn nói về một trong những lý do cần phải xem xét để sử dụng ES trên hệ thống của bạn.

Điều đầu tiên là tốc độ. ES có perfomance rất tốt. Như tôi đã nói, nó được xây dựng trên Lucene và khả năng mở rộng truy vấn song song bên trong một cluster rất tốt (spanning queries in parallel inside a cluster).

Một ưu điểm khác của ElasticSearch là có thể sắp xếp kết quả truy vấn theo Relevance (sự liên quan). Theo mặc định, ES sử dụng thuật toán TF/IDF tương tự để tính toán relevance. Nếu bạn không biết relevance là gì, hãy xem trang này trong tài liệu ES.

Cuối cùng, ES có thể rất hữu ích để tạo ra số liệu thống kê tổng hợp (aggregate statistics), và với chút ít nỗ lực, Search API có thể linh hoạt đáp ứng yêu cầu của bạn.

Nhưng nó cũng có một số nhược điểm. ElasticSearch rất tốt trong việc tìm kiếm và tổng hợp data, nhưng nếu bạn đang sở hữu môi trường thường xuyên ghi dữ liệu (writing operations environment), ES có thể sẽ không phải lựa chọn tốt nhất của bạn.

Ngoài ra, nó không có bất kỳ transactional operations nào cả. Nhưng nếu bạn không dựa vào nó như nơi lưu trữ dữ liệu chính (primary data storage) thì bạn cũng sẽ ổn thôi, chẳng vấn đề gì cả.

Indexing và Searching

Rest API

ElasticSearch sử dụng một REST API cho việc tìm kiếm và lưu trữ document. Dưới đây là một ví dụ về indexing (storing) a document:

$ curl -XPUT ‘http://localhost:9200/blog/post/1’ -d ‘{  
   “author”: “lucas”,  
   “tags”: \[“java”, “web”\],  
   “title”: “A Fancy Title”,  
   “context”: “A nice post content…”  
}’

“http://localhost:9200/” là địa chỉ của ES node. Với câu lệnh này, chúng ta đang tạo ra một blog post trong index “blog” với một type “post”  và một “id=1”. Lưu ý rằng nó có thể sử dụng một truy vấn “POST” thay vì “PUT” để tự động tạo ra document id. Chính document là một JSON document bình thường.

Dưới đây là request để lấy về một document:

$ curl -XGET ‘http://localhost:9200/blog/post/\search’ -d ‘{  
    “query” : {  
        “term” : { “author” : “lucas” }  
    }  
}’

Nhìn vào sẽ rất dễ hiểu chúng ta đang truy vấn điều gì. Một query có thể được gửi bằng “GET” hoặc “POST” . “blog” xác định index nào mà ta đang truy vấn và “post” là document type (optional parameter). Các tham số “_search” chỉ ra hành động mà chúng ta muốn thực hiện. Phần body của query sẽ xác định loại truy vấn và parameter. Trong trường hợp này, chúng ta đang tìm kiếm bất kỳ document mà giá trị của trường “author” có từ khóa “lucas”.

Document API và Search API có rất nhiều chi tiết và khả năng, đây chỉ là những điều cơ bản. Hãy xem trong tài liệu ES để tìm hiểu thêm về hai vấn đề này.

Trước khi đi sâu vào chi tiết về indexing a document. Hãy cùng tìm hiểu về cách ES thực hiện truy vấn.

Khi bạn gửi một query đến ES cluster, query sẽ nhấn một trong các node và sau đó nó xác định shard nào nên được truy vấn. Sau đó, “query coordinator” nodegửi query cho mỗi shard để thực hiện truy vấn song song. Sau khi lần lượt từng node trả lời các truy vấn với các kết quả từng phần, node sẽ merge kết quả và gửi trở lại cho user. Một trong những điều làm cho ES query document rất nhanh chính là nó đã được thực hiện truy vấn song song theo mặc định (đi qua shard).

Indexing

ES còn có những điểm khác giúp searching document hiệu quả hơn. Khi lưu trữ document trong ES, nó tạo ra một số internal data structures làm cho query perfom tốt hơn. Tôi sẽ nói về một số chi tiết cơ bản về ES indexing technique.

Mỗi document gửi tới ES được lưu trữ qua một thuật toán và sau đó được gửi đến shard. ES cố gắng để phân tán document thông qua các shard.

Khi lưu trữ document, ES tạo ra inverted index, map các thuật ngữ/từ khóa xuất hiện trong document này tới chính document đó.

Khi sử dụng inverted index, nó có thể tìm kiếm thông qua terms như một binary tree (sử dụng thứ tự chữ cái) làm giảm thời gian tìm kiếm.

Một điều quan trọng khi lưu trữ document đó là được quyết định cách tốt nhất để lưu trữ chúng giúp nâng cao tốc độ truy vấn. Khi thiết kế các giải pháp sử dụng ElasticSearch, điều đáng lưu tâm nhất khi lưu trữ document chính là: tôi sẽ truy vấn document này như thế nào? “First query” này tiếp cận với việc sử dụng cho tất cả các khả năng ES indexing để thực hiện truy vấn cực kỳ nhanh chóng.

Analysis

Analysis là text transformation, input a chunk of text and outputs terms (tokens). Một trong những tính năng tốt nhất của ES là đi kèm với rất nhiều built-in analyzers.

Bạn hãy thử tưởng tượng một chức năng mà có mỗi từ trong text block và trả về stemmed form của mỗi từ. Hoặc một chức năng mà phải lấy text và remove tất cả stop words. Tùy thuộc vào những gì bạn cần, bạn có thể sử dụng một hoặc nhiều analyzer để transform thành original text.

Trong ES, analyzer rất hữu ích trong việc xây dựng index (database index) và đẩy nhanh tiến độ tìm kiếm thông qua document của chúng ta.

Querying

Một tính năng mạnh khác của ElasticSearch đó chính là cung cấp tất cả query type. Có gần 40 query type và có lẽ là một trong những loại này sẽ đáp ứng hoàn hảo như cầu của bạn.

Chúng tôi có phrase queries for textual search, geo queries based on coordinates, numeric range queries. Chúng có thể sẽ rất hữu ích cho các dữ liệu tổng hợp và nhiều hơn nữa.

Kết luận

Rất khó để viết về ElasticSearch. Tuy nhiên, nó khá đơn giản để hiểu và sử dụng, cũng như có rất nhiều tính năng để bàn đến. Đôi khi bạn có nhiều cách để chỉ index hoặc query document. Chỉ có sử dụng ES, bạn sẽ thấy nó tốt hơn.

Một trong những lợi ích của ES là nó rất dễ cài đặt và trong nhiều trường hợp sử dụng, nó sẽ không phải là primary datasource của bạn, vì vậy bạn hãy bớt lo lắng về việc thử dùng nó.

Như đã đề cập, điều quan trọng là phải biết những ưu và nhược điểm mà ES mang lại. Tuy ElasticSearch không mới nhưng nó đang phát triển nhanh chóng. Các nhà phát triển đang triển khai và thêm nhiều tính năng mới trên tất cả các version. Nhưng cái chính là nó vẫn thống nhất nội dung và thực tế là nó được xây dựng trên Lucene, vì vậy bạn có thể tự tin hơn khi sử dụng nó.

Elasticsearch NoSQL
Thêm Bình Luận: