Rechercher des dispositions Légifrance dans le contenu des articles
Trouver, dater, filtrer et vérifier des articles Légifrance à partir de leur contenu avec la recherche plein texte PostgreSQL.
Contenu de la recette
Cette recette est indexée par Moulineuse et peut servir de point de départ pour vos explorations SQL, Typesense ou scripts agents.
Utiliser cette recette lorsqu’une demande porte sur le contenu d’une disposition : par exemple « quels articles parlent de continuité écologique ? », « que prévoit le code du travail sur le temps de pause ? » ou « quelles dispositions étaient applicables à cette date ? ».
La recherche s’effectue avec query_sql, en sélectionnant le schéma tisseuse et la projection tisseuse.legifrance_article_search. Cette projection contient une ligne par version d’article Légifrance, un vecteur de recherche français déjà indexé, les dates de vigueur et les métadonnées du texte parent. Ne pas refaire une recherche ILIKE sur le JSONB brut de legifrance.article pour un besoin thématique : elle serait moins efficace et contournerait l’index plein texte.
Cette recette complète :
- Choisir la bonne méthode pour interroger Légifrance ;
- Rechercher efficacement dans Légifrance avec SQL et Typesense ;
- Retrouver précisément un article de code en vigueur.
1. Choisir la bonne voie de recherche
| Demande | Méthode à privilégier |
|---|---|
| Notion, expression ou thème dans le contenu des articles | Cette recette et tisseuse.legifrance_article_search. |
| Numéro de loi, décret, NOR, ELI ou identifiant Légifrance précis | Requête SQL exacte dans les tables legifrance ; ne pas utiliser une recherche par mots-clés à la place. |
| Numéro d’article et code connus | Recherche exacte de l’article, puis contrôle de la version applicable. |
| Titre imprécis, autocomplétion, faute de frappe ou recherche transversale entre corpus | search_legal_texts / Typesense, puis SQL de vérification. |
La recherche plein texte produit des candidats. Avant de formuler une réponse juridique, contrôler l’article, son texte parent, sa période de vigueur et le contexte demandé.
2. Recherche de base à une date donnée
Passer le texte recherché et la date d’application dans params. Si l’utilisateur ne donne pas de date, utiliser la date du jour et l’indiquer dans la réponse.
WITH params AS (
SELECT
websearch_to_tsquery('french', $1) AS query,
$2::date AS applicable_on
)
SELECT
article.id,
article.article_number,
article.texte_title,
article.texte_nature,
article.texte_cid,
article.date_debut,
article.date_fin,
article.temporal_status,
ts_headline(
'french',
article.content,
params.query,
'StartSel=<mark>, StopSel=</mark>, MaxWords=35, MinWords=15'
) AS excerpt,
ts_rank_cd(
ARRAY[0.05, 0.1, 0.4, 1.0],
article.text_search,
params.query,
32
) AS score
FROM tisseuse.legifrance_article_search AS article
CROSS JOIN params
WHERE article.text_search @@ params.query
AND article.temporal_status IN ('dated', 'open_ended')
AND (article.date_debut IS NULL OR article.date_debut <= params.applicable_on)
AND (article.date_fin IS NULL OR article.date_fin > params.applicable_on)
ORDER BY score DESC, article.id
LIMIT 20;
Exemple d’arguments query_sql :
{
"schema": "tisseuse",
"query": "[requête ci-dessus]",
"params": ["temps de pause", "2026-08-10"]
}
Le vecteur pondère davantage le numéro et le titre de l’article que le contenu, et le contenu davantage que les notes. Le score sert à ordonner les candidats, pas à prouver qu’un résultat est juridiquement plus important qu’un autre.
date_debut reprend la date source lorsqu’elle est exploitable. Pour les sentinelles Légifrance (2222-02-22 et 2999-01-01), la projection applique le repli getArticleDateDebut déjà utilisé par Tisseuse afin de conserver un repère de création ou de signature quand il est disponible. date_fin reste la borne source.
temporal_status rend cette interprétation explicite : dated désigne une période source bornée, open_ended une borne de fin source à 2999-01-01 avec un début réel, never_effective un article dont les deux bornes non sentinelles vérifient date_fin ≤ date_debut, et unknown les métadonnées qui ne suffisent pas à prouver une période applicable. Les requêtes de droit applicable ne retiennent que dated et open_ended.
Les articles never_effective et unknown restent dans la projection pour l’historique, les contrôles et la provenance, mais une recherche sans filtre temporel doit les présenter comme tels et non comme le droit applicable. Une borne de fin absente ou sentinelle n’est pas transformée en période de vigueur supposée.
3. Restreindre au bon texte ou à la bonne nature
Quand l’utilisateur sait déjà qu’il cherche dans un code, une loi ou un arrêté, filtrer les résultats. Cela réduit les faux positifs et facilite la vérification.
WITH params AS (
SELECT
websearch_to_tsquery('french', $1) AS query,
$2::date AS applicable_on,
$3::text AS texte_cid
)
SELECT
article.id,
article.article_number,
article.texte_title,
article.date_debut,
article.date_fin,
article.temporal_status,
ts_rank_cd(article.text_search, params.query) AS score
FROM tisseuse.legifrance_article_search AS article
CROSS JOIN params
WHERE article.text_search @@ params.query
AND article.temporal_status IN ('dated', 'open_ended')
AND (article.date_debut IS NULL OR article.date_debut <= params.applicable_on)
AND (article.date_fin IS NULL OR article.date_fin > params.applicable_on)
AND article.texte_cid = params.texte_cid
ORDER BY score DESC, article.id
LIMIT 20;
Pour filtrer par nature, ajouter par exemple :
AND article.texte_nature = 'CODE'
Ne pas déduire un code à partir du seul numéro d’article : un même numéro peut exister dans plusieurs textes. Rechercher d’abord le texte parent ou demander une précision lorsque le code est ambigu.
4. Syntaxe de la recherche
websearch_to_tsquery('french', ...) accepte une syntaxe destinée à une recherche web :
temps pauserecherche les deux notions ;"temps de pause"recherche l’expression ;temps OR reposaccepte l’une des deux notions ;temps -reposexclutrepos.
La normalisation française aide avec les formes grammaticales. Elle ne fournit pas, à elle seule, une correction fiable des fautes, une recherche par préfixe ou un dictionnaire complet de synonymes. Pour ces besoins, utiliser Typesense comme complément ou expliciter la limite de la recherche.
5. Vérifier un candidat avant de répondre
Après avoir sélectionné un ou plusieurs candidats, récupérer le contenu et les métadonnées nécessaires, puis vérifier le texte source si une formulation exacte est importante.
SELECT
article.id,
article.article_number,
article.texte_title,
article.texte_nature,
article.texte_cid,
article.date_debut,
article.date_fin,
article.temporal_status,
article.content,
article.nota
FROM tisseuse.legifrance_article_search AS article
WHERE article.id = $1;
Contrôler au minimum :
- la référence lisible de l’article ;
- le titre et la nature du texte parent ;
- la date demandée et la période de vigueur retournée ;
- le passage réellement pertinent, sans se limiter à l’extrait ;
- les versions ou dispositions voisines lorsque le contexte modifie le sens.
Pour un utilisateur final, fournir le chemin de consultation :
https://www.tricoteuses.fr/legifrance/articles/{id}
6. Limites à expliquer
Ne pas présenter le résultat comme un conseil juridique opposable ni comme une recherche exhaustive. Signaler notamment que :
- une formulation différente ou un synonyme peut ne pas être retrouvé ;
- la date d’application est déterminante et doit être confirmée lorsqu’elle est incertaine ;
- une réponse complète peut nécessiter les textes modificateurs, la jurisprudence, la doctrine, les circulaires, les conventions collectives ou les faits du dossier ;
- les données Tricoteuses peuvent être en retard sur la source officielle.
7. Requêtes à éviter
Éviter les requêtes qui recherchent librement dans le JSONB de toute la table source :
-- À ne pas utiliser pour une recherche thématique large.
SELECT id
FROM legifrance.article
WHERE data->'BLOC_TEXTUEL'->>'CONTENU' ILIKE '%temps de pause%';
Éviter aussi SELECT *, les jointures sur tout le corpus avant filtrage et les réponses fondées sur le premier score sans contrôle de la date ni du texte parent.
Recettes liées
Poursuivez l'exploration avec des recettes proches : celles citées par cette page wiki et celles qui la référencent.
Recettes citées
Recettes vers lesquelles cette page pointe directement.
Guide de décision pour exploiter Légifrance dans canutes : recherche plein texte, SQL structuré, versions par date, Journal officiel et limites de fiabilité.
Stratégie rapide pour choisir entre recherche dans le contenu des articles, SQL exact et Typesense, sans scans JSONB coûteux.
Méthode SQL Légifrance pour partir d'une référence utilisateur d'article de code, lever les ambiguïtés, gérer les versions et extraire le contenu applicable à une date.
Recettes qui citent celle-ci
Recettes qui renvoient vers cette page depuis leur propre contenu.
Trouver des textes juridiques, des articles, des codes, des lois et des dossiers législatifs via SQL, PostgreSQL plein texte et Typesense.
Méthode pour rechercher un thème ou une expression dans un code donné, avec recherche plein texte indexée, date de vigueur, section, contexte et vérification prudente des articles pertinents.
Partir de faits sans référence juridique — y compris la question « quel texte prévoit les recours contre un refus de la mairie ? » — rechercher quelques dispositions candidates dans Légifrance, puis vérifier leur texte, parent, version, conditions et exceptions avant de les présenter comme fondements.
À propos de ces recettes
Les recettes Moulineuse documentent des requêtes et des méthodes réutilisables pour analyser les données juridiques et parlementaires avec les outils Tricoteuses. Elles servent aussi directement au serveur MCP Moulineuse pour guider les usages et les extractions possibles.
Voir le serveur MCP Moulineuse