Valkey: Zoeken en JSON

Sla JSON-documenten op en voer zoekopdrachten uit met de Valkey search-module

👋 Welkom bij de Stackhero-documentatie!

Stackhero biedt een kant-en-klare Valkey cloud oplossing met tal van voordelen, waaronder:

  • Valkey Admin webinterface 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 Valkey cloud hosting oplossing van Stackhero uit te proberen!

Uw Valkey-instantie op Stackhero bevat essentiële modules die worden onderhouden door het Valkey-project. Dankzij deze modules is Valkey veel meer dan alleen een cache: u kunt native JSON-documenten opslaan, uw data indexeren en tag-, numerieke, tekst- en vectorzoekopdrachten uitvoeren, allemaal zonder een aparte database te hoeven beheren.

Er zijn drie modules beschikbaar, allemaal inbegrepen in uw abonnement en gelicentieerd onder dezelfde permissieve BSD 3-Clause-licentie als Valkey:

  • JSON (JSON.*-commando's): Sla gestructureerde JSON-documenten op en werk ze bij met ondersteuning voor JSONPath. U kunt individuele velden direct lezen of aanpassen, zodat u nooit het volledige document hoeft te herschrijven voor kleine wijzigingen.
  • Search (FT.*-commando's): Voer secundaire indexering, tag-, numerieke en full-text zoekopdrachten uit, evenals vector similarity search.
  • Bloom (BF.*-commando's): Gebruik Bloom-filters om efficiënt te bepalen of u iets al eerder heeft gezien binnen grote datasets, met minimaal geheugengebruik.

Modules zijn standaard uitgeschakeld, zodat uw bestaande service hetzelfde gedrag behoudt totdat u ze activeert.

  1. Open uw service op het Stackhero dashboard.
  2. Ga naar de serviceconfiguratie.
  3. Selecteer in de sectie Modules de modules die u wilt inschakelen.
  4. Sla uw wijzigingen op.

Valkey wordt opnieuw gestart om de geselecteerde modules te laden. Dit duurt meestal slechts enkele seconden.

Als u data heeft opgeslagen met behulp van een module (zoals een JSON-document of een Bloom-filter), laat die module dan ingeschakeld. Valkey kan deze data niet lezen zonder de module waarmee deze is aangemaakt. Het uitschakelen van de module voorkomt dat uw service succesvol opnieuw kan starten.

U kunt op elk moment controleren welke modules momenteel geladen zijn:

valkey-cli -u "rediss://default:<yourPassword>@<XXXXXX>.stackhero-network.com:<PORT_TLS>" MODULE LIST

U kunt gestructureerde documenten native als JSON opslaan, zonder ze te serialiseren naar strings:

JSON.SET product:1 $ '{"name":"Espresso machine","brand":"Bianca","price":459,"stock":12}'

Het lezen of bijwerken van een enkel veld is snel, atomair en wordt server-side afgehandeld:

JSON.GET product:1 $.price
# "[459]"

JSON.NUMINCRBY product:1 $.stock -1
# "[11]"

Deze aanpak maakt het overbodig om bij elke wijziging het volledige document op te halen en te parsen in uw applicatie. Bijvoorbeeld, het verlagen van een voorraadwaarde is nu een enkele, atomische operatie. Geen racecondities of extra code meer nodig.

De JSON.*-commando's zijn compatibel met de API van RedisJSON, waardoor de meeste Valkey- en Redis-clients zonder aanpassingen werken.

Maak één keer een index aan en Valkey houdt deze automatisch up-to-date voor elke sleutel die overeenkomt met uw prefix, zelfs voor sleutels die al bestonden vóór het aanmaken van de index:

FT.CREATE productsIndex
  ON HASH
  PREFIX 1 product:
  SCHEMA
    name TEXT
    brand TAG
    price NUMERIC

U kunt uw geïndexeerde data opvragen met krachtige zoekcommando's:

# Exacte tag-match
FT.SEARCH productsIndex "@brand:{Bianca}"

# Numeriek bereik
FT.SEARCH productsIndex "@price:[0 500]"

# Gecombineerde query
FT.SEARCH productsIndex "@brand:{Bianca} @price:[0 500]"

# Full-text zoekopdracht op naam
FT.SEARCH productsIndex "espresso"

U kunt ook aggregaties uitvoeren op dezelfde index met FT.AGGREGATE. Met het commando FT.INFO kunt u de status van de index controleren, inclusief de voortgang van achtergrondindexering.

JSON-documenten zijn ook indexeerbaar. Wanneer de JSON-module is ingeschakeld, kunt u ON JSON en JSONPath-expressies gebruiken in uw schema.

Omdat Valkey hetzelfde protocol gebruikt als Redis, is elke Redis-client compatibel. U kunt dit voorbeeld gebruiken met de officiële node-redis client:

import { createClient, SCHEMA_FIELD_TYPE } from 'redis';

const client = createClient({ url: process.env.STACKHERO_VALKEY_URL_TLS });
await client.connect();

// Maak de index één keer aan bij het opstarten
try {
  await client.ft.create(
    'productsIndex',
    {
      name: SCHEMA_FIELD_TYPE.TEXT,
      brand: SCHEMA_FIELD_TYPE.TAG,
      price: SCHEMA_FIELD_TYPE.NUMERIC
    },
    { ON: 'HASH', PREFIX: 'product:' }
  );
} catch (error) {
  if (!error.message.includes('Index already exists')) {
    throw error;
  }
}

await client.hSet('product:1', { name: 'Espresso machine', brand: 'Bianca', price: '459' });

const results = await client.ft.search('productsIndex', '@brand:{Bianca} @price:[0 500]');
console.log(results.total, results.documents);

await client.quit();

U kunt de redis-py client gebruiken om met de zoekfunctionaliteit van Valkey te werken:

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_VALKEY_URL_TLS'], decode_responses=True)

# Maak de index één keer aan bij het opstarten
try:
    r.ft('productsIndex').create_index(
        (TextField('name'), TagField('brand'), NumericField('price')),
        definition=IndexDefinition(prefix=['product:'], index_type=IndexType.HASH),
    )
except redis.ResponseError as error:
    if 'Index already exists' not in str(error):
        raise

r.hset('product:1', mapping={'name': 'Espresso machine', 'brand': 'Bianca', 'price': 459})

results = r.ft('productsIndex').search(Query('@brand:{Bianca} @price:[0 500]'))
print(results.total, results.docs)
  • De search-module biedt een gericht setje commando's: FT.CREATE, FT.SEARCH, FT.AGGREGATE, FT.INFO, FT.DROPINDEX en FT._LIST. Hiermee voert u efficiënt tag-, numerieke, tekst- en vectorzoekopdrachten uit. Heeft uw applicatie geavanceerdere full-text functionaliteit nodig (zoals spellingcontrole, synoniemen of suggesties), dan biedt de Redis query engine meer mogelijkheden.
  • Indexes zijn per database en werken in elke database. Bijvoorbeeld, een index aangemaakt in database 3 is alleen zichtbaar en te gebruiken vanuit database 3. Dit is een mogelijkheid waarin Valkey verder gaat dan Redis database selection, dat alleen indexering op database 0 ondersteunt.
  • Indexes gebruiken het geheugen van uw abonnement, net als uw data. U kunt used_memory monitoren in uw Prometheus-metrics nadat u een index heeft aangemaakt.
  • Indexeren van bestaande sleutels gebeurt op de achtergrond. Direct na het uitvoeren van FT.CREATE kunnen zoekresultaten enkele seconden onvolledig zijn terwijl de index wordt opgebouwd.
  • Alle modulecommando's zijn ingeschakeld. Elk commando van elke module is beschikbaar op uw service, zonder beperkingen.

Wilt u aan de slag met vector similarity, semantisch zoeken of retrieval-augmented generation? Lees dan de vector search-gids.