Recherche : trier les résultats par pertinence (titre exact → texte exact → approximatif) #51

Closed
opened 2026-05-13 21:14:11 +00:00 by cedricAbonnel · 0 comments
Owner

Contexte

Actuellement, la recherche (SearchEngine.php) classe les résultats par un score pondéré unique (titre × 6, catégorie × 3, contenu × 1). Un résultat avec une correspondance floue dans le titre peut ainsi devancer un résultat avec les mots exacts dans le corps du texte.

Exemple visible sur /search?q=home+assistant.

Comportement souhaité

Trier les résultats en trois niveaux prioritaires, dans cet ordre :

  1. Correspondance exacte dans le titre — tous les tokens de la requête matchent mot-pour-mot dans le titre
  2. Correspondance exacte dans le texte — tous les tokens matchent mot-pour-mot dans le corps du contenu (mais pas nécessairement dans le titre)
  3. Correspondance approximative — sous-chaînes ou similarité trigramme (comportement actuel pour les fautes de frappe, pluriels, etc.)

À l'intérieur de chaque niveau, le tri secondaire reste le score actuel (décroissant).

Implémentation suggérée

Dans SearchEngine::search(), calculer un rang de niveau (0, 1, 2) en plus du score, puis trier d'abord sur ce rang, puis sur le score :

usort($results, function ($a, $b) {
    if ($a['tier'] !== $b['tier']) {
        return $a['tier'] <=> $b['tier']; // tier 0 = meilleur
    }
    return $b['score'] <=> $a['score'];
});

La méthode tokenScore() renvoie déjà 1.0 pour une correspondance exacte — il suffit de vérifier que tous les tokens obtiennent 1.0 sur le champ titre (resp. contenu) pour classer l'article dans le bon niveau.

Fichiers concernés

  • src/SearchEngine.php — logique de scoring et de tri
## Contexte Actuellement, la recherche (`SearchEngine.php`) classe les résultats par un score pondéré unique (titre × 6, catégorie × 3, contenu × 1). Un résultat avec une correspondance floue dans le titre peut ainsi devancer un résultat avec les mots exacts dans le corps du texte. Exemple visible sur [/search?q=home+assistant](https://varlog.a5l.fr/search?q=home+assistant). ## Comportement souhaité Trier les résultats en trois niveaux prioritaires, dans cet ordre : 1. **Correspondance exacte dans le titre** — tous les tokens de la requête matchent mot-pour-mot dans le titre 2. **Correspondance exacte dans le texte** — tous les tokens matchent mot-pour-mot dans le corps du contenu (mais pas nécessairement dans le titre) 3. **Correspondance approximative** — sous-chaînes ou similarité trigramme (comportement actuel pour les fautes de frappe, pluriels, etc.) À l'intérieur de chaque niveau, le tri secondaire reste le score actuel (décroissant). ## Implémentation suggérée Dans `SearchEngine::search()`, calculer un **rang de niveau** (`0`, `1`, `2`) en plus du score, puis trier d'abord sur ce rang, puis sur le score : ```php usort($results, function ($a, $b) { if ($a['tier'] !== $b['tier']) { return $a['tier'] <=> $b['tier']; // tier 0 = meilleur } return $b['score'] <=> $a['score']; }); ``` La méthode `tokenScore()` renvoie déjà `1.0` pour une correspondance exacte — il suffit de vérifier que **tous** les tokens obtiennent `1.0` sur le champ titre (resp. contenu) pour classer l'article dans le bon niveau. ## Fichiers concernés - `src/SearchEngine.php` — logique de scoring et de tri
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cedricAbonnel/varlog#51