
# الفهارس

تُخزَّن الفهارس `DocStore` بجوار المجموعة ضمن `.storh/indexes`. وهي ملفات عادية مشتقة بالكامل من السجلات، ويمكن إعادة بنائها في أي وقت. يمكنك تعريفها بأسلوب متسلسل أو عبر [المخطط](https://storh.inline0.dev/ar/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` فيما عدا ذلك.
