sql >> Databasteknik >  >> NoSQL >> Redis

Matchningssökare med flera parametrar med Redis

Det du försöker göra här är ett inverterat index.

För varje kolumn, låt den mappas till en "uppsättning". Sedan kan du skära uppsättningarna för att få resultatet.

Så, APPLE: RED ROUND FRUIT skulle mappa till följande inlägg:

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

Låt oss sedan säga att jag vill fråga efter * ROUND FRUIT , jag skulle göra:

SINTER p2:ROUND p3:FRUIT

Detta kommando tar skärningspunkten mellan objekten i p2:ROUND set och p3:FRUIT uppsättning. Detta kommer att returnera alla objekt som är ROUND och FRUIT , bryr sig inte om vad p1 är.

Några andra exempel:

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

Mitt svar ovan kommer att använda lite beräkningskraft eftersom skärningsoperationen är O(N*M) . Här är ett sätt att göra det som är mer minneskrävande, men som har snabbare hämtning eftersom det effektivt förberäknar indexen.

För varje kombination av egenskaper, skapa en nyckel som lagrar en uppsättning:

Så, APPLE: RED ROUND FRUIT skulle mappa till följande inlägg:

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

Sedan, för att fråga, kommer du helt enkelt åt respektive nyckel. Till exempel * ROUND FRUIT skulle helt enkelt vara

SMEMBERS :ROUND:FRUIT

Uppenbarligen skalar detta inte bra alls när det gäller minne när du har många dimensioner, men det kommer att vara extremt snabbt att hämta resultat.




  1. MongoDB Java Inserting Throws org.bson.codecs.configuration.CodecConfigurationException:Kan inte hitta en codec för klassen io.github.ilkgunel.mongodb.Pojo

  2. Använda map/reduce för att kartlägga egenskaperna i en samling

  3. Avrundning till 2 decimaler med MongoDB-aggregationsramverk

  4. Finns det något sätt att arbeta med sessioner utan att låsa på ASP.Net MVC-webbplatsen?