post-image

Cài đặt và sử dụng Elasticsearch

Tổng quan

Elasticsearch là công cụ tìm kiếm và phân tích phân tán được xây dựng trên Apache Lucene. Kể từ khi ra mắt năm 2010, Elasticsearch đã nhanh chóng trở thành công cụ tìm kiếm thông dụng nhất và được sử dụng rộng rãi cho các trường hợp sử dụng liên quan đến phân tích nhật ký, tìm kiếm toàn văn bản, thông tin bảo mật, phân tích nghiệp vụ và thông tin vận hành.

Cài đặt Elasticsearch

Bước 1: Cài đặt Java. Yêu cầu version của Java từ Java 8 trở đi.

Kiểm tra version của Java trên cmd bằng câu lệnh: java -version

Bước 2: truy cập https://www.elastic.co/downloads/elasticsearch để tải Elasticsearch

Bước 3: tải về sau đó giải nén, để start Elasticsearch, bạn hãy vào thư mục bin, chạy file elasticsearch.bat để khởi động server.

Sau khi run xong thì sẽ có output như này:

Chúng ta hãy kiểm tra trên trình duyệt với đường dẫn: localhost:9200

Sử dụng Elasticsearch

Tạo index là quá trình thêm dữ liệu vào Elasticsearch. Điều này là do khi bạn cấp dữ liệu, dữ liệu được đặt vào các index Apache Lucene.

Điều này có ý nghĩa vì Elasticsearch sử dụng các index Lucene để lưu trữ và truy xuất dữ liệu của nó. Mặc dù bạn không cần phải biết nhiều về Lucene, nhưng nó sẽ giúp bạn biết cách hoạt động của nó khi bạn bắt đầu với Elasticsearch .

Elasticsearch hoạt động giống như một REST API, vì vậy bạn có thể sử dụng method POST hoặc PUT để thêm dữ liệu.

Sử dụng POST nếu bạn muốn tạo một bản ghi mới:

curl -XPOST 'localhost:9200/logs/my_app' -H 'Content-Type: application/json' -d'
{
    "timestamp": "2021-08-26 12:34:56",
    "message": "User logged in",
    "user_id": 4,
    "admin": false
}
'Code language: PHP (php)

Kết quả:

{
  "_index": "logs",
  "_type": "my_app",
  "_id": "ZsWdJ2EBir6MIbMWSMyF",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}Code language: JSON / JSON with Comments (json)

Sử dụng PUT khi bạn biết hoặc chỉ muốn chỉ định bản ghi:

curl -X PUT 'localhost:9200/app/users/4' -H 'Content-Type: application/json' -d '
{
    "id": 4,
    "username": "john",
    "last_login": "2021-08-27 12:34:56"
}
'Code language: PHP (php)

Kết quả:

{
  "_index": "app",
  "_type": "users",
  "_id": "4",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}Code language: JSON / JSON with Comments (json)

Dữ liệu cho document được gửi dưới dạng JSON. Elasticsearch giống như với bất kỳ cơ sở dữ liệu NoSQL nào, không cần xác định trước cấu trúc dữ liệu.

Tuy nhiên để đảm bảo hiệu suất tối ưu, bạn có thể xác định ánh xạ Elasticsearch theo kiểu dữ liệu.

Get index

Để xem danh sách các index bạn sử dụng câu lệnh:

curl -XGET 'localhost:9200/_cat/indices?v&pretty'Code language: JavaScript (javascript)

hoặc có thể truy cập http://localhost:9200/_cat/indices ngay trên trình duyệt của bạn.

Kết quả:

yellow open audience_option_column          fKe9hr6RT6OWiTCuvn-RGg 1 1 0 0 208b 208b
yellow open user_by_platform                Fu5rj459QBWfvp71Z0F5pw 1 1 0 0 208b 208b
yellow open user_chart                      PWv7ZrXvTPiBFFYoOQM84A 1 1 0 0 208b 208b
yellow open top_page_by_minutes_v1          rn3eetN_R1muqL59nrr7oQ 1 1 0 0 208b 208b
yellow open crash_of_user                   PEqlssVxSCuNIDnNJdVxpQ 1 1 0 0 208b 208b
yellow open event_data                      84u2iRamTwSzon_B9BJMwg 1 1 0 0 208b 208b
yellow open user_test_api                   aBFSCvvySjSs_EUZQIuLRg 1 1 0 0 208b 208b

Truy vấn Elasticsearch

Truy vấn đươn giản nhất mà bạn có thể làm và tìm phần tử duy nhất.

Chúng ta sử dụng REST API:

curl -XGET 'localhost:9200/app/users/4?pretty'Code language: JavaScript (javascript)

Kết quả:

{
  "_index" : "app",
  "_type" : "users",
  "_id" : "4",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "id" : 4,
    "username" : "john",
    "last_login" : "2021-08-27 12:34:56"
  }
}Code language: JSON / JSON with Comments (json)

