Valkey: Paieška ir JSON
Saugojimas ir užklausos su JSON dokumentais naudojant Valkey paieškos modulį
👋 Sveiki atvykę į Stackhero dokumentaciją!
Stackhero siūlo paruoštą naudoti Valkey cloud sprendimą, kuris suteikia daugybę privalumų, įskaitant:
- Įtrauktą
Valkey Adminweb UI.- Neribotas žinučių dydis ir perdavimas.
- Paprasti atnaujinimai vienu paspaudimu.
- Optimali veikla ir stipri saugumo apsauga, užtikrinama naudojant privačią, dedikuotą infrastruktūrą.
Taupykite laiką ir supaprastinkite savo darbą: išbandyti Stackhero Valkey cloud hosting sprendimą užtrunka tik 5 minutes!
Jūsų Valkey instancija Stackhero platformoje apima pagrindinius modulius, kuriuos palaiko Valkey projektas. Šie moduliai išplečia Valkey funkcionalumą toli už paprasto kešavimo ribų: galite saugoti natyvius JSON dokumentus, indeksuoti savo duomenis ir vykdyti žymų, skaitines, tekstines bei vektorines užklausas – visa tai be atskiros duomenų bazės valdymo.
Yra trys moduliai, visi įtraukti į jūsų planą ir licencijuojami pagal tą pačią liberalią BSD 3-Clause licenciją kaip ir Valkey:
- JSON (
JSON.*komandos): Saugojimas ir atnaujinimas struktūruotų JSON dokumentų su JSONPath palaikymu. Galite tiesiogiai skaityti ar keisti atskirus laukus, todėl smulkiems pakeitimams nereikia perrašyti viso dokumento. - Search (
FT.*komandos): Antrinis indeksavimas, žymų, skaitinės, pilno teksto ir vektorinės panašumo paieškos užklausos. - Bloom (
BF.*komandos): Naudokite Bloom filtrus efektyviam klausimui „ar jau esu tai matęs?“ dideliuose duomenų rinkiniuose, sunaudojant minimaliai atminties.
Modulių įjungimas
Pagal numatymą moduliai yra išjungti, todėl jūsų esama paslauga išlaiko dabartinį elgesį, kol jų neįjungsite.
- Atidarykite savo paslaugą Stackhero valdymo skydelyje.
- Eikite į paslaugos konfigūraciją.
- Moduliai skiltyje pasirinkite norimus įjungti modulius.
- Išsaugokite pakeitimus.
Valkey bus paleistas iš naujo, kad įkeltų pasirinktus modulius. Tai paprastai užtrunka tik kelias sekundes.
Jei esate išsaugoję duomenis naudodami modulį (pvz., JSON dokumentą ar Bloom filtrą), palikite tą modulį įjungtą. Valkey negali nuskaityti tų duomenų be modulio, kuris juos sukūrė. Išjungus modulį, paslauga negalės sėkmingai persikrauti.
Bet kuriuo metu galite patikrinti, kurie moduliai šiuo metu įkelti:
valkey-cli -u "rediss://default:<yourPassword>@<XXXXXX>.stackhero-network.com:<PORT_TLS>" MODULE LIST
JSON dokumentų saugojimas
Galite natūraliai saugoti struktūruotus dokumentus kaip JSON, jų neserializuodami į eilutes:
JSON.SET product:1 $ '{"name":"Espresso machine","brand":"Bianca","price":459,"stock":12}'
Vieno lauko nuskaitymas ar atnaujinimas yra greitas, atominis ir vykdomas serverio pusėje:
JSON.GET product:1 $.price
# "[459]"
JSON.NUMINCRBY product:1 $.stock -1
# "[11]"
Šis metodas pašalina poreikį kiekvienam atnaujinimui jūsų aplikacijoje gauti ir išparsinti visą dokumentą. Pavyzdžiui, atsargų skaitiklio sumažinimas tampa viena atomine operacija. Nebelieka lenktyniavimo sąlygų ar papildomo kodo.
JSON.* komandų rinkinys atitinka RedisJSON API, todėl dauguma Valkey ir Redis klientų veikia be pakeitimų.
Indeksavimas ir paieška
Sukurkite indeksą vieną kartą, ir Valkey jį palaikys atnaujintą visiems raktams, atitinkantiems jūsų prefiksą, net ir tiems, kurie buvo sukurti prieš indeksą:
FT.CREATE productsIndex
ON HASH
PREFIX 1 product:
SCHEMA
name TEXT
brand TAG
price NUMERIC
Galite užklausti indeksuotus duomenis naudodami išraiškingas paieškos komandas:
# Tikslus žymos atitikimas
FT.SEARCH productsIndex "@brand:{Bianca}"
# Skaitinė riba
FT.SEARCH productsIndex "@price:[0 500]"
# Kombinuota užklausa
FT.SEARCH productsIndex "@brand:{Bianca} @price:[0 500]"
# Pilno teksto paieška pagal pavadinimą
FT.SEARCH productsIndex "espresso"
Taip pat galite vykdyti agregacijas tame pačiame indekse su FT.AGGREGATE. Komanda FT.INFO leidžia patikrinti indekso būseną, įskaitant fono indeksavimo užduočių progresą.
JSON dokumentai taip pat gali būti indeksuojami. Kai JSON modulis įjungtas, galite naudoti ON JSON ir JSONPath išraiškas savo schemoje.
Pavyzdys: Valkey paieškos naudojimas Node.js
Kadangi Valkey naudoja tą pačią protokolo specifikaciją kaip Redis, bet kuris Redis klientas yra suderinamas. Šį pavyzdį galite naudoti su oficialiu node-redis klientu:
import { createClient, SCHEMA_FIELD_TYPE } from 'redis';
const client = createClient({ url: process.env.STACKHERO_VALKEY_URL_TLS });
await client.connect();
// Sukurkite indeksą vieną kartą paleidimo metu
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();
Pavyzdys: Valkey paieškos naudojimas Python
Galite naudoti redis-py klientą, kad pasiektumėte Valkey paieškos funkcijas:
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)
# Sukurkite indeksą vieną kartą paleidimo metu
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)
Svarbu žinoti
- Paieškos modulis siūlo tikslinį komandų rinkinį:
FT.CREATE,FT.SEARCH,FT.AGGREGATE,FT.INFO,FT.DROPINDEXirFT._LIST. Šios komandos efektyviai apima žymų, skaitines, tekstines ir vektorines užklausas. Jei jūsų aplikacijai reikia pažangių pilno teksto funkcijų (pvz., rašybos tikrinimo, sinonimų ar pasiūlymų žodynų), Redis užklausų variklis siūlo daugiau galimybių. - Indeksai yra priskirti konkrečiai duomenų bazei ir veikia kiekvienoje bazėje. Pavyzdžiui, indeksas sukurtas 3-ioje duomenų bazėje bus matomas ir užklausiams tik iš 3-ios duomenų bazės. Tai funkcionalumas, kuriuo Valkey pranoksta Redis duomenų bazės pasirinkimą, kuris palaiko indeksavimą tik 0-oje duomenų bazėje.
- Indeksai naudoja jūsų plano atmintį, kaip ir jūsų duomenys. Po indekso sukūrimo galite stebėti
used_memorysavo Prometheus metrikose. - Egzistuojančių raktų indeksavimas vyksta fone. Iškart po
FT.CREATEpaleidimo paieškos rezultatai gali būti nepilni kelias sekundes, kol indeksas bus pilnai sukurtas. - Visos modulio komandos yra įjungtos. Kiekviena kiekvieno modulio komanda yra prieinama jūsų paslaugoje be jokių apribojimų.
Jei norite išbandyti vektorinę paiešką, semantinę paiešką ar retrieval-augmented generation, skaitykite vektorinės paieškos vadovą.