
# Indexuri

`DocStore` indexurile sunt stocate lângă colecție, în `.storh/indexes`.
Sunt fișiere obișnuite, derivate integral din înregistrări și pot fi
reconstruite oricând. Declarați-le prin API-ul fluent sau printr-o
[schemă](https://storh.inline0.dev/ro/docs/schema):

```php
$docs->indexes()
    ->field('slug')->unique()
    ->field('kind')
    ->field('publishedAt')->range()
    ->sync();
```

Tipuri de indexuri:

- indexuri de egalitate pentru câmpuri precum `kind` sau `status`: un fișier pentru fiecare valoare distinctă, astfel încât o căutare punctuală citește doar fișierul valorii potrivite
- indexuri unice pentru câmpuri precum `slug`: unicitatea este impusă la scriere, iar o valoare duplicată face ca `put()` să eșueze înainte de a se scrie ceva
- indexuri de interval pentru valori scalare: un fișier sortat cu puncte sparse de salt, care oferă `gt`, `gte`, `lt`, `lte`, `between` și `prefix`

Indexurile de interval pot răspunde și la `orderBy` asupra aceluiași câmp cu un `limit`
direct din ordinea indexului, crescător sau descrescător, fără materializarea și
sortarea întregului rezultat.

Când o interogare combină două predicate `eq` pe câmpuri indexate pentru egalitate, dar ne-unice,
storh poate folosi automat un bucket compus pentru perechea de câmpuri. Astfel, filtrele selective pe două câmpuri rămân rapide fără să fie nevoie de declararea unui alt index.

## Consistență și reparare

Scrierile actualizează intrările indexului după înlocuirea atomică a fișierului de înregistrare,
sub blocarea de scriere a colecției, astfel încât înregistrările și indexurile se modifică împreună.
`verify()` compară fiecare index cu o scanare completă a înregistrărilor și raportează diferențele;
`reindex()` reconstruiește fiecare index configurat din fișierele de înregistrări; `repair()`
pune în carantină înregistrările corupte, apoi reconstruiește indexurile.

```php
$docs->reindex();

$plan = $docs
    ->query()
    ->where('slug')->eq('home')
    ->explain();
```

`explain()` returnează `index_scan` când planificatorul poate folosi un index configurat și `full_scan` în caz contrar.
