
# Ευρετήρια

Τα ευρετήρια `DocStore` αποθηκεύονται δίπλα στη συλλογή, στον κατάλογο `.storh/indexes`. Είναι συνηθισμένα αρχεία, παράγονται αποκλειστικά από τις εγγραφές και μπορούν να αναδημιουργηθούν ανά πάσα στιγμή. Δηλώστε τα με αλυσίδα μεθόδων ή μέσω ενός [σχήματος](https://storh.inline0.dev/el/docs/schema):

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

Τύποι ευρετηρίων:

- ευρετήρια ισότητας για πεδία όπως `kind` ή `status`: ένα αρχείο ανά διακριτή τιμή, ώστε μια σημειακή αναζήτηση να διαβάζει μόνο το αρχείο της αντίστοιχης τιμής
- ευρετήρια μοναδικότητας για πεδία όπως `slug`: η μοναδικότητα επιβάλλεται κατά την εγγραφή και μια διπλότυπη τιμή προκαλεί αποτυχία του `put()` πριν από οποιαδήποτε εγγραφή
- ευρετήρια εύρους για βαθμωτές τιμές: ταξινομημένο αρχείο με αραιά σημεία ελέγχου αναζήτησης, που εξυπηρετεί τα `gt`, `gte`, `lt`, `lte`, `between` και `prefix`

Τα ευρετήρια εύρους μπορούν επίσης να απαντούν σε `orderBy` για το ίδιο πεδίο με `limit` απευθείας από τη σειρά του ευρετηρίου, αύξουσα ή φθίνουσα, χωρίς να δημιουργούν και να ταξινομούν ολόκληρο το αποτέλεσμα.

Όταν ένα ερώτημα συνδυάζει δύο συνθήκες `eq` σε πεδία με ευρετήρια ισότητας που δεν επιβάλλουν μοναδικότητα, το storh μπορεί να χρησιμοποιήσει αυτόματα έναν σύνθετο κάδο για το συγκεκριμένο ζεύγος πεδίων. Έτσι τα επιλεκτικά φίλτρα δύο πεδίων παραμένουν γρήγορα, χωρίς να απαιτείται δήλωση άλλου ευρετηρίου.

## Συνέπεια και επιδιόρθωση

Οι εγγραφές στα ευρετήρια ενημερώνονται μετά την ατομική αντικατάσταση του αρχείου εγγραφής, υπό το κλείδωμα εγγραφής της συλλογής, ώστε οι εγγραφές και τα ευρετήρια να ενημερώνονται μαζί. Το `verify()` συγκρίνει κάθε ευρετήριο με πλήρη σάρωση εγγραφών και αναφέρει αποκλίσεις· το `reindex()` αναδημιουργεί κάθε διαμορφωμένο ευρετήριο από τα αρχεία εγγραφών· το `repair()` θέτει σε καραντίνα τις κατεστραμμένες εγγραφές και έπειτα αναδημιουργεί τα ευρετήρια.

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

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

Το `explain()` επιστρέφει `index_scan` όταν ο σχεδιαστής ερωτημάτων μπορεί να χρησιμοποιήσει ένα διαμορφωμένο ευρετήριο και `full_scan` διαφορετικά.
