-
Tôi thực sự không khuyến khích việc sử dụng Redis cho việc này. Bạn sẽ lưu trữ rất nhiều dữ liệu con trỏ bổ sung và nếu bạn quyết định muốn thực hiện các truy vấn phức tạp hơn như
SELECT WHERE first_name LIKE 'jon%'
bạn sẽ gặp rắc rối. Bạn cũng sẽ cần thiết kế các chỉ mục bổ sung, rất lớn vượt qua nhiều cột, trong trường hợp bạn muốn tìm kiếm hai trường cùng một lúc. Về cơ bản, bạn sẽ cần phải tiếp tục hack và cấu trúc lại khung tìm kiếm. Bạn sẽ tốt hơn nhiều khi sử dụng Elastic Search hoặc Solr, hoặc bất kỳ khuôn khổ nào khác đã được xây dựng để thực hiện những gì bạn đang cố gắng làm. Redis thật tuyệt vời và có nhiều công dụng hay. Đây không phải là một trong số chúng. -
Cảnh báo sang một bên, để trả lời câu hỏi thực tế của bạn:Tôi nghĩ rằng bạn sẽ được phục vụ tốt nhất khi sử dụng một biến thể của giải pháp đầu tiên của mình. Sử dụng một bộ được sắp xếp duy nhất cho mỗi chỉ mục, nhưng chỉ cần chuyển đổi các chữ cái của bạn thành số. Chuyển đổi các chữ cái của bạn thành một số giá trị thập phân. Bạn có thể sử dụng giá trị ASCII hoặc chỉ cần gán mỗi chữ cái với giá trị 1-26 theo thứ tự từ vựng, giả sử bạn đang sử dụng tiếng Anh. Chuẩn hóa sao cho mỗi chữ cái có cùng độ dài số (vì vậy, nếu 26 là số lớn nhất của bạn, thì 1 sẽ được viết là "01"). Sau đó, chỉ cần nối chúng lại với nhau bằng một dấu thập phân ở phía trước và sử dụng nó làm điểm cho mỗi chỉ mục của bạn (tức là "hat" sẽ là ".080120"). Điều này sẽ cho phép bạn có một ánh xạ 1-1 được sắp xếp đúng thứ tự giữa các từ và những con số này. Khi bạn tìm kiếm, hãy chuyển đổi từ các chữ cái sang số, và sau đó bạn sẽ có thể sử dụng tất cả các chức năng được sắp xếp tuyệt vời của Redis như
ZRANGEBYSCORE
mà không cần phải viết lại chúng. Các hàm của Redis được viết rất, rất tối ưu, vì vậy tốt hơn hết là bạn nên sử dụng chúng bất cứ khi nào có thể thay vì viết hàm của riêng bạn.