# Indexen

Resource-indexen aanzetten, gebruiken en opnieuw opbouwen.

## Indexen

Met indexen vind je records snel op een veldwaarde zonder de hele resource te doorzoeken. Zo zet je gewoonlijk een slug uit een URL om naar de UUID van een record.

### Indexen aanzetten

Voeg aan de `.meta` een lijst `index` toe met de namen van de velden die geïndexeerd moeten worden:

```json
{
  "fields": {
    "title": { "name": "Title", "type": "text", "required": true },
    "title_slug": { "name": "URL slug", "type": "slug", "source": "title" }
  },
  "index": ["title_slug"]
}
```

Elke keer dat een record wordt geschreven (`data_create` / `data_update`), wordt de index automatisch bijgewerkt.

### Hoe indexen worden opgeslagen

Voor elk geïndexeerd veld maakt Nimbly een leeg bestand op:

```
ext/data/<resource>/.index/<field_name>/<md5(field_value)>/<record_uuid>
```

Een artikel met `title_slug = "my-article"` en `uuid = "abc123"` maakt bijvoorbeeld:

```
ext/data/articles/.index/title_slug/1a79a4d60de6718e8e5b326e338ae533/abc123
```

Het bestand is leeg; dat het bestaat, is de indexregel. Doordat indexen onder `.index/` staan, blijven ze gescheiden van de recordbestanden en worden ze vanzelf overgeslagen bij het doorlopen van mappen (die items met een punt aan het begin overslaan).

### Met splitdir

Staat ook `splitdir: true` aan, dan volgen de indexmappen dezelfde splitsing in twee niveaus:

```
ext/data/<resource>/.index/<field_name>/<aa>/<bb>/<md5(value)>/<record_uuid>
```

De datalibrary regelt dit onzichtbaar: dezelfde API, of `splitdir` nu aan staat of niet.

### Een record opzoeken op slug (patroon voor route.inc)

```php
<?php

$parts = router_match(__FILE__);
if ($parts === false || count($parts) !== 1) return;

$slug = $parts[0];
load_library('data');
load_library('util');

$records = data_read_index('articles', 'title_slug', md5_uuid($slug));
if (empty($records)) return;

$record = reset($records);
set_variable_dot('record', $record);
router_accept();
```

`data_read_index($resource, $index_name, $index_uuid)` geeft een associatieve array `uuid => record` van alle records met de geïndexeerde waarde. Bij het opzoeken van een slug is dat altijd één record.

### Indexen opnieuw opbouwen

Voeg je `index` toe aan de `.meta` van een bestaande resource, dan hebben de bestaande records nog geen indexregels. Bouw ze opnieuw op met:

```bash
php core/cli/nimbly.php index:rebuild
# prompts: lists all indexed resources and asks you to choose

php core/cli/nimbly.php index:rebuild articles
# direct: reindexes the 'articles' resource immediately
```

Het commando kun je veilig vaker draaien. `reindex` bestaat nog als oudere naam, maar gebruik in nieuwe documentatie en scripts `index:rebuild`.

## `index:rebuild`
Bouwt de indexregels van een geïndexeerde resource opnieuw op. Gebruik dit nadat je `index` aan de `.meta` van een bestaande resource hebt toegevoegd, of nadat je records buiten de gewone API om hebt geïmporteerd.

```bash
php core/cli/nimbly.php index:rebuild             # interactive: lists indexed resources, prompts for choice
php core/cli/nimbly.php index:rebuild articles    # direct: reindex the 'articles' resource
```

Het commando loopt alle records van de resource langs en maakt ontbrekende indexbestanden. Je kunt het veilig vaker draaien; bestaande regels blijven onaangeroerd.
