EzyVector cung cấp REST API để tạo collection, lưu vector point và tìm kiếm các vector gần nhất. API chạy trên Web Server của EzyPlatform; dữ liệu được lưu đồng thời trong cơ sở dữ liệu, file vector và chỉ mục HNSW.

Danh sách REST API

Base path:
/ezyvector/collections
MethodEndpointChức năng
PUT/ezyvector/collections/{collectionName}Tạo collection nếu chưa tồn tại
GET/ezyvector/collections/{collectionName}Lấy cấu hình collection
PUT/ezyvector/collections/{collectionName}/pointsThêm mới hoặc cập nhật các vector point
POST/ezyvector/collections/{collectionName}/points/searchTìm các vector gần nhất
Các URL trong tài liệu là đường dẫn tương đối. Ví dụ, nếu Web Server chạy tại http://localhost:8080, endpoint tạo collection sẽ là:
http://localhost:8080/ezyvector/collections/products

Xác thực

Tất cả REST API của EzyVector đều yêu cầu API key. Có thể truyền API key theo một trong các cách sau:
Authorization: Bearer <api-key>
hoặc:
x-api-key: <api-key>
API key cũng có thể được truyền qua request parameter với một trong các tên:
api-key
api_key
apikey
Nên ưu tiên header Authorization hoặc x-api-key để tránh API key xuất hiện trong URL và access log.
Ngoài API key, EzyVector có thể giới hạn địa chỉ IP được phép truy cập. Danh sách cho phép hỗ trợ:
  • Một địa chỉ IPv4 cụ thể, ví dụ 192.168.1.10.
  • Một CIDR, ví dụ 192.168.1.0/24.
  • Một khoảng IP, ví dụ 192.168.1.10-192.168.1.30.
  • Nhiều quy tắc, phân tách bằng dấu phẩy hoặc khoảng trắng.
Nếu danh sách IP để trống, bước kiểm tra IP được bỏ qua.

Tạo collection

PUT /ezyvector/collections/{collectionName}
API tạo collection nếu collection chưa tồn tại. Nếu collection đã tồn tại, API giữ nguyên cấu hình hiện tại, không cập nhật lại kích thước vector hoặc distance.
Ví dụ:
curl -X PUT \
  'http://localhost:8080/ezyvector/collections/products' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "vectors": {
      "size": 384,
      "distance": "cosine"
    }
  }'
Request body:
Thuộc tínhKiểuBắt buộcMô tả
vectorsobjectCấu hình vector của collection
vectors.sizeintegerSố chiều của vector, phải lớn hơn 0
vectors.distancestringPhương pháp tính độ tương đồng; hiện hỗ trợ cosine
Response thành công:
{
  "result": true,
  "status": "ok"
}
Khi tạo collection, hệ thống:
  1. Ghi metadata collection vào cơ sở dữ liệu nếu chưa tồn tại.
  2. Khởi tạo segment có thể ghi cho collection.
  3. Kiểm tra và khởi động backfill vector nếu cần.
  4. Nạp hoặc khởi tạo quá trình xây dựng chỉ mục HNSW.

Lấy thông tin collection

GET /ezyvector/collections/{collectionName}
Ví dụ:
curl \
  'http://localhost:8080/ezyvector/collections/products' \
  -H 'x-api-key: YOUR_API_KEY'
Response:
{
  "result": {
    "config": {
      "params": {
        "vectors": {
          "size": 384
        }
      }
    }
  },
  "status": "ok"
}
API hiện trả về kích thước vector của collection. Nếu collection không tồn tại, server trả về 404 Not Found.

Thêm hoặc cập nhật vector point

PUT /ezyvector/collections/{collectionName}/points
Một point gồm:
Thuộc tínhKiểuBắt buộcMô tả
idintegerĐịnh danh point do client cung cấp
vectorarray of numberVector của point
payloadobjectKhôngMetadata tùy ý gắn với point
Ví dụ:
curl -X PUT \
  'http://localhost:8080/ezyvector/collections/products/points' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "points": [
      {
        "id": 1001,
        "vector": [0.12, 0.45, 0.78],
        "payload": {
          "name": "Laptop",
          "category": "electronics"
        }
      },
      {
        "id": 1002,
        "vector": [0.21, 0.51, 0.68],
        "payload": {
          "name": "Desktop computer",
          "category": "electronics"
        }
      }
    ]
  }'
Response:
{
  "result": true,
  "status": "ok"
}
Nếu point có cùng id đã tồn tại trong collection, dữ liệu của point được cập nhật.
Độ dài của mỗi vector phải bằng vectors.size của collection. EzyVector không tự cắt, nối hoặc thay đổi kích thước vector.

