0

[Elasticsearch - CLI] Tìm hiểu về indices

Elasticsearch cluster của chúng ta đã sẵn sàng hoạt động. Bước tiếp theo hợp lý là tạo một catalog index với mapping typessettings đã được xác định trước. Nhưng trước khi làm điều đó, hãy kiểm tra xem có indices nào đã được tạo hay chưa bằng cách sử dụng Indices APIs.

$ http https://localhost:9200/_stats

Kết quả:

{
  "_all": {
    "primaries": {},
    "total": {}
  },
  "_shards": {
    "failed": 0,
    "successful": 0,
    "total": 0
  },
  "indices": {}
}

Như dự đoán, cluster của chúng ta hiện tại chưa có gì cả, vì vậy chúng ta có thể tiến hành tạo index cho book catalog. Elasticsearch sử dụng JSON để giao tiếp, nhưng thao tác với JSON documents từ dòng lệnh có thể khá rắc rối. Vì vậy, chúng ta sẽ lưu settingsmappings của catalog vào một tệp catalog-index.json.

catalog-index.json

{
  "settings": {
    "index": {
      "number_of_shards": 5,
      "number_of_replicas": 2
    }
  },
  "mappings": {
    "books": {
      "_source": { "enabled": true },
      "properties": {
        "title": { "type": "text" },
        "categories": {
          "type": "nested",
          "properties": {
            "name": { "type": "text" }
          }
        },
        "publisher": { "type": "keyword" },
        "description": { "type": "text" },
        "published_date": { "type": "date" },
        "isbn": { "type": "keyword" },
        "rating": { "type": "byte" }
      }
    },
    "authors": {
      "properties": {
        "first_name": { "type": "keyword" },
        "last_name": { "type": "keyword" }
      },
      "_parent": { "type": "books" }
    }
  }
}

Chúng ta có thể sử dụng tệp này làm input để tạo index bằng Index API.

$ http PUT https://localhost:9200/catalog < catalog-index.json

Kết quả:

{
  "acknowledged": true,
  "shards_acknowledged": true
}

Một điều quan trọng cần lưu ý về acknowledged response property là nó xuất hiện trong hầu hết các Elasticsearch APIs, đặc biệt là các API thực hiện thay đổi dữ liệu. Giá trị true có nghĩa là thao tác đã hoàn tất trong thời gian timeout quy định, trong khi false có nghĩa là thay đổi có thể sẽ có hiệu lực sau một khoảng thời gian ngắn.

Bây giờ, để đảm bảo index đã được tạo thành công, chúng ta có thể kiểm tra lại settings của nó:

$ http https://localhost:9200/catalog/_settings

Kết quả:

{
  "catalog": {
    "settings": {
      "index": {
        "creation_date": "1487428863824",
        "number_of_replicas": "2",
        "number_of_shards": "5",
        "provided_name": "catalog",
        "uuid": "-b63dCesROC5UawbHz8IYw",
        "version": {
          "created": "5020099"
        }
      }
    }
  }
}

Chúng ta đã tạo thành công catalog index với các thiết lập mong muốn. 🎉

Bạn có thể tự hỏi chuyện gì sẽ xảy ra nếu chúng ta cố gắng thay đổi số lượng shards của index sau khi đã tạo? Như đã biết, không phải tất cả index settings có thể thay đổi sau khi index đã được tạo.

$ echo ’{"index":{"number_of_shards":6}}’ | http PUT https://localhost:9200/catalog/_settings

Kết quả lỗi:

{
  "error": {
    "reason": "can't change the number of shards for an index",
    "root_cause": [],
    "type": "illegal_argument_exception"
  },
  "status": 400
}

Không có gì ngạc nhiên! Một số thiết lập quan trọng, như số lượng shards, không thể thay đổi sau khi index đã được tạo.

Bên cạnh settings, chúng ta cũng có thể kiểm tra mapping types của một index bằng lệnh sau:

$ http https://localhost:9200/catalog/_mapping

Kết quả:

{
  "catalog": {
    "mappings": {
      "authors": { ... },
      "books": { ... }
    }
  }
}

Thông thường, index mappings cho các fields đã tồn tại không thể thay đổi, nhưng có một số ngoại lệ.

Một tính năng cực kỳ hữu ích của Indices APIs là khả năng thực hiện analysis process trên một index mapping type mà không cần gửi bất kỳ document nào. Ví dụ, chúng ta có thể phân tích title field của một cuốn sách bằng Analyze API:

$ http https://localhost:9200/catalog/_analyze field=books.title text="Elasticsearch: The Definitive Guide"

Kết quả:

{
  "tokens": [
    {
      "end_offset": 13,
      "position": 0,
      "start_offset": 0,
      "token": "elasticsearch",
      "type": ""
    },
    {
      "end_offset": 18,
      "position": 1,
      "start_offset": 15,
      "token": "the",
      "type": ""
    },
    {
      "end_offset": 88,
      "position": 11,
      "start_offset": 82,
      "token": "engine",
      "type": ""
    }
  ]
}

Tính năng này rất hữu ích để kiểm tra xem các mapping parameters có hoạt động chính xác hay không trước khi thêm dữ liệu thực tế vào Elasticsearch index.

Cuối cùng, một chi tiết quan trọng về index states: mỗi index có thể ở trạng thái open (hoạt động bình thường) hoặc closed (bị khóa để đọc/ghi, giống như lưu trữ).

Chúng ta có thể thay đổi trạng thái của index bằng cách sử dụng API sau:

$ http POST https://localhost:9200/catalog/_open

Kết quả:

{
  "acknowledged": true
}

Vậy là chúng ta đã hoàn thành việc tìm hiểu tất cả về indices! 🚀


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí