> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Recherche

> Vue d'ensemble des fonctionnalités de recherche Laravel : full text, vectorielle, reranking et Laravel Scout, selon vos besoins.

## Introduction

Il existe plusieurs manières d'ajouter la recherche à une application. Laravel fournit des outils intégrés couvrant la correspondance par mots-clés jusqu'à la recherche sémantique via IA, sans dépendance externe.

```mermaid theme={null}
flowchart TD
    Q["Besoin de recherche"]
    Q --> A{"Mot-clé suffit ?"}
    A -->|Oui| B["Full text<br>whereFullText"]
    A -->|Non - sens| C["Vectorielle<br>whereVectorSimilarTo"]
    Q --> D{"Sync auto des modèles ?"}
    D -->|Oui| E["Laravel Scout<br>trait Searchable"]
    Q --> F{"Re-classer avec IA ?"}
    F -->|Oui| G["Reranking<br>AI SDK"]
```

### Comparatif

| Fonctionnalité         | Service externe                  | Caractéristiques                                          |
| ---------------------- | -------------------------------- | --------------------------------------------------------- |
| `whereFullText`        | Non                              | Index full text natif de MariaDB / MySQL / PostgreSQL     |
| `whereVectorSimilarTo` | Non (PostgreSQL + pgvector)      | Similarité sémantique. Nécessite l'AI SDK                 |
| `Reranking`            | Fournisseur IA                   | Re-classe un ensemble de résultats                        |
| Laravel Scout          | Non (moteur database) / au choix | Synchronisation automatique d'index pour modèles Eloquent |

***

## Recherche full text

`LIKE` couvre les recherches simples mais ignore la langue. La recherche full text utilise un index dédié pour prendre en compte les frontières de mots, les variations lexicales et le score de pertinence.

MariaDB, MySQL et PostgreSQL le supportent nativement.

<Warning>
  Full text : MariaDB, MySQL, PostgreSQL.
</Warning>

### Ajouter l'index

Créez l'index dans la migration.

```php theme={null}
Schema::create('articles', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('body');
    $table->timestamps();

    $table->fullText(['title', 'body']); // Index composé
});
```

Sous PostgreSQL, précisez la langue.

```php theme={null}
$table->fullText('body')->language('english');
```

Voir [Migrations](/fr/migrations) pour plus de détails.

<Info>
  **Recherche full text en japonais / autres langues asiatiques**\
  Sous MySQL, la recherche japonaise est délicate. AWS RDS ne supporte que le parser N-gram, sans plugin de segmentation morphologique (MeCab), ce qui limite. Postgres a aussi un support limité pour ces langues. Pour une meilleure précision, envisagez Meilisearch ou Typesense.
</Info>

### Exécuter une requête

Avec `whereFullText`, Laravel génère le SQL approprié (`MATCH(...) AGAINST(...)` sous MySQL, `to_tsvector(...) @@ plainto_tsquery(...)` sous Postgres).

```php theme={null}
$articles = Article::whereFullText('body', 'web developer')->get();
```

Pour un index composé :

```php theme={null}
$articles = Article::whereFullText(
    ['title', 'body'], 'web developer'
)->get();
```

<Info>
  Sous MariaDB/MySQL, les résultats sont automatiquement triés par pertinence. Sous PostgreSQL, `whereFullText` filtre uniquement — utilisez le moteur database de Scout pour un tri automatique.
</Info>

`orWhereFullText` ajoute une condition OR. Voir la [documentation Query Builder](/fr/query-builder).

***

## Recherche sémantique / vectorielle

Le full text dépend des mots-clés. La recherche vectorielle utilise des embeddings IA qui représentent le *sens* du texte sous forme de vecteurs numériques et retrouve des éléments sémantiquement proches.

Exemple : « best wineries in Napa Valley » retrouve un article intitulé « Top Vineyards to Visit », même sans mot en commun.

