sql >> Database >  >> NoSQL >> Redis

Match-finder met meerdere parameters met Redis

Wat je hier probeert te doen is een omgekeerde index.

Laat deze voor elke kolom toewijzen aan een "set". Vervolgens kun je de sets kruisen om het resultaat te krijgen.

Dus APPLE: RED ROUND FRUIT zou verwijzen naar de volgende invoegingen:

SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE

Laten we zeggen dat ik een zoekopdracht wil uitvoeren voor * ROUND FRUIT , ik zou doen:

SINTER p2:ROUND p3:FRUIT

Dit commando neemt het snijpunt van de items in de p2:ROUND set en de p3:FRUIT set. Hiermee worden alle items geretourneerd die ROUND zijn en FRUIT , niet schelen wat p1 is.

Enkele andere voorbeelden:

SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN

Mijn bovenstaande antwoord gaat wat rekenkracht gebruiken omdat de bewerking van het snijpunt O(N*M) is . Hier is een manier om dit te doen die meer geheugenintensief is, maar sneller kan worden opgehaald omdat het de indexen effectief vooraf berekent.

Maak voor elke combinatie van eigenschappen een sleutel die een set opslaat:

Dus APPLE: RED ROUND FRUIT zou verwijzen naar de volgende invoegingen:

SADD RED:ROUND:FRUIT APPLE
SADD :ROUND:FRUIT APPLE
SADD RED::FRUIT APPLE
SADD RED:ROUND: APPLE
SADD RED:: APPLE
SADD :ROUND: APPLE
SADD ::FRUIT APPLE
SADD ::: APPLE

Om vervolgens te zoeken, opent u eenvoudig de respectieve sleutel. Bijvoorbeeld * ROUND FRUIT zou gewoon zijn

SMEMBERS :ROUND:FRUIT

Uiteraard schaalt dit helemaal niet goed in termen van geheugen als je veel dimensies hebt, maar het zal buitengewoon pittig zijn om resultaten op te halen.




  1. Is dit een geldig gebruik van ServiceStack Redis?

  2. Groeperen op specifiek element van array met mongo-aggregatieframework

  3. Hoe Redis op ElasticBeanstalk te installeren en configureren

  4. Snelste manier om dubbele documenten in mongodb te verwijderen