Thực hiện các truy vấn có điều kiện

Chủ đề này giới thiệu cách thực hiện các truy vấn có điều kiện, tương tự như điều kiện WHERE trong SQL.

Không giống như việc tìm kiếm tương tự vector, các truy vấn lấy vectơ dựa trên việc lọc theo giá trị vô hướng sử dụng biểu thức logic. Milvus hỗ trợ các loại dữ liệu khác nhau trong các trường vô hướng và một loạt các biểu thức logic. Biểu thức logic có thể lọc các trường vô hướng hoặc trường khóa chính và lấy tất cả kết quả khớp với điều kiện lọc.

Ví dụ dưới đây minh họa cách thực hiện một truy vấn trên một tập dữ liệu chứa 2000 hàng, bao gồm ID sách (khóa chính), số từ (trường vô hướng) và giới thiệu sách (trường vector). Nó mô phỏng việc truy vấn các sách cụ thể dựa trên ID của chúng.

Tải bộ sưu tập

Trong Milvus, tất cả các hoạt động tìm kiếm và truy vấn được thực hiện trong bộ nhớ. Trước khi thực hiện một truy vấn, cần tải bộ sưu tập vào bộ nhớ.

err := milvusClient.LoadCollection(
  context.Background(),   // ctx
  "book",                 // CollectionName
  false                   // async
)
if err != nil {
  log.Fatal("Failed to load collection:", err.Error())
}

Thực hiện truy vấn

Ví dụ dưới đây lọc vectơ dựa trên các giá trị book_id cụ thể và trả về các trường book_idbook_intro của kết quả.

Milvus hỗ trợ việc thiết lập cấp độ nhất quán cho các truy vấn. Ví dụ này thiết lập cấp độ nhất quán là Strong. Bạn cũng có thể thiết lập cấp độ nhất quán thành Bounded, Session, hoặc Eventually. Để biết thêm thông tin về bốn cấp độ nhất quán trong Milvus, xem Nhất quán.

Bạn cũng có thể sử dụng các trường động trong các biểu thức lọc và các trường đầu ra trong yêu cầu truy vấn. Ví dụ, tham khảo mẫu động.

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})

queryResult, err := milvusClient.Query(
    context.Background(),                                   // ctx
    "book",                                                 // CollectionName
    "",                                                     // PartitionName
    entity.NewColumnInt64("book_id", []int64{2,4,6,8}),     // expr
    []string{"book_id", "book_intro"},                      // OutputFields
    opt,                                                    // queryOptions
)
if err != nil {
    log.Fatal("Failed to query the collection:", err.Error())
}
Tham số Mô tả Tùy chọn
ctx Ngữ cảnh được sử dụng để kiểm soát quá trình gọi API. N/A
CollectionName Tên của bộ sưu tập cần được truy vấn. N/A
partitionName Tên của các phân vùng cần được tải. Nếu trống, truy vấn tất cả các phân vùng. N/A
expr Biểu thức logic được sử dụng để lọc các thuộc tính. Để biết thêm thông tin, xem Quy tắc Biểu thức Logic.
OutputFields Tên các trường cần trả về. Các trường vector không được hỗ trợ trong phiên bản hiện tại.
opts Các tùy chọn truy vấn được biểu diễn dưới dạng entity.SearchQueryOptionFunc. - Limit chỉ ra số lượng thực thể được trả về. - Offset chỉ ra số lượng thực thể được bỏ qua trong quá trình tìm kiếm. Tổng của tham số này và Limit nên nhỏ hơn 16384. - ConsistencyLevel chỉ ra cấp độ nhất quán được áp dụng trong quá trình tìm kiếm. - Ignore Growing chỉ ra liệu có bỏ qua đoạn mới tăng trong quá trình tìm kiếm tương đồng hay không. Giá trị mặc định là False, chỉ ra rằng tìm kiếm liên quan đến đoạn mới tăng.

Kiểm tra kết quả trả về.

fmt.Printf("%#v\n", queryResult)
for _, qr := range queryResult {
    fmt.Println(qr.IDs)
}

Tính Số lượng Thực Thể

Khi thực hiện một truy vấn, bạn có thể thêm count(*) vào output_fields, để Milvus có thể trả về số lượng thực thể trong bộ sưu tập. Nếu bạn muốn đếm số lượng thực thể khớp với các điều kiện cụ thể, sử dụng expr để định nghĩa một biểu thức logic.

Hạn chế

Khi sử dụng count(*) trong output_fields, không được phép sử dụng tham số limit.