sql >> Database teknologi >  >> NoSQL >> Redis

Multi-parameter match-finder med Redis

Det, du prøver at gøre her, er et omvendt indeks.

For hver kolonne skal du få den til at blive "sæt". Derefter kan du krydse sættene for at få resultatet.

APPLE: RED ROUND FRUIT vil knyttes til følgende indsættelser:

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

Lad os så sige, at jeg vil forespørge efter * ROUND FRUIT , jeg ville gøre:

SINTER p2:ROUND p3:FRUIT

Denne kommando tager skæringspunktet mellem elementerne i p2:ROUND set og p3:FRUIT sæt. Dette vil returnere alle de varer, der er ROUND og FRUIT , ligeglad med hvad p1 er.

Nogle andre eksempler:

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

Mit svar ovenfor kommer til at bruge noget regnekraft, fordi skæringsoperationen er O(N*M) . Her er en måde at gøre det på, der er mere hukommelsesintensiv, men vil have hurtigere hentning, fordi den effektivt forudberegner indekserne.

For hver kombination af egenskaber skal du lave en nøgle, der gemmer et sæt:

APPLE: RED ROUND FRUIT vil knyttes til følgende indsættelser:

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

Derefter, for at forespørge, skal du blot få adgang til den respektive nøgle. For eksempel * ROUND FRUIT ville simpelthen være

SMEMBERS :ROUND:FRUIT

Dette skalerer naturligvis ikke godt med hensyn til hukommelse, når du har mange dimensioner, men det vil være ekstremt hurtigt at hente resultater.




  1. MongoDB distinkt aggregering

  2. Visuel styring af MongoDB-dokumenter og samlinger

  3. Hvordan validerer jeg medlemmer af et matrixfelt?

  4. Sådan kører du js-fil i mongo ved hjælp af springdata