-
Jeg fraråder kraftigt brugen af Redis til dette. Du vil gemme et væld af ekstra pointerdata, og hvis du nogensinde beslutter dig for at lave mere komplicerede forespørgsler som f.eks.
SELECT WHERE first_name LIKE 'jon%'
du kommer til at løbe ind i problemer. Du bliver også nødt til at konstruere ekstra, meget store indekser, der krydser flere kolonner, hvis du vil søge efter to felter på samme tid. Du bliver i bund og grund nødt til at blive ved med at hacke væk og omstrukturere en søgeramme. Du ville være meget bedre stillet ved at bruge Elastic Search eller Solr eller en af de andre rammer, der allerede er bygget til at gøre det, du prøver at gøre. Redis er fantastisk og har mange gode anvendelsesmuligheder. Dette er ikke en af dem. -
Advarsel til side, for at besvare dit egentlige spørgsmål:Jeg tror, du ville være bedst tjent med at bruge en variant af din første løsning. Brug et enkelt sorteret sæt pr. indeks, men konverter blot dine bogstaver til tal. Konverter dine bogstaver til en decimalværdi. Du kan bruge ASCII-værdien eller blot tildele hvert bogstav til en 1-26-værdi i leksikografisk rækkefølge, forudsat at du bruger engelsk. Standardiser, så hvert bogstav fylder den samme numeriske længde (så hvis 26 er dit største tal, vil 1 blive skrevet "01"). Så skal du bare tilføje disse sammen med et decimaltegn foran og bruge det som din score pr. indeks (dvs. "hat" ville være ".080120"). Dette giver dig mulighed for at få en korrekt ordnet 1-til-1-mapping mellem ord og disse tal. Når du søger, konverter fra bogstaver til tal, og så vil du være i stand til at bruge alle Redis' fine sorterede sæt funktioner som
ZRANGEBYSCORE
uden at skulle omskrive dem. Redis' funktioner er skrevet meget, meget optimalt, så du er meget bedre stillet at bruge dem, når det er muligt i stedet for at skrive dine egne.