
# Indeks

`DocStore` indeks disimpan di samping koleksi dalam `.storh/indexes`. Indeks ini berupa file biasa, sepenuhnya diturunkan dari catatan, dan dapat dibangun ulang kapan saja. Deklarasikan secara fluent atau melalui [skema](https://storh.inline0.dev/id/docs/schema):

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

Jenis indeks:

- indeks kesetaraan untuk kolom seperti `kind` atau `status`: satu file untuk setiap nilai unik, sehingga pencarian langsung hanya membaca file nilai yang cocok
- indeks unik untuk kolom seperti `slug`: diterapkan saat penulisan; nilai duplikat akan menggagalkan `put()` sebelum apa pun ditulis
- indeks rentang untuk nilai skalar: file terurut dengan checkpoint pencarian sparse, yang melayani `gt`, `gte`, `lt`, `lte`, `between`, dan `prefix`

Indeks rentang juga dapat menjawab `orderBy` pada kolom yang sama dengan `limit` langsung dari urutan indeks, menaik atau menurun, tanpa mematerialisasi dan mengurutkan seluruh hasil.

Saat kueri menggabungkan dua kondisi `eq` pada kolom berindeks kesetaraan non-unik, storh dapat menggunakan bucket gabungan otomatis untuk pasangan kolom tersebut. Ini mempercepat filter dua kolom yang selektif tanpa memerlukan deklarasi indeks tambahan.

## Konsistensi dan perbaikan

Penulisan memperbarui entri indeks setelah file catatan diganti secara atomik, di bawah lock tulis koleksi, sehingga catatan dan indeks bergerak bersama. `verify()` membandingkan setiap indeks dengan pemindaian catatan lengkap dan melaporkan ketidaksesuaian; `reindex()` membangun ulang setiap indeks yang dikonfigurasi dari file catatan; `repair()` mengarantina catatan yang rusak lalu membangun ulang indeks.

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

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

`explain()` mengembalikan `index_scan` ketika planner dapat menggunakan indeks yang dikonfigurasi dan `full_scan` jika tidak.
