Những gì bạn đang cố gắng làm ở đây là một chỉ mục đảo ngược.
Đối với mỗi cột, hãy ánh xạ đến một "tập hợp". Sau đó, bạn có thể giao nhau giữa các tập hợp để nhận được kết quả.
Vì vậy, APPLE: RED ROUND FRUIT
sẽ ánh xạ đến các phụ trang sau:
SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE
Sau đó, giả sử tôi muốn truy vấn * ROUND FRUIT
, Tôi sẽ làm:
SINTER p2:ROUND p3:FRUIT
Lệnh này đang lấy phần giao nhau của các mục trong p2:ROUND
đặt và p3:FRUIT
đặt. Thao tác này sẽ trả về tất cả các mục là ROUND
và FRUIT
, không quan tâm p1
gì là.
Một số ví dụ khác:
SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN
Câu trả lời ở trên của tôi sẽ sử dụng một số sức mạnh tính toán vì phép toán giao nhau là O(N*M)
. Đây là một cách làm tốn nhiều bộ nhớ hơn, nhưng sẽ truy xuất nhanh hơn vì nó tính toán trước các chỉ mục một cách hiệu quả.
Đối với mỗi tổ hợp thuộc tính, hãy tạo một khóa lưu trữ một tập hợp:
Vì vậy, APPLE: RED ROUND FRUIT
sẽ ánh xạ đến các phụ trang sau:
SADD RED:ROUND:FRUIT APPLE
SADD :ROUND:FRUIT APPLE
SADD RED::FRUIT APPLE
SADD RED:ROUND: APPLE
SADD RED:: APPLE
SADD :ROUND: APPLE
SADD ::FRUIT APPLE
SADD ::: APPLE
Sau đó, để truy vấn, bạn chỉ cần truy cập vào khóa tương ứng. Ví dụ:* ROUND FRUIT
đơn giản sẽ là
SMEMBERS :ROUND:FRUIT
Rõ ràng, quy mô này không tốt chút nào về bộ nhớ khi bạn có nhiều thứ nguyên, nhưng sẽ cực kỳ linh hoạt khi truy xuất kết quả.