-
Jag avråder starkt från användningen av Redis för detta. Du kommer att lagra massor av extra pekardata, och om du någonsin bestämmer dig för att göra mer komplicerade frågor som,
SELECT WHERE first_name LIKE 'jon%'
du kommer att hamna i problem. Du måste också konstruera extra, mycket stora index som korsar flera kolumner, om du vill söka efter två fält samtidigt. Du måste i princip fortsätta hacka dig bort och omstrukturera ett sökramverk. Du skulle vara mycket bättre av att använda Elastic Search eller Solr, eller något av de andra ramverken som redan byggts för att göra det du försöker göra. Redis är fantastisk och har många bra användningsområden. Det här är inte en av dem. -
Varning åsido, för att svara på din faktiska fråga:Jag tror att du skulle vara bäst betjänt av en variant av din första lösning. Använd en enda sorterad uppsättning per index, men konvertera bara dina bokstäver till siffror. Konvertera dina bokstäver till ett decimalvärde. Du kan använda ASCII-värdet eller bara tilldela varje bokstav till ett 1-26 värde i lexikografisk ordning, förutsatt att du använder engelska. Standardisera, så att varje bokstav tar upp samma numeriska längd (så om 26 är ditt största tal, skulle 1 skrivas "01"). Sedan är det bara att lägga till dessa tillsammans med en decimal framför och använda det som din poäng per index (dvs "hatt" skulle vara ".080120"). Detta låter dig ha en korrekt ordnad 1-till-1-mappning mellan ord och dessa siffror. När du söker, konvertera från bokstäver till siffror, och sedan kommer du att kunna använda alla Redis fina sorterade uppsättningsfunktioner som
ZRANGEBYSCORE
utan att behöva skriva om dem. Redis funktioner är skrivna väldigt, väldigt optimalt, så du är mycket bättre att använda dem när det är möjligt istället för att skriva dina egna.