Tìm hiểu về Elasticsearch

Elasticsearch là gì ?

Elasticsearch là một dạng Search Engine (Công cụ tìm kiếm) phát triển dựa trên nền tảng Apache Lucene. Elasticsearch được ra mắt năm 2010 bởi Shay Banon, được xây dựng bằng ngôn ngữ Java, với giao diện web HTTP có hỗ trợ JSON. Nó cho phép ta chuyển dữ liệu vào và tìm kiếm trực tiếp, thay vì tìm kiếm trong một hệ quản lý cơ sở dữ liệu thông thường như Oracle, MySQL,…

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

  • Ưu điểm:
    1. Tìm kiếm nhanh chóng: Elasticsearch sử dụng cấu trúc chỉ mục ngược để tìm kiếm văn bản rất nhanh rần như là realtime. Nó hỗ trợ các tính năng như tìm kiếm toàn văn bản, phân loại và lọc dữ liệu.
    2. Mở rộng linh hoạt: Cho phép phân phối dữ liệu để xử lý tải lớn và đáp ứng nhu cầu mở rộng của ứng dụng lên đến hàng trăm, hàng nghìn petabyte  dữ liệu
    3. Full-text search
    4. Có thể tìm kiếm sai chính tả hay lỗi cú pháp (fuzzy).
    5. Cung cấp Restful API cho phép xử lý các yêu cầu với các API Restful request
    6. Hỗ trợ đa dạng: Elasticsearch hỗ trợ nhiều ngôn ngữ lập trình như Java, PhP, Javascript, Ruby, .NET, Python.
  • Nhược điểm:
    1. Được thiêt kế cho search, do đó sẽ không phù hợp cho CRUD, do vậy người tra ít dùng elasticsearch làm database chính, mà thường kết hợp nó với 1 database khác.
    2. Không hỗ trợ transaction, không có ràng buộc quan hệ giữa các dữ liệu dẫn tới việc dữ liệu có thể bị sai.
    3. Không cung cấp tính năng cho việc xác thực và phân quyền, do đó kém bảo mật so với các hệ quản trị cơ sở dữ liệu hiện nay.

Các khái niệm cơ bản

  • Cluster: Một tập hợp Nodes (servers) chứa tất cả các dữ liệu nhằm đảm bảo tính tin cậy và sẵn dùng
  • 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: Index ở đây không phải là chỉ số mà là một tập hợp các documents, nó tương đương với khái niệm một database
  • Type: hay còn gọi là Mapping Type: là 1 tập các document cùng loại (tương đương với khái niệm collection trong MongoDB hay khái niệm table trong database SQL)
  • Document: Một JSON object với một số dữ liệu,  đây là một đơn vị thông tin trong Elasticsearch (tương đương với khái niệm document trong MongoDB hay khái niệm row trong table của database SQL)
  • Shards: Tập con các documents của 1 Index. Một Index có thể được chia thành nhiều shard, mỗi shard cũng có thể coi là một index có thể được truy cập trực tiếp giúp tính toán, tìm kiếm 1 cách song song.
 Sự khác biệt giữa Elasticsearch với RDBMS:
Sự khác biệt giữa Elasticsearch với RDBMS

Cài đặt elasticsearch và công cụ Kibana

  • Kibana: là công cụ quản lý, tượng tác với Elasticsearch thông qua môi trường web.

Elasticsearch có thể tải về, cài đặt trực tiếp trên hệ thống máy của bạn với hướng dẫn đơn giản tại Elasticsearch, ở bài này sẽ cài đặt và chạy Elasticsearch bằng Docker

Create network

docker network create elastic

Cài elasticsearch

    • Pull docker image

docker pull docker.elastic.co/elasticsearch/elasticsearch:8.4.3

    • Run image elastic

docker run --name es-container --net elastic -p 9200:9200 -p 9300:9300 -it docker.elastic.co/elasticsearch/elasticsearch:8.4.3

    • Kiểm tra elasticsearch đã chạy thành công chưa
      • https://localhost:9200