<Note>
  Nécessite le [Laravel AI SDK](/fr/ai-sdk). Supporte PostgreSQL (extension `pgvector`) et MongoDB (via le package MongoDB). Toutes les bases Postgres de [Laravel Cloud](https://laravel.com/cloud) sont pré-équipées de `pgvector`.
</Note>

### Générer des embeddings

Un embedding est un tableau numérique de haute dimension (des centaines à des milliers). Utilisez la méthode `toEmbeddings` de `Stringable`.

```php theme={null}
use Illuminate\Support\Str;

$embedding = Str::of('Napa Valley has great wine.')->toEmbeddings();
```

Pour plusieurs textes à la fois, la classe `Embeddings` est plus efficace (un seul appel API).

```php theme={null}
use Laravel\Ai\Embeddings;

$response = Embeddings::for([
    'Napa Valley has great wine.',
    'Laravel is a PHP framework.',
])->generate();

$response->embeddings; // [[0.123, 0.456, ...], [0.789, 0.012, ...]]
```

Voir la [documentation AI SDK](/fr/ai-sdk).

### Stocker et indexer

Utilisez une colonne `vector` en migration. Précisez `dimensions` selon votre fournisseur (par ex. `text-embedding-3-small` d'OpenAI : 1 536). `index()` crée un index HNSW pour accélérer.

```php theme={null}
Schema::ensureVectorExtensionExists(); // Active pgvector

Schema::create('documents', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('content');
    $table->vector('embedding', dimensions: 1536)->index();
    $table->timestamps();
});
```

Castez `embedding` en `array` pour la conversion automatique.

```php theme={null}
protected function casts(): array
{
    return [
        'embedding' => 'array',
    ];
}
```

Voir [Migrations](/fr/migrations) pour les détails.

### Recherche par similarité

`whereVectorSimilarTo` compare par similarité cosinus, filtre selon `minSimilarity` (0.0 → 1.0, 1.0 = correspondance exacte) et trie par pertinence.

```php theme={null}
$documents = Document::query()
    ->whereVectorSimilarTo('embedding', $queryEmbedding, minSimilarity: 0.4)
    ->limit(10)
    ->get();
```

En passant une chaîne, Laravel génère lui-même l'embedding : idéal pour une requête utilisateur brute.

```php theme={null}
$documents = Document::query()
    ->whereVectorSimilarTo('embedding', 'best wineries in Napa Valley')
    ->limit(10)
    ->get();
```

Pour un contrôle fin : `whereVectorDistanceLessThan`, `selectVectorDistance`, `orderByVectorDistance`. Voir [Query Builder](/fr/query-builder) et [AI SDK](/fr/ai-sdk).

***

## Reranking

Le reranking utilise un modèle IA pour reclasser des résultats selon la requête. Contrairement à la recherche vectorielle, aucun embedding n'est pré-calculé — s'applique à n'importe quel ensemble de textes.

Pattern efficace : **filtrer** rapidement via full text, puis **reranker** avec l'IA — la rapidité de la base et la précision de l'IA.

```php theme={null}
use Laravel\Ai\Reranking;

$response = Reranking::of([
    'Django is a Python web framework.',
    'Laravel is a PHP web application framework.',
    'React is a JavaScript library for building user interfaces.',
])->rerank('PHP frameworks');

$response->first()->document; // "Laravel is a PHP web application framework."
```

Les collections Laravel exposent une macro `rerank` : indiquez un champ (ou closure) et la requête.

```php theme={null}
$articles = Article::all()
    ->rerank('body', 'Laravel tutorials');
```

Voir la [documentation AI SDK](/fr/ai-sdk).

***

## Laravel Scout

Les approches précédentes s'appuient sur des méthodes du Query Builder. [Laravel Scout](/fr/scout) est différent : ajoutez le trait `Searchable` à un modèle Eloquent, et Scout synchronise l'index automatiquement à la création/mise à jour/suppression.

### Moteur database

Le moteur `database` intégré applique full text + `LIKE` sur la base existante — sans service externe.

Définissez `toSearchableArray` ; personnalisez la stratégie via des attributs PHP.

```php theme={null}
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Attributes\SearchUsingFullText;
use Laravel\Scout\Attributes\SearchUsingPrefix;
use Laravel\Scout\Searchable;

class Article extends Model
{
    use Searchable;

    #[SearchUsingPrefix(['id'])]
    #[SearchUsingFullText(['title', 'body'])]
    public function toSearchableArray(): array
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'body' => $this->body,
        ];
    }
}
```

| Attribut              | Stratégie                                           |
| --------------------- | --------------------------------------------------- |
| `SearchUsingFullText` | Index full text (`MATCH...AGAINST` / `to_tsvector`) |
| `SearchUsingPrefix`   | Préfixe (`example%`)                                |
| Aucun                 | Joker avant/après (`%example%`)                     |

<Warning>
  Les colonnes marquées `SearchUsingFullText` doivent avoir un [index full text](/fr/migrations) au préalable.
</Warning>

Recherche via `search`. Sous PostgreSQL, le moteur database trie aussi par pertinence.

```php theme={null}
$articles = Article::search('Laravel')->get();
```

### Moteurs tiers

Scout supporte [Algolia](https://www.algolia.com/), [Meilisearch](https://www.meilisearch.com), [Typesense](https://typesense.org) — tolérance aux fautes, facettes, géo-recherche, ranking personnalisé.

L'API unifiée facilite la migration ultérieure du moteur database vers un moteur tiers.

<Note>
  La plupart des applications n'ont pas besoin d'un moteur externe. Les approches présentées ici couvrent la majorité des cas.
</Note>

Voir [Laravel Scout](/fr/scout).

***

## Combiner les techniques

Ces approches ne s'excluent pas mutuellement.

### Full text + reranking

Filtrer rapidement via full text, puis reclasser sémantiquement via IA.

```php theme={null}
$articles = Article::query()
    ->whereFullText('body', $request->input('query'))
    ->limit(50)
    ->get()
    ->rerank('body', $request->input('query'), limit: 10);
```

### Vectorielle + filtres classiques

Croisez similarité vectorielle et clauses `where` traditionnelles.

```php theme={null}
$documents = Document::query()
    ->where('team_id', $user->team_id)
    ->whereVectorSimilarTo('embedding', $request->input('query'))
    ->limit(10)
    ->get();
```

***

## Pages associées

<Card title="Laravel Scout" icon="magnifying-glass" href="/fr/scout">
  Synchronisation automatique d'index via le trait Searchable.
</Card>

<Card title="Laravel AI SDK" icon="sparkles" href="/fr/ai-sdk">
  Configurez le SDK IA pour embeddings et reranking.
</Card>

<Card title="Query Builder" icon="database" href="/fr/query-builder">
  Détail de whereFullText, whereVectorSimilarTo, etc.
</Card>

<Card title="Migrations" icon="table" href="/fr/migrations">
  Création d'index full text et de colonnes vector.
</Card>


## Related topics

- [Client de base - Laravel Bluesky](/fr/packages/laravel-bluesky/basic-client.md)
- [MongoDB](/fr/mongodb.md)
- [Mises à jour Laravel — mars 2026](/fr/blog/changelog/202603.md)
- [Laravel et le développement IA](/fr/ai.md)
- [Les nouveautés de Laravel 13](/fr/blog/laravel-13-new-features.md)
