-
Je déconseille fortement l'utilisation de Redis pour cela. Vous allez stocker une tonne de données de pointeur supplémentaires, et si jamais vous décidez de faire des requêtes plus compliquées comme,
SELECT WHERE first_name LIKE 'jon%'
vous allez avoir des ennuis. Vous devrez également concevoir des index supplémentaires très volumineux qui traversent plusieurs colonnes, au cas où vous voudriez rechercher deux champs en même temps. Vous devrez essentiellement continuer à pirater et à réorganiser un cadre de recherche. Vous feriez bien mieux d'utiliser Elastic Search ou Solr, ou l'un des autres frameworks déjà construits pour faire ce que vous essayez de faire. Redis est génial et a beaucoup de bonnes utilisations. Ce n'est pas l'un d'entre eux. -
Avertissement mis à part, pour répondre à votre question actuelle :je pense que vous seriez mieux servi en utilisant une variante de votre première solution. Utilisez un seul ensemble trié par index, mais convertissez simplement vos lettres en chiffres. Convertissez vos lettres en une valeur décimale. Vous pouvez utiliser la valeur ASCII ou simplement attribuer à chaque lettre une valeur de 1 à 26 dans l'ordre lexicographique, en supposant que vous utilisez l'anglais. Normalisez, de sorte que chaque lettre occupe la même longueur numérique (donc, si 26 est votre plus grand nombre, 1 s'écrira "01"). Ensuite, ajoutez-les simplement avec un point décimal devant et utilisez-le comme votre score par index (c'est-à-dire que "chapeau" serait ".080120"). Cela vous permettra d'avoir un mappage 1 à 1 correctement ordonné entre les mots et ces nombres. Lorsque vous effectuez une recherche, convertissez des lettres en chiffres, puis vous pourrez utiliser toutes les fonctions d'ensemble triées de Redis telles que
ZRANGEBYSCORE
sans avoir besoin de les réécrire. Les fonctions de Redis sont écrites de manière très, très optimale, il est donc préférable de les utiliser chaque fois que possible au lieu d'écrire les vôtres.