Passer au contenu principal

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.

Comparatif

FonctionnalitéService externeCaractéristiques
whereFullTextNonIndex full text natif de MariaDB / MySQL / PostgreSQL
whereVectorSimilarToNon (PostgreSQL + pgvector)Similarité sémantique. Nécessite l’AI SDK
RerankingFournisseur IARe-classe un ensemble de résultats
Laravel ScoutNon (moteur database) / au choixSynchronisation 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.
Full text : MariaDB, MySQL, PostgreSQL.

Ajouter l’index

Créez l’index dans la migration.
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.
$table->fullText('body')->language('english');
Voir Migrations pour plus de détails.
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.

Exécuter une requête

Avec whereFullText, Laravel génère le SQL approprié (MATCH(...) AGAINST(...) sous MySQL, to_tsvector(...) @@ plainto_tsquery(...) sous Postgres).
$articles = Article::whereFullText('body', 'web developer')->get();
Pour un index composé :
$articles = Article::whereFullText(
    ['title', 'body'], 'web developer'
)->get();
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.
orWhereFullText ajoute une condition OR. Voir la documentation 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.
Nécessite le Laravel AI SDK. Supporte PostgreSQL (extension pgvector) et MongoDB (via le package MongoDB). Toutes les bases Postgres de Laravel Cloud sont pré-équipées de pgvector.

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.
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).
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.

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.
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.
protected function casts(): array
{
    return [
        'embedding' => 'array',
    ];
}
Voir 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.
$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.
$documents = Document::query()
    ->whereVectorSimilarTo('embedding', 'best wineries in Napa Valley')
    ->limit(10)
    ->get();
Pour un contrôle fin : whereVectorDistanceLessThan, selectVectorDistance, orderByVectorDistance. Voir Query Builder et 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.
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.
$articles = Article::all()
    ->rerank('body', 'Laravel tutorials');
Voir la documentation AI SDK.

Laravel Scout

Les approches précédentes s’appuient sur des méthodes du Query Builder. Laravel 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

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,
        ];
    }
}
AttributStratégie
SearchUsingFullTextIndex full text (MATCH...AGAINST / to_tsvector)
SearchUsingPrefixPréfixe (example%)
AucunJoker avant/après (%example%)
Les colonnes marquées SearchUsingFullText doivent avoir un index full text au préalable.
Recherche via search. Sous PostgreSQL, le moteur database trie aussi par pertinence.
$articles = Article::search('Laravel')->get();

Moteurs tiers

Scout supporte Algolia, Meilisearch, Typesense — 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.
La plupart des applications n’ont pas besoin d’un moteur externe. Les approches présentées ici couvrent la majorité des cas.
Voir Laravel 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.
$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.
$documents = Document::query()
    ->where('team_id', $user->team_id)
    ->whereVectorSimilarTo('embedding', $request->input('query'))
    ->limit(10)
    ->get();

Pages associées

Laravel Scout

Synchronisation automatique d’index via le trait Searchable.

Laravel AI SDK

Configurez le SDK IA pour embeddings et reranking.

Query Builder

Détail de whereFullText, whereVectorSimilarTo, etc.

Migrations

Création d’index full text et de colonnes vector.
Dernière modification le 13 juillet 2026