Chercher des textes juridiques et dossiers (lois, codes, dossiers législatifs)
Trouver des textes juridiques, des codes, des lois et des dossiers législatifs via SQL et Typesense.
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.
La base unique canutes expose les schémas assemblee, legifrance et senat. Utilisez query_sql pour les recherches précises en qualifiant explicitement les tables (legifrance.texte_version, assemblee.documents, etc.), search_legal_texts pour la recherche plein texte juridique courante, et query_typesense pour des recherches Typesense plus génériques. Les textes juridiques sont stockés dans legifrance, les données parlementaires de l'Assemblée dans assemblee, et les données relationnelles du Sénat dans senat.
Important : cette recette couvre les textes, dossiers, documents, scrutins et réunions indexés dans textes_juridiques, mais pas les amendements. Pour les amendements, utilisez les recettes SQL dédiées et PostgreSQL directement.
Pour les réponses destinées à un utilisateur final, préférez retourner une URL de redirection https://www.tricoteuses.fr/redirection/{id} ou https://www.tricoteuses.fr/redirection/{uid} plutôt que l'identifiant brut seul quand la ressource est compatible avec Exploratrice.
1. Rechercher dans les textes Légifrance avec query_sql
Tous les textes officiels proviennent de la table texte_version.
Trouver un code ou une loi par son titre
-- Chercher n'importe quel texte dont le titre contient un mot
SELECT id,
'https://www.tricoteuses.fr/redirection/' || id AS redirect_url,
nature,
data->'META'->'META_SPEC'->'META_TEXTE_VERSION'->>'TITRE' as titre,
data->'META'->'META_SPEC'->'META_TEXTE_CHRONICLE'->>'DATE_TEXTE' as date_texte
FROM legifrance.texte_version
WHERE data->'META'->'META_SPEC'->'META_TEXTE_VERSION'->>'TITRE' ILIKE '%urbanisme%';
-- Chercher uniquement les CODES
SELECT id,
data->'META'->'META_SPEC'->'META_TEXTE_VERSION'->>'TITRE' as titre
FROM legifrance.texte_version
WHERE nature = 'CODE'
AND data->'META'->'META_SPEC'->'META_TEXTE_VERSION'->>'TITRE' ILIKE '%travail%';
Autres filtres Légifrance (nature)
Les valeurs de nature les plus courantes :
CODELOIORDONNANCEARRETEDECRET
-- Rechercher une loi précise par sa date et des mots clés
SELECT id, data->'META'->'META_SPEC'->'META_TEXTE_VERSION'->>'TITRE' as titre
FROM legifrance.texte_version
WHERE nature = 'LOI'
AND data->'META'->'META_SPEC'->'META_TEXTE_CHRONICLE'->>'DATE_TEXTE' LIKE '2016-%'
AND data->'META'->'META_SPEC'->'META_TEXTE_VERSION'->>'TITRE' ILIKE '%travail%';
Rechercher un décret par son numéro
Quand la demande précise qu'il s'agit d'un décret et donne son numéro, par exemple 2023-519, préférez une recherche SQL exacte sur la nature et le numéro plutôt qu'une recherche plein texte approximative.
SELECT id,
'https://www.tricoteuses.fr/redirection/' || id AS redirect_url,
nature,
data->'META'->'META_SPEC'->'META_TEXTE_VERSION'->>'TITREFULL' AS titre,
data->'META'->'META_SPEC'->'META_TEXTE_CHRONICLE'->>'DATE_TEXTE' AS date_texte,
data->'META'->'META_SPEC'->'META_TEXTE_CHRONICLE'->>'DATE_PUBLI' AS date_publi,
data->'META'->'META_SPEC'->'META_TEXTE_CHRONICLE'->>'NOR' AS nor,
data->'META'->'META_SPEC'->'META_TEXTE_CHRONICLE'->>'NUM' AS numero
FROM legifrance.texte_version
WHERE nature = 'DECRET'
AND data->'META'->'META_SPEC'->'META_TEXTE_CHRONICLE'->>'NUM' = '2023-519'
ORDER BY id;
Rechercher un Journal Officiel (JO)
Attention : Les Journaux Officiels ne sont pas dans texte_version, mais dans la table jo.
Terminologie : JORF signifie d'abord Journal officiel de la République française, c'est-à-dire le JO comme publication. Il ne faut pas le confondre avec une "base JORF" au sens technique/SQL, qui désigne une base contenant tout ce qui a été publié au Journal officiel.
Piège courant : ne prenez pas simplement le JO avec la date la plus grande. La table jo contient aussi des publications comme JOCE, et certaines lignes peuvent avoir des dates techniques très lointaines (par exemple 2999-01-01). Pour retrouver le dernier Journal officiel de la République française utile pour un utilisateur, filtrez les vrais JORF et excluez les publications futures avec DATE_PUBLI <= today.
SELECT id,
data->'META'->'META_SPEC'->'META_CONTENEUR'->>'TITRE' AS titre,
data->'META'->'META_SPEC'->'META_CONTENEUR'->>'DATE_PUBLI' AS date
FROM legifrance.jo
WHERE data->'META'->'META_SPEC'->'META_CONTENEUR'->>'TITRE' ILIKE '%2024%';
Récupérer le dernier JORF publié
WITH params AS (
SELECT CURRENT_DATE::text AS today
)
SELECT id,
data->'META'->'META_SPEC'->'META_CONTENEUR'->>'TITRE' AS titre,
data->'META'->'META_SPEC'->'META_CONTENEUR'->>'DATE_PUBLI' AS date_publi,
data->'META'->'META_SPEC'->'META_CONTENEUR'->>'NUM' AS numero
FROM legifrance.jo, params
WHERE data->'META'->'META_COMMUN'->>'ORIGINE' = 'JORF'
AND data->'META'->'META_SPEC'->'META_CONTENEUR'->>'TITRE' LIKE 'JORF %'
AND data->'META'->'META_SPEC'->'META_CONTENEUR'->>'DATE_PUBLI' <= params.today
ORDER BY data->'META'->'META_SPEC'->'META_CONTENEUR'->>'DATE_PUBLI' DESC NULLS LAST,
id DESC
LIMIT 1;
Cette méthode est meilleure qu'un simple tri sur DATE_PUBLI :
- elle cible les JO nationaux (
JORF) plutôt que d'autres publications, - elle évite les publications futures ou dates techniques parasites,
- elle ajoute un tri stable avec
id DESC.
Récupérer le sommaire du dernier JORF
WITH params AS (
SELECT CURRENT_DATE::text AS today
), latest_jorf AS (
SELECT id, data
FROM legifrance.jo, params
WHERE data->'META'->'META_COMMUN'->>'ORIGINE' = 'JORF'
AND data->'META'->'META_SPEC'->'META_CONTENEUR'->>'TITRE' LIKE 'JORF %'
AND data->'META'->'META_SPEC'->'META_CONTENEUR'->>'DATE_PUBLI' <= params.today
ORDER BY data->'META'->'META_SPEC'->'META_CONTENEUR'->>'DATE_PUBLI' DESC NULLS LAST,
id DESC
LIMIT 1
)
SELECT latest_jorf.id,
latest_jorf.data->'META'->'META_SPEC'->'META_CONTENEUR'->>'DATE_PUBLI' AS date_publi,
latest_jorf.data->'META'->'META_SPEC'->'META_CONTENEUR'->>'NUM' AS numero,
latest_jorf.data->'META'->'META_SPEC'->'META_CONTENEUR'->>'TITRE' AS titre,
jsonb_array_length(jsonb_path_query_array(latest_jorf.data, '$.STRUCTURE_TXT.**.LIEN_TXT[*]')) AS nb_textes,
jsonb_path_query_array(latest_jorf.data, '$.STRUCTURE_TXT.**.TITRE_TM') AS rubriques
FROM latest_jorf;
Récupérer quelques textes du dernier JORF
WITH params AS (
SELECT CURRENT_DATE::text AS today
), latest_jorf AS (
SELECT data
FROM legifrance.jo, params
WHERE data->'META'->'META_COMMUN'->>'ORIGINE' = 'JORF'
AND data->'META'->'META_SPEC'->'META_CONTENEUR'->>'TITRE' LIKE 'JORF %'
AND data->'META'->'META_SPEC'->'META_CONTENEUR'->>'DATE_PUBLI' <= params.today
ORDER BY data->'META'->'META_SPEC'->'META_CONTENEUR'->>'DATE_PUBLI' DESC NULLS LAST,
id DESC
LIMIT 1
), liens AS (
SELECT jsonb_path_query(data, '$.STRUCTURE_TXT.**.LIEN_TXT[*]') AS lien
FROM latest_jorf
)
SELECT lien->>'@idtxt' AS idtxt,
lien->>'@titretxt' AS titre
FROM liens
LIMIT 20;
2. Rechercher dans les dossiers et documents de l'Assemblée nationale avec query_sql
Le travail parlementaire génère des dizaines de "documents" rattachés à un "dossier législatif".
Rechercher un Dossier Législatif (par son titre)
-- Recherche simple par titre
SELECT uid, data->'titreDossier'->>'titre' AS titre
FROM assemblee.dossiers
WHERE data->'titreDossier'->>'titre' ILIKE '%retraites%';
-- Recherche filtrée par législature
SELECT uid,
data->'titreDossier'->>'titre' AS titre,
data->>'statut' as statut
FROM assemblee.dossiers
WHERE legislature = 17
AND data->'titreDossier'->>'titre' ILIKE '%loi de finances pour 2026%';
Détecter les recours à l'article 49.3 (récursif)
Les actes du 49.3 peuvent être imbriqués à n'importe quel niveau de l'arbre actesLegislatifs.
-- Trouver les dossiers avec un engagement de responsabilité (49.3)
SELECT uid,
data->'titreDossier'->>'titre' as titre,
jsonb_path_query(data, '$.**.actesLegislatifs[*] ? (@.typeDeclaration.famCode == "Art.49.3")')->>'dateActe' as date_49_3
FROM assemblee.dossiers
WHERE data @@ '$.**.typeDeclaration.famCode == "Art.49.3"';
Rechercher un document spécifique (projet, proposition, rapport)
Dans le schéma assemblee de canutes, les textes eux-mêmes sont dans la table assemblee.documents.
SELECT uid,
data->'titres'->>'titrePrincipal' AS titre_principal,
data->>'denominationStructurelle' AS type_document
FROM assemblee.documents
WHERE data->'titres'->>'titrePrincipal' ILIKE '%immigration%';
3. Recherche plein texte : search_legal_texts, puis query_typesense si besoin
Si vous cherchez un "texte juridique" par similarité sans savoir s'il vient de l'Assemblée ou de Légifrance, commencez par search_legal_texts, qui cible directement la collection textes_juridiques.
La recherche est très performante pour des titres précis, par exemple : "Décret n° 2019-1344 du 12 décembre 2019".
Astuce pour les acronymes : Des synonymes sont configurés. Vous pouvez chercher "JO", "JORF", "PLF", "PLFSS", "PJL" ou "PPL", Typesense trouvera automatiquement les textes correspondants.
Exemple d'arguments pour search_legal_texts :
{
"query": "Décret n° 2019-1344 du 12 décembre 2019",
"query_by": "autocompletion,text_id",
"limit": 5
}
Si vous avez ensuite besoin d'un accès Typesense plus générique sur une collection arbitraire, vous pouvez descendre vers query_typesense.
Exemple d'arguments pour query_typesense :
{
"collection": "textes_juridiques",
"q": "Décret n° 2019-1344 du 12 décembre 2019",
"query_by": "autocompletion,text_id",
"limit": 5
}
Note : Dès que vous trouvez le texte (text_id), vous pouvez explorer les détails via query_sql sur la bonne base (jo pour un JO, texte_version pour les lois/codes, documents ou dossiers pour l'Assemblée) afin de faire des requêtes d'exploration complexes.
À 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