12/08/2018, 15:24

Elasticsearch

1. Giới thiệu về Elasticsearch(ES) ES đượ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 hóng và chính xác trong một nguồn dữ liệu lớn (big data source) ES là một công cụ tìm kiếm dựa trên phần mềm Lucene. Cung cấp một bộ máy tìm ...

1. Giới thiệu về Elasticsearch(ES)

  • ES đượ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 hóng và chính xác trong một nguồn dữ liệu lớn (big data source)
  • ES là một công cụ tìm kiếm dựa trên phần mềm Lucene.
  • 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.
  • ES đượ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.
  • ES là một công cụ tìm kiếm phổ biến nhất, theo sau là Apache Solr, cũng dựa trên Lucene
  • ES có thể tích hợp vào các ứng dụng được xây dựng trên các ngôn ngữ như: Ruby, Java, PHP, .Net, Perl, Python, JavaScript, Groovy.
  • Một số ứng dụng đã được tích hợp ES vào hệ thống: Mozilla, Quora, SoundCloud, GitHub, Stack Exchange, Center for Open Science, Reverb, Netflix.

2. Khi nào nên 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

3. Một số khái niệm trong ES

  • 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.

4. Cơ chế hoạt động của ES Để giải thích cơ chế hoạt động ta 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 với 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? Chính vì vậy mà ý tưởng ES 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 ES. 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 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).

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 ES được gọi là inverted index, Để giải thích khái niệm này thì hãy xem hình vẽ dưới đây mô tả với 3 tài liệu có 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í (Document : Position) của từng từ như bảng trên:

Và giờ ta truy vấn "blue skye" thì ta sẽ được các tập hợp: 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.

Tuy nhiên, giả sử nếu 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}

5. Cài đặt ES

  • Update các gói có sẵn sudo apt-get update
  • Cài đặt Open JDK apt-get install openjdk-6-jre
  • Download ES tại đường dẫn: https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.6.0.zip
  • Giải nén và di chuyển đến thư mục elasticsearch-1.6.0 sau đó chạy lệch bin/elasticsearch
  • ES sẽ chạy tại địa chỉ : http://localhost:9200/ hoặc ta chạy lệnh để mở: curl http://localhost:9200/
  • Kiểm tra kết nối tới server ES, nếu thành công ta sẽ thu được chuổi JSON như bên dưới:
{
  "status" : 200,
  "name" : "Bedlam",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.6.0",
    "build_hash" : "cdd3ac4dde4f69524ec0a14de3828cb95bbb86d0",
    "build_timestamp" : "2015-06-09T13:36:34Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

Plugin hổ trợ việc xem data sau khi reindex hoặc trợ giúp query Cài đặt:

  • Elasticsearch 5.x: Không hổ trợ
  • Elasticsearch 2.x – 4.x: sudo elasticsearch/bin/plugin install mobz/elasticsearch-head
  • Elasticsearch 1.x: sudo elasticsearch/bin/plugin -install mobz/elasticsearch-head/1.x
  • Elasticsearch 0.9: sudo elasticsearch/bin/plugin -install mobz/elasticsearch-head/0.9 Sau khi cài đặt xong ta dii chuyển đển địa chỉ: http://localhost:9200/_plugin/head/ để sử dụng

6. Indexing Như đã biết thì để quá trình tìm kiếm thuận tiện và nhanh hơn thì ES sẽ inverted index tức là đánh Index cho dữ liệu đầu vào. Và sẽ sử dụng để phục vụ cho việc tìm kiếm sau này. Trong ES, _index, _type, và _id dùng để xác định duy nhất một document. Ví dụ: nếu index là trang products, type là mobile và chọn sản phẩm có id 123, thì yêu cầu chỉ mục sẽ như sau:

PUT /products/mobile/123
{
  "title": "Iphone 5s",
  "text":  "Điện thoại thông minh ...",
  "cost":  "10 triệu"
}

thì khi đánh dấu chỉ mục thì ES sẽ cung cấp thêm các thông tin như

{
   "_index":    "products",
   "_type":     "mobile",
   "_id":       "123",
   "_version":  1,
   "created":   true
}

Mọi tài liệu trong Elasticsearch đều có số version. Mỗi khi thay đổi đối với document (bao gồm xóa nó), số _version được tăng lên. Sử dụng _version để đảm bảo rằng một phần của ứng dụng của bạn không ghi đè lên các thay đổi được thực hiện bởi một phần khác. Nếu dữ liệu không có ID có sẵn, Elasticsearch tự động tạo ra ID như sau:

{
   "_index":    "website",
   "_type":     "blog",
   "_id":       "AVFgSgVHUP18jI2wRx0w",
   "_version":  1,
   "created":   true
}

ID tự phát sinh sẽ là một chuỗi có 20 ký tự, URL-safe, chuỗi Base64-encoded GUID. Các GUID này được tạo ra từ một sơ đồ FlakeID cho phép có thể tạo ra các ID duy nhất. 7. Searching Một tính năng mạnh khác của ElasticSearch đó chính là cung cấp tất cả query type giúp đáp ứng nhu cầu truy vấn của bạn. Các nhóm truy vấn trong ES là:

  • term query: Tìm kiếm các document các cụm từ muốn truy vấn theo các trường cụ thể trong db.
  • terms query: Tìm kiếm các document các cụm từ bât kỳ muốn truy vấn theo các trường trong db.
  • range query: Tìm kiếm các document mà các đối tường muốn tìm kiếm như ngày, số hoặc chuỗi nằm trong phạm vi được chỉ định.
  • exists query: Tìm kiếm các document mà các giá trị muốn tìm tồn tại trong db
  • prefix query: Tìm kiếm các document mà nội dungcó chứa các chuỗi bắt đầu bằng cụm từ muốn tìm kiếm
  • wildcard query: Tìm kiếm các document mà nội dung có chứa các cụm từ muốn tìm kiếm.
  • regexp query: Tìm kiếm các document mà nội dung có chứa các chuỗi kết thúc bằng cụm từ muốn tìm kiếm
  • fuzzy query
  • type query: Tìm các document theo thể loại
  • ids query: Tìm kiếm các document theo thể loại và id cụ thể.

8. Một số gem hỗ trợ sử dụng ES

  • gem searchkick
  • gem elasticsearch-rails
  • gem elasticsearch-ruby

0