+1

[Elasticsearch - CLI] Quản Lý Documents Trong Elasticsearch

Một index trống rỗng mà không có documents thì không mang lại nhiều giá trị thực tế. Vì vậy, hãy chuyển từ Indices APIs sang một công cụ mạnh mẽ khác: Document APIs. Chúng ta sẽ bắt đầu với các thao tác cơ bản trên một document, sử dụng file JSON mẫu sau:

book.json

{
  "title": "Elasticsearch: The Definitive Guide. A Distributed Real-Time Search and Analytics Engine",
  "categories": [
    { "name": "analytics" },
    { "name": "search" },
    { "name": "database store" }
  ],
  "publisher": "O’Reilly",
  "description": "Whether you need full-text search or real-time analytics of structured data—or both—the Elasticsearch distributed search engine is an ideal way to put your data to work. This practical guide not only shows you how to search, analyze, and explore data with Elasticsearch, but also helps you deal with the complexities of human language, geolocation, and relationships.",
  "published_date": "2015-02-07",
  "isbn": "978-1449358549",
  "rating": 4
}

Trước khi gửi JSON này lên Elasticsearch, chúng ta cần nói về document identification. Mỗi document trong Elasticsearch có một unique identifier, được lưu trữ trong trường đặc biệt _id. Bạn có thể tự cung cấp ID khi tải document lên hoặc Elasticsearch sẽ tự động tạo một ID cho nó.

Ví dụ, trong trường hợp này, chúng ta sử dụng isbn làm ID vì nó là một natural identifier hoàn hảo.

$ http PUT https://localhost:9200/catalog/books/978-1449358549 < book.json

Kết quả:

{
  "_id": "978-1449358549",
  "_index": "catalog",
  "_shards": {
    "failed": 0,
    "successful": 3,
    "total": 3
  },
  "_type": "books",
  "_version": 1,
  "created": true,
  "result": "created"
}

Chúng ta đã lưu thành công document đầu tiên vào catalog index, trong books type. Nhưng ngoài books, chúng ta cũng có authors type, được thiết lập theo mô hình parent-child relationship với books.

Hãy thêm tác giả của quyển sách này vào authors.json:

authors.json

[
  {
    "first_name": "Clinton",
    "last_name": "Gormley",
    "_parent": "978-1449358549"
  },
  {
    "first_name": "Zachary",
    "last_name": "Tong",
    "_parent": "978-1449358549"
  }
]

Vì một cuốn sách có thể có nhiều tác giả, chúng ta có thể sử dụng single document API để thêm từng document một. Tuy nhiên, thay vì làm vậy, hãy sử dụng Bulk Document API, bằng cách chuyển đổi authors.json sang định dạng phù hợp:

authors-bulk.json

{ "index": { "_index": "catalog", "_type": "authors", "_id": "1", "_parent": "978-1449358549" } }
{ "first_name": "Clinton", "last_name": "Gormley" }
{ "index": { "_index": "catalog", "_type": "authors", "_id": "2", "_parent": "978-1449358549" } }
{ "first_name": "Zachary", "last_name": "Tong" }

Chúng ta có thể gửi hàng loạt documents này lên Elasticsearch bằng Bulk API:

$ http POST https://localhost:9200/_bulk < authors-bulk.json

Kết quả:

{
  "errors": false,
  "items": [
    {
      "index": {
        "_id": "1",
        "_index": "catalog",
        "_shards": {
          "failed": 0,
          "successful": 3,
          "total": 3
        },
        "_type": "authors",
        "_version": 1,
        "created": true
      }
    },
    {
      "index": {
        "_id": "2",
        "_index": "catalog",
        "_shards": {
          "failed": 0,
          "successful": 3,
          "total": 3
        },
        "_type": "authors",
        "_version": 1,
        "created": true
      }
    }
  ]
}

Vậy là chúng ta đã thêm thành công documents cho booksauthors vào catalog index! Bây giờ, hãy thử fetch lại documents này để kiểm tra.

Lấy lại một cuốn sách theo ID

$ http https://localhost:9200/catalog/books/978-1449358549

Lấy lại tác giả theo ID (với parent ID)

$ http https://localhost:9200/catalog/authors/1?parent=978-1449358549

Elasticsearch yêu cầu bạn cung cấp parent ID khi lấy lại documents trong một parent-child relationship.

Xóa và Cập Nhật Documents

Elasticsearch cũng hỗ trợ Delete APIUpdate API, hoạt động tương tự như Index API. Một điều cần lưu ý là khi bạn xóa một parent document, child documents của nó sẽ không bị xóa tự động!

Xóa một tài liệu

$ http DELETE https://localhost:9200/catalog/books/978-1449358549

Nếu bạn muốn xóa tất cả child documents khi xóa một parent document, bạn sẽ cần thực hiện điều đó theo cách thủ công hoặc sử dụng query-based deletion.

Lấy Thông Tin Chi Tiết Về Document

Một API thú vị khác là Term Vectors API, giúp lấy thông tin thống kê về các terms trong một document. Ví dụ:

$ http https://localhost:9200/catalog/books/978-1449358549/_termvectors?fields=description

Kết quả (rút gọn):

{
  "term_vectors": {
    "description": {
      "field_statistics": {
        "doc_count": 1,
        "sum_doc_freq": 46,
        "sum_ttf": 60
      },
      "terms": {
        "elasticsearch": { "term_freq": 3 },
        "search": { "term_freq": 2 }
      }
    }
  }
}

Tính năng này rất hữu ích khi bạn muốn kiểm tra tại sao một document không xuất hiện trong kết quả tìm kiếm.


Vậy là chúng ta đã hoàn thành phần quan trọng về quản lý documents trong Elasticsearch! 🚀


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í