Tìm kiếm vector

POST /ezyvector/collections/{collectionName}/points/search
Request body:
Thuộc tínhKiểuBắt buộcMô tả
vectorarray of numberVector dùng làm truy vấn
limitintegerSố kết quả tối đa, phải lớn hơn 0
with_payloadbooleanKhôngTrường tương thích của request
Ví dụ:
curl -X POST \
  'http://localhost:8080/ezyvector/collections/products/points/search' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "vector": [0.14, 0.48, 0.73],
    "limit": 10,
    "with_payload": true
  }'
Response:
{
  "result": [
    {
      "id": 1001,
      "score": 0.9984,
      "payload": {
        "name": "Laptop",
        "category": "electronics"
      }
    },
    {
      "id": 1002,
      "score": 0.9721,
      "payload": {
        "name": "Desktop computer",
        "category": "electronics"
      }
    }
  ],
  "status": "ok"
}
Kết quả được sắp xếp theo score giảm dần. Với cosine similarity, score càng lớn thì vector càng giống truy vấn.
Ở phiên bản hiện tại, with_payload đã có trong request model nhưng chưa điều khiển việc loại bỏ payload; response tìm kiếm vẫn có trường payload.

Luồng dữ liệu tổng quát

flowchart LR
    Client[Ứng dụng khách]
    API[REST API EzyVector]
    Auth[Xác thực API key và IP]
    Validator[Kiểm tra request]
    Service[Dịch vụ vector]
    DB[(Cơ sở dữ liệu)]
    Raw[(Vector file store)]
    Memory[HNSW trong bộ nhớ]
    HNSW[(HNSW store)]
    Response[JSON response]

    Client --> API
    API --> Auth
    Auth --> Validator
    Validator --> Service

    Service --> DB
    Service --> Raw
    Service --> Memory
    Memory --> HNSW

    DB --> Service
    Raw --> Service
    HNSW --> Memory

    Service --> Response
    Response --> Client
Cơ sở dữ liệu là nguồn dữ liệu bền vững, lưu collection, vector point, payload và trạng thái segment. File store chứa vector đã chuẩn hóa để phục vụ exact search và backfill. HNSW tồn tại trong bộ nhớ để tìm kiếm nhanh, đồng thời được lưu xuống file để có thể nạp lại.

Luồng tạo collection

sequenceDiagram
    participant C as Client
    participant A as REST API
    participant S as Vector service
    participant DB as Cơ sở dữ liệu
    participant FS as Vector file store
    participant H as HNSW store

    C->>A: PUT /collections/{name}
    A->>A: Kiểm tra API key, IP và request
    A->>S: Tạo collection nếu chưa tồn tại
    S->>DB: Tìm collection theo tên

    alt Collection chưa tồn tại
        S->>DB: Lưu metadata collection
    else Collection đã tồn tại
        S-->>S: Giữ nguyên cấu hình hiện tại
    end

    S->>DB: Đảm bảo có mutable segment
    S->>FS: Kiểm tra tiến độ backfill
    S->>H: Nạp hoặc khởi động build HNSW
    S-->>A: Hoàn tất
    A-->>C: result=true, status=ok
Việc backfill và xây dựng HNSW có thể chạy bất đồng bộ sau khi API trả response.

Luồng upsert point

sequenceDiagram
    participant C as Client
    participant A as REST API
    participant S as Vector service
    participant DB as Cơ sở dữ liệu
    participant FS as Vector file store
    participant H as HNSW trong bộ nhớ
    participant HF as HNSW store

    C->>A: PUT /collections/{name}/points
    A->>A: Xác thực và kiểm tra danh sách point
    A->>S: Upsert points
    S->>DB: Lấy collection và kích thước vector

    loop Với từng point
        S->>DB: Tìm point theo collectionId và pointId
        alt Point chưa tồn tại
            S->>DB: Tạo point
        else Point đã tồn tại
            S->>DB: Cập nhật vector và payload
        end
    end

    S->>FS: Chuẩn hóa và ghi vector
    S->>H: Thêm hoặc thay thế node
    opt HNSW đã sẵn sàng
        H->>HF: Lưu lại chỉ mục
    end

    S-->>A: Hoàn tất
    A-->>C: result=true, status=ok
Vector được ghi vào database dưới dạng dữ liệu nguồn. Khi ghi vào file store và HNSW, vector được chuẩn hóa L2 để phục vụ cosine similarity.

