Redis®*: Zoeken en JSON
Sla JSON-documenten op en doorzoek ze efficiënt met de Redis query engine
👋 Welkom bij de Stackhero-documentatie!
Stackhero biedt een kant-en-klare Redis cloud oplossing met tal van voordelen, waaronder:
Redis Commanderwebinterface inbegrepen.- Onbeperkte berichtgrootte en overdrachten.
- Updates eenvoudig met één klik.
- Optimale prestaties en sterke beveiliging dankzij een privé, dedicated infrastructuur.
Bespaar tijd en maak uw leven eenvoudiger: het kost slechts 5 minuten om de Redis cloud hosting oplossing van Stackhero uit te proberen!
Uw Redis-instantie op Stackhero bevat alle modules die beschikbaar zijn in Redis Open Source. Dankzij deze modules is Redis veel meer dan alleen een cache: u kunt echte JSON-documenten opslaan, indexeren en direct full-text, numerieke en tag-queries uitvoeren. U hoeft geen extra database aan uw stack toe te voegen.
Alle onderstaande vier modules zijn inbegrepen in uw pakket:
- JSON (
JSON.*commando's): Voegt een native JSON-type toe met ondersteuning voor JSONPath. U kunt individuele velden lezen of bijwerken zonder het hele document te herschrijven. - Search (
FT.*commando's), ook bekend als de Redis query engine: Biedt full-text search, secundaire indexering, aggregaties en vector search mogelijkheden. - Bloom (
BF.*,CF.*,CMS.*,TOPK.*,TDIGEST.*commando's): Probabilistische datastructuren die efficiënt vragen beantwoorden zoals "heb ik dit al eerder gezien?" over grote datasets met minimaal geheugenverbruik. - Time series (
TS.*commando's): Biedt een time series-type met retentie, downsampling en aggregatiefuncties.
Vector sets (VADD, VSIM) zijn direct ingebouwd in Redis zelf. Hiermee kunt u efficiënt vector similarity search uitvoeren voor embeddings en deze zijn altijd beschikbaar op uw service. Er is geen configuratie nodig.
Modules inschakelen
Modules zijn standaard uitgeschakeld. Dit zorgt ervoor dat bestaande services hun oorspronkelijke gedrag behouden totdat u ervoor kiest nieuwe functies te activeren.
- Open uw service in het Stackhero dashboard.
- Ga naar de serviceconfiguratie.
- Selecteer in de sectie Modules de gewenste modules.
- Sla uw wijzigingen op.
Uw Redis-service wordt opnieuw opgestart met de geselecteerde modules geladen. Dit proces duurt meestal slechts enkele seconden.
Zodra u data opslaat met een module (zoals een JSON-document, Bloom filter of time series), dient u die module ingeschakeld te laten. Redis kan geen toegang krijgen tot data die is aangemaakt door een uitgeschakelde module, en het uitschakelen ervan voorkomt dat uw service kan starten. Vector sets zijn altijd beschikbaar, omdat deze onderdeel zijn van Redis zelf.
Om te controleren welke modules momenteel geladen zijn, kunt u het volgende commando uitvoeren:
redis-cli -u "rediss://default:<yourPassword>@<XXXXXX>.stackhero-network.com:<PORT_TLS>" MODULE LIST
JSON-documenten opslaan
U kunt documenten native als JSON opslaan, in plaats van ze te serialiseren als strings:
JSON.SET product:1 $ '{"name":"Espresso machine","brand":"Bianca","price":459,"tags":["coffee","kitchen"],"stock":12}'
Deze aanpak maakt het mogelijk om individuele velden atomair en server-side te lezen of bij te werken:
JSON.GET product:1 $.price
# "[459]"
JSON.NUMINCRBY product:1 $.stock -1
# "[11]"
JSON.ARRAPPEND product:1 $.tags '"gift"'
Deze workflow bespaart tijd en verkleint de kans op fouten. Bijvoorbeeld, het verlagen van een voorraadcounter vereist niet dat u het hele document leest, parseert en herschrijft in uw applicatie. In plaats daarvan gebeurt dit direct en veilig op de server.
De volledige lijst met commando's vindt u in de Redis JSON documentatie.
Documenten indexeren en doorzoeken
U hoeft een index slechts één keer te declareren. Redis houdt deze automatisch up-to-date voor elke sleutel die overeenkomt met het gekozen prefix, inclusief sleutels die al bestonden voordat de index werd aangemaakt.
FT.CREATE productsIndex
ON JSON
PREFIX 1 product:
SCHEMA
$.name AS name TEXT
$.brand AS brand TAG
$.price AS price NUMERIC SORTABLE
$.tags[*] AS tags TAG
Nu kunt u queries uitvoeren zoals:
# Full-text search op de naam, met een prijsbereik
FT.SEARCH productsIndex "@name:(espresso) @price:[0 500]"
# Exacte merk-match, gesorteerd op prijs
FT.SEARCH productsIndex "@brand:{Bianca}" SORTBY price ASC
# Prefix search voor autocomplete-scenario's
FT.SEARCH productsIndex "@name:(espr*)"
Redis kan ook aggregaties direct op de index uitvoeren, zodat u analytische queries kunt beantwoorden zonder data te exporteren:
FT.AGGREGATE productsIndex "*"
GROUPBY 1 @brand
REDUCE COUNT 0 AS products
REDUCE AVG 1 @price AS averagePrice
SORTBY 2 @products DESC
Als u data opslaat in gewone hashes in plaats van JSON, kunt u ON HASH en standaard veldnamen in uw schema gebruiken.
Voorbeeld: Gebruik met Node.js
import { createClient, SCHEMA_FIELD_TYPE } from 'redis';
const client = createClient({ url: process.env.STACKHERO_REDIS_URL_TLS });
await client.connect();
// Maak de index aan bij het opstarten
try {
await client.ft.create(
'productsIndex',
{
'$.name': { type: SCHEMA_FIELD_TYPE.TEXT, AS: 'name' },
'$.brand': { type: SCHEMA_FIELD_TYPE.TAG, AS: 'brand' },
'$.price': { type: SCHEMA_FIELD_TYPE.NUMERIC, AS: 'price', SORTABLE: true }
},
{ ON: 'JSON', PREFIX: 'product:' }
);
}
catch (error) {
if (!error.message.includes('Index already exists')) {
throw error;
}
}
await client.json.set('product:1', '$', {
name: 'Espresso machine',
brand: 'Bianca',
price: 459
});
const results = await client.ft.search('productsIndex', '@name:(espresso) @price:[0 500]');
console.log(results.total, results.documents);
await client.quit();
Voorbeeld: Gebruik met Python
import os
import redis
from redis.commands.search.field import TextField, TagField, NumericField
from redis.commands.search.index_definition import IndexDefinition, IndexType
from redis.commands.search.query import Query
r = redis.from_url(os.environ['STACKHERO_REDIS_URL_TLS'], decode_responses=True)
# Maak de index aan bij het opstarten
try:
r.ft('productsIndex').create_index(
(
TextField('$.name', as_name='name'),
TagField('$.brand', as_name='brand'),
NumericField('$.price', as_name='price', sortable=True),
),
definition=IndexDefinition(prefix=['product:'], index_type=IndexType.JSON),
)
except redis.ResponseError as error:
if 'Index already exists' not in str(error):
raise
r.json().set('product:1', '$', {
'name': 'Espresso machine',
'brand': 'Bianca',
'price': 459,
})
results = r.ft('productsIndex').search(Query('@name:(espresso) @price:[0 500]'))
print(results.total, results.docs)
Goed om te weten
- Search-indexen werken alleen op database 0.
FT.CREATEgeeft een foutmelding op elke andere database. Als uw applicatie meerdere logische databases gebruikt, bewaar indexeerbare data op database 0, of gebruik key-prefixen om datasets te scheiden. - Indexen gebruiken het geheugen van uw pakket, net als uw data. Grote tekst- of vectorindexen kunnen aanzienlijk zijn, dus monitor
used_memoryin uw Prometheus-metrics nadat u ze heeft aangemaakt. - Het bouwen van een index op bestaande sleutels gebeurt op de achtergrond. Direct na
FT.CREATEkunnen zoekopdrachten tijdelijk onvolledige resultaten opleveren. U kunt de voortgang van het indexeren volgen metFT.INFO productsIndex. - Alle module-commando's zijn volledig beschikbaar. Elk commando van elke ingeschakelde module is direct te gebruiken in uw service.
Wilt u meer weten over vector similarity, semantisch zoeken of retrieval-augmented generation? Bekijk dan de vector search gids.