Cài kibana

    • Pull image kinana (bản 8.4.3)

docker pull docker.elastic.co/kibana/kibana:8.4.3

    • Run image kibana

docker run --name kib-container --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.4.3

    • Truy cập kibana
      • http://localhost:5601/
      • Nhập token elastic -> Nhập username/pasword

Các câu truy vẫn cơ bản

  • Search data
GET {name_index}/_search
{
  "query": {
    "match_all": {}
  },
  "fields": [
    "username"
  ],
  "_source": [false], 
  "sort": [
    {
      "@timestamp": {
        "order": "asc"
      }
    }
  ]
}
  • Create data
PUT {name_index}/_doc/{id}
{
  "user": "m10",
  "team": "PSG",
  "age": "36",
  "uuid": 1001
}
PUT {name_index}/_create/{id}
{
  "user": "m10",
  "team": "PSG",
  "age": "36",
  "uuid": 1002
}
PUT {name_index}/_doc/{id}?op_type=create
  • Maping
GET {name_index}/_mapping
    • Elastic tự động mapping dựa vào thuật toán của nó
    • Nó thể sửa lại theo mong muốn của mình
  • Add mapping
PUT {name_index}/_mapping
{
  "properties": {
    "number": {
      "type" :"integer"
    }
  }
}
  • Get data
GET {name_index)/_doc/{id}
  • _mget – get multiple data
GET _mget
{
  "docs": [
    {
      "_index": "facebook",
      "_id": 1002,
      "_source": ["user"]
    },
    {
      "_index" : "aliconcon",
      "_id": "lqg5G4kBv9XIOGv4AuYi"
    }
  ]
}
  • Check exists
HEAD {name_index}/_doc/{id}
    • Check id tồn tại chưa

HEAD {name_index}/

    • Check index tồn tại chưa
  • Delete data
DELETE {name_index}/_doc/{id}
POST facebook/_delete_by_query
{
  "query" : {
    "match": {"age": 38}
  }
}
  • Count data index
GET {name_index}/_count
  • Create muliple
POST {name_index}/_bulk
{"create":{}}
{"user":"m10","team":"PSG","age":"36","uuid":1002}
{"create":{}}
{"user":"m10","team":"PSG","age":"36","uuid":1002}
{"create":{}}
{"user":"m10","team":"PSG","age":"36","uuid":1002}
{"create":{}}
{"user":"m10","team":"PSG","age":"36","uuid":1002}
{"create":{}}
{"user":"m10","team":"PSG","age":"36","uuid":1002}
{"create":{}}
{"user":"m10","team":"PSG","age":"36","uuid":1002}
  • Search full-text
    • Toán tử and (mặc định là or)
      POST {name_index}/_search
      {
        "query": {
          "match": {
            "phrase": {
              "query":  "sicker manu",
              "operator": "and"
            }
          }
        }
      }
      
    • minimum_should_match
      POST {name_index}/_search
      {
        "query": {
          "match": {
            "phrase": {
              "query":  "sicker manu",
              "minimum_should_match": n
            }
          }
        }
      }
       
      kết quả phải chứa ít nhất n từ khoá, n cũng có thể là %
      
      
    • Multi field
      POST {name_index}/_search
      {
        "query": {
          "multi_match": {
            "query": "psg Neymar",
            "fields": ["name", "phrase"]
          }
        }
      }
      
    • Search cụm từ
      POST {name_index}/_search
      {
        "query": {
          "match_phrase": {
            "phrase": "sicker psg"
          }
        }
      }
      
    • Slop
      POST {name_index}/_search
      {
        "query": {
          "match_phrase": {
            "phrase": {
              "query": "root sicker manu",
              "slop": 1
            }
          }
        }
      }
      
    • Search prefix ( Like “a%”) — match_phrase_prefix
POST {name_index}/_search
{
  "query": {
    "match_phrase_prefix": {
      "phrase": {
        "query": "root help",
        "max_expansions": 2
      }
    }
  }
}