Luồng tìm kiếm

flowchart TD
    Request[POST points/search]
    Auth[Kiểm tra API key và IP]
    Validate[Kiểm tra vector và limit]
    Collection[Đọc collection từ database]
    Ready{HNSW đã sẵn sàng?}
    HnswSearch[Tìm kiếm gần đúng bằng HNSW]
    ExactSearch[Exact search trên vector file store]
    Metadata[Đọc point và payload từ database]
    Result[Trả id, score và payload]

    Request --> Auth
    Auth --> Validate
    Validate --> Collection
    Collection --> Ready

    Ready -->|Có| HnswSearch
    Ready -->|Chưa| ExactSearch

    HnswSearch --> Metadata
    ExactSearch --> Metadata
    Metadata --> Result
Nếu HNSW đã được nạp hoặc xây dựng xong, hệ thống sử dụng approximate nearest-neighbor search. Nếu HNSW chưa sẵn sàng, hệ thống fallback sang exact search trên file vector; request không phải chờ quá trình build hoàn tất.
Sau khi tìm được các point gần nhất, EzyVector đọc lại metadata và payload từ cơ sở dữ liệu để tạo response.

Mã lỗi

HTTP statusTrường hợp
400 Bad RequestThiếu vector, limit không hợp lệ, thiếu cấu hình collection hoặc distance không được hỗ trợ
401 UnauthorizedAPI key không đúng hoặc địa chỉ IP không nằm trong danh sách cho phép
404 Not FoundCollection được yêu cầu không tồn tại
500 Internal Server ErrorLỗi lưu trữ hoặc dữ liệu không phù hợp với cấu hình collection
Response lỗi validation thường chứa tên trường và nguyên nhân, ví dụ:
{
  "vector": "required",
  "limit": "invalid"
}

Xem Swagger trong EzyPlatform Admin

Swagger của EzyVector được tổng hợp từ các REST controller đang hoạt động. Để mở giao diện này, cần cài và kích hoạt plugin GraphQL của EzyPlatform. Plugin GraphQL ở đây cung cấp trang quản trị và bộ sinh tài liệu REST/OpenAPI; các REST API EzyVector không bị chuyển thành GraphQL và không cần gọi qua GraphQL.
Cài đặt bằng giao diện admin:
  1. Đăng nhập EzyPlatform Admin, mặc định thường là http://localhost:9090.
  2. Mở Plugins → Admin.
  3. Nhấn Add New.
  4. Tìm plugin GraphQL và cài đặt.
  5. Kích hoạt ít nhất Admin Plugin; để thu thập tài liệu API phía Web, hãy kích hoạt cả Web Plugin.
  6. Chọn Active & Restart nếu hệ điều hành và cách chạy server hỗ trợ. Nếu không, kích hoạt plugin rồi khởi động lại Admin và Web Server. Đây cũng là quy trình cài và kích hoạt plugin được mô tả trong tài liệu EzyPlatform.
Có thể cài bằng CLI:
bash cli.sh "install graphql"
bash cli.sh "activate all graphql"
bash cli.sh restart
CLI tải plugin từ marketplace; plugin cần được kích hoạt và server cần được khởi động lại để áp dụng thay đổi, theo hướng dẫn EzyPlatform CLI.
Sau khi GraphQL plugin hoạt động:
  1. Đăng nhập lại EzyPlatform Admin.
  2. Mở menu GraphQL.
  3. Chọn API Types.
  4. Trong phần Web, nhấn Swagger.
  5. Swagger UI sẽ mở trong tab mới và hiển thị các REST API của Web Server, bao gồm EzyVector.
Đường dẫn trực tiếp trong Admin:
/api-types
Trang Swagger cho Web:
/graphql/rest/swagger/web
OpenAPI YAML của Web có thể được lấy tại:
/graphql/api/v1/rest/web/swagger.yaml
Các đường dẫn trên thuộc Admin Server. Với cấu hình mặc định, có thể truy cập:
http://localhost:9090/api-types
http://localhost:9090/graphql/rest/swagger/web
http://localhost:9090/graphql/api/v1/rest/web/swagger.yaml
Nếu không thấy API EzyVector trong Swagger, hãy kiểm tra:
  • EzyVector Web Plugin đã được cài đặt và kích hoạt.
  • GraphQL Admin Plugin và Web Plugin đã được kích hoạt.
  • Cả Admin Server và Web Server đã được khởi động lại sau khi kích hoạt plugin.
  • Web Server đang chạy và Admin Server có thể truy cập endpoint quản lý của Web Server.