sql >> Base de Datos >  >> NoSQL >> Redis

Indexación mediante conjuntos ordenados de Redis

  1. Desaconsejo enfáticamente el uso de Redis para esto. Estarás almacenando una tonelada de datos de puntero adicionales, y si alguna vez decides que quieres hacer consultas más complicadas como, SELECT WHERE first_name LIKE 'jon%' te vas a meter en problemas. También deberá diseñar índices muy grandes adicionales que crucen varias columnas, en caso de que desee buscar dos campos al mismo tiempo. Básicamente, deberá seguir pirateando y rediseñando un marco de búsqueda. Sería mucho mejor usar Elastic Search o Solr, o cualquiera de los otros marcos ya creados para hacer lo que está tratando de hacer. Redis es impresionante y tiene muchos buenos usos. Este no es uno de ellos.

  2. Dejando de lado la advertencia, para responder a su pregunta real:creo que sería mejor que usara una variante de su primera solución. Use un solo conjunto ordenado por índice, pero solo convierta sus letras en números. Convierte tus letras a algún valor decimal. Puede usar el valor ASCII o simplemente asignar cada letra a un valor del 1 al 26 en orden lexicográfico, suponiendo que esté usando inglés. Estandarice, de modo que cada letra ocupe la misma longitud numérica (por lo tanto, si 26 es su número más grande, 1 se escribiría "01"). Luego simplemente agregue estos junto con un punto decimal al frente y utilícelo como su puntaje por índice (es decir, "sombrero" sería ".080120"). Esto le permitirá tener un mapeo 1 a 1 correctamente ordenado entre las palabras y estos números. Cuando busque, convierta letras en números y luego podrá usar todas las funciones ordenadas de conjunto de Redis como ZRANGEBYSCORE sin necesidad de reescribirlos. Las funciones de Redis están escritas de manera muy, muy óptima, por lo que es mucho mejor usarlas siempre que sea posible en lugar de escribir las suyas propias.