
# Indekser

`DocStore`-indekser gemmes ved siden af samlingen under `.storh/indexes`. De er almindelige filer, der udelukkende afledes af posterne, og kan genopbygges når som helst. Deklarér dem med en flydende syntaks eller via et [skema](https://storh.inline0.dev/da/docs/schema):

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

Indekstyper:

- lighedsindekser for felter som `kind` eller `status`: én fil pr. unik værdi, så et punktopslag kun læser den tilsvarende værdifil
- unikhedsindekser for felter som `slug`: håndhæves ved skrivning; en dubletværdi afviser `put()`, før noget skrives
- områdeindekser for skalarværdier: en sorteret fil med sparsomme søgepunkter, der håndterer `gt`, `gte`, `lt`, `lte`, `between` og `prefix`

Områdeindekser kan også besvare `orderBy` på samme felt med en `limit` direkte fra indeksrækkefølgen, stigende eller faldende, uden at materialisere og sortere hele resultatet.

Når en forespørgsel kombinerer to `eq`-betingelser på ikke-unikke lighedsindekserede felter, kan storh bruge en automatisk sammensat bucket for det pågældende feltpar. Det gør selektive filtre på to felter hurtige uden at kræve en ekstra indeksdeklaration.

## Konsistens og reparation

Skrivninger opdaterer indeksindgange, efter at postfilen er udskiftet atomisk og under samlingens skrivelås, så poster og indekser ændres samlet. `verify()` sammenligner hvert indeks med en fuld scanning af posterne og rapporterer afvigelser; `reindex()` genopbygger alle konfigurerede indekser fra postfilerne; `repair()` sætter korrupte poster i karantæne og genopbygger derefter indekserne.

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

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

`explain()` returnerer `index_scan`, når forespørgselsplanlæggeren kan bruge et konfigureret indeks, og `full_scan` ellers.
