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_id
và book_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
.