Các trường bắt đầu bằng dấu gạch dưới là trường meta của kết quả. Đối tượng _source là tài liệu gốc đã được lập index.

Tôi thực hiện tìm kiếm bằng gọi endpoint _search:

curl -XGET 'localhost:9200/_search?q=logged'Code language: JavaScript (javascript)

Kết quả:

{
  "took": 173,
  "timed_out": false,
  "_shards": {
    "total": 16,
    "successful": 16,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "logs",
        "_type": "my_app",
        "_id": "ZsWdJ2EBir6MIbMWSMyF",
        "_score": 0.2876821,
        "_source": {
          "timestamp": "2021-08-26 12:34:56",
          "message": "User logged in",
          "user_id": 4,
          "admin": false
        }
      }
    ]
  }
}Code language: JSON / JSON with Comments (json)

Kết quả chứa một số trường bổ sung mô tả cả tìm kiếm và kết quả:

  • took: thời gian tính bằng mili giây mà tìm kiếm đã diễn ra.
  • timed_out: nếu quá trình tìm kiếm đã hết thời gian.
  • _shards: số lượng các phân đoạn Lucene được tìm kiếm và tỷ lêk thành công và thất bại của chúng.
  • hits: kết quả thực tế, cùng với thông tin meta cho kết quả.

Truy vấn DSL trong Elasticsearch

Có 2 loại mệnh đề:

  • mệnh đề leaf query: tìm kiếm giá trị trong trường cụ thể.
  • mệnh đều compound query: có thể chứa một hoặc một số mệnh đề leaf query.

Các loại truy vấn Elastichsearch

Có rất nhiều tùy chọn có sẵn trong các loại tìm kiếm này và bạn có thể kết hợp các tùy chọn khác nhau để nhận được kết quả mà bạn yêu cầu. Nó bao gồm:

  • geo queries.
  • “more like this” queries.
  • scripted queries.
  • full tex queries.
  • shape queries.
  • span queries.
  • term-level queries.
  • specialized queries.

Kể từ Elasticsearch 6.8, ELK Stack đã hợp nhất các truy vấn Elasticsearch và bộ lọc Elasticsearch, nhưng ES vẫn phân biệt chúng theo ngữ cảnh. DSL phân biệt giữa ngữ cảnh bộ lọc và ngữ cảnh truy vấn cho các mệnh đề truy vấn.

Các điều khoản trong tài liệu kiểm tra ngữ cảnh bộ lọc theo kiểu boolean: tài liệu có khớp với bộ lọc, “có” hay “không”?. Các kiểu bộ lọc nói chung cũng nhanh hơn các truy vấn, nhưng các truy vấn cũng có thể tính điểm phù hợp tùy theo mức độ liên quan đến một tài liệu đối với truy vấn. Bộ lọc không sử dụng điểm phù hợp. Điều này xác định thứ tự và bao gồm các tài liệu:

curl -XGET 'localhost:9200/logs/_search?pretty' -H 'Content-Type: application/json' -d'
{
  "query": {
    "match_phrase": {
      "message": "User logged in"
    }
  }
}
'Code language: PHP (php)

Kết quả:

{
  "took" : 28,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.8630463,
    "hits" : [
      {
        "_index" : "logs",
        "_type" : "my_app",
        "_id" : "ZsWdJ2EBir6MIbMWSMyF",
        "_score" : 0.8630463,
        "_source" : {
          "timestamp" : "2021-08-26 12:34:56",
          "message" : "User logged in",
          "user_id" : 4,
          "admin" : false
        }
      }
    ]
  }
}Code language: JSON / JSON with Comments (json)

Xóa dữ liệu Elasticsearch

Xóa các phần tử khỏi database cũng dễ dàng như thêm dữ liệu.

curl -XDELETE 'localhost:9200/app/users/4?pretty'Code language: JavaScript (javascript)

Kết quả:

{
  "_index" : "app",
  "_type" : "users",
  "_id" : "4",
  "_version" : 2,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}Code language: JSON / JSON with Comments (json)

Để xóa index, sử dụng câu lệnh:

curl -XDELETE 'localhost:9200/logs?pretty'Code language: JavaScript (javascript)

Để xóa tất cả index:

curl -XDELETE 'localhost:9200/_all?pretty'$Code language: JavaScript (javascript)

Kết quả khi xóa:

{
    "acknowledged" : true
}Code language: JSON / JSON with Comments (json)

Các bài viết khác: https://hocspringboot.net/2021/08/24/gioi-thieu-ve-feign/

Tham khảo khóa học lập trình tại: https://codegym.vn/

Tài liệu: https://codegym.vn/tai-nguyen-hoc-lap-trinh/

Thực hành: https://codegym.vn/blog/2020/06/29/bai-thuc-hanh-lap-trinh/

Bài giảng: https://codegym.vn/category/blog/bai-giang-lap-trinh/

Leave a Reply

Your email address will not be published. Required fields are marked *