{"id":37156,"date":"2019-10-31T22:16:03","date_gmt":"2019-10-31T19:16:03","guid":{"rendered":"https:\/\/prohoster.info\/blog\/bolshe-statistiki-sajta-v-svoyom-malenkom-hranilishhe\/"},"modified":"2019-10-31T22:16:03","modified_gmt":"2019-10-31T19:16:03","slug":"bolshe-statistiki-sajta-v-svoyom-malenkom-hranilishhe","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/bolshe-statistiki-sajta-v-svoyom-malenkom-hranilishhe","title":{"rendered":"Plus de statistiques sur le site dans votre petit espace de stockage","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>En analysant les statistiques du site, nous obtenons une vue d'ensemble de ce qui se passe. Nous mettons les r\u00e9sultats en relation avec d'autres connaissances sur le produit ou le service, am\u00e9liorant ainsi notre exp\u00e9rience.<\/p>\n<p>Lorsque l'analyse des premiers r\u00e9sultats est termin\u00e9e, que l'on a r\u00e9fl\u00e9chi \u00e0 l'information et tir\u00e9 des conclusions, la prochaine \u00e9tape commence. Des id\u00e9es \u00e9mergent : que se passerait-il si l'on regardait les donn\u00e9es sous un autre angle ?<\/p>\n<p>\u00c0 ce stade, il y a des limitations aux outils d'analyse. C'est l'une des raisons pour lesquelles l'outil Google Analytics ne m'a pas suffi, notamment en raison de sa capacit\u00e9 limit\u00e9e \u00e0 visualiser et manipuler mes donn\u00e9es.<\/p>\n<p>J'ai toujours voulu charger rapidement les donn\u00e9es de base, ajouter un autre niveau d'agr\u00e9gation ou interpr\u00e9ter diff\u00e9remment les valeurs existantes.<\/p>\n<p>C'est facile \u00e0 faire dans <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/462337\/\">mon petit entrep\u00f4t<\/a><\/noindex> bas\u00e9 sur le fichier access.log et il suffit d'utiliser le langage SQL.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Alors, \u00e0 quelles questions voulais-je trouver des r\u00e9ponses ?<\/p>\n<h4>Qu'est-ce qui a chang\u00e9 sur le site et quand ?<\/h4>\n<p>\nL'historique des modifications des donn\u00e9es de base est toujours int\u00e9ressant.<\/p>\n<p><img decoding=\"async\" alt=\"Plus de statistiques sur le site dans votre petit espace de stockage\" src=\"\/wp-content\/uploads\/2019\/08\/7613bf138d6026c808e2c4b2ee743d66.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Requ\u00eate SQL de rapport<\/b><\/p>\n<pre><code class=\"sql\">SELECT\n\t1 as 'SideStackedBar: Mises \u00e0 jour de contenu par mois',\n\tstrftime('%m\/%Y', datetime(UPDATE_DT, 'unixepoch')) AS 'Jour',\n\tCOUNT(CASE WHEN PAGE_TITLE != 'n.a.' THEN DIM_REQUEST_ID END) AS 'Mises \u00e0 jour de pages web',\n\tCOUNT(CASE WHEN PAGE_DESCR = 'IMAGES' THEN DIM_REQUEST_ID END) AS 'T\u00e9l\u00e9chargements d'images',\n\tCOUNT(CASE WHEN PAGE_DESCR = 'VIDEO' THEN DIM_REQUEST_ID END) AS 'T\u00e9l\u00e9chargements de vid\u00e9os',\n\tCOUNT(CASE WHEN PAGE_DESCR = 'AUDIO' THEN DIM_REQUEST_ID END) AS 'T\u00e9l\u00e9chargements audio'\nFROM DIM_REQUEST\nWHERE PAGE_TITLE != 'n.a.' OR PAGE_DESCR != 'n.a.'\nGROUP BY strftime('%m\/%Y', datetime(UPDATE_DT, 'unixepoch'))\nORDER BY UPDATE_DT<\/code><\/pre>\n<p>Par exemple, \u00e0 un moment donn\u00e9, une optimisation du r\u00e9f\u00e9rencement a \u00e9t\u00e9 r\u00e9alis\u00e9e ou un nouveau contenu a \u00e9t\u00e9 ajout\u00e9 au site, entra\u00eenant une augmentation pr\u00e9vue du trafic.<\/p>\n<h4>Groupes d'utilisateurs<\/h4>\n<p>\nLe plus simple exemple de groupe peut \u00eatre un agent utilisateur ou le nom du syst\u00e8me d'exploitation. <\/p>\n<p>La mesure des agents utilisateurs a accumul\u00e9 environ mille enregistrements, et j'\u00e9tais curieux de voir la dynamique de la r\u00e9partition des agents dans le groupe.<\/p>\n<p><img decoding=\"async\" alt=\"Plus de statistiques sur le site dans votre petit espace de stockage\" src=\"\/wp-content\/uploads\/2019\/08\/73d908a13f40b4f2c95c57e1e2d55945.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Requ\u00eate SQL de rapport<\/b><\/p>\n<pre><code class=\"sql\">SELECT\n\t1 AS 'SideStackedBar: Agents utilisateurs',\n\tAGENT_OS AS 'OS',\n\tSUM(CASE WHEN AGENT_BOT = 'n.a.' THEN 1 ELSE 0 END) AS 'Agent utilisateur des utilisateurs',\n\tSUM(CASE WHEN AGENT_BOT != 'n.a.' THEN 1 ELSE 0 END) AS 'Agent utilisateur des bots'\nFROM DIM_USER_AGENT\nWHERE DIM_USER_AGENT_ID != -1\nGROUP BY AGENT_OS\nORDER BY 3 DESC<\/code><\/pre>\n<p>La plupart des diff\u00e9rentes combinaisons d'agents proviennent du monde Windows. Parmi les ind\u00e9finis, se trouvent des \u00e9l\u00e9ments tels que WhatsApp, PocketImageCache, PlayStation, SmartTV, etc. <\/p>\n<h4>Activit\u00e9 des groupes d'utilisateurs par semaine<\/h4>\n<p>\nEn regroupant certains groupes, on peut observer la r\u00e9partition de leur activit\u00e9.<\/p>\n<p>Par exemple, les utilisateurs du cluster Linux consomment plus de trafic sur le site que tous les autres.<\/p>\n<p><img decoding=\"async\" alt=\"Plus de statistiques sur le site dans votre petit espace de stockage\" src=\"\/wp-content\/uploads\/2019\/08\/b3cba5ca4408ceb6ed5bfc319664d02c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Requ\u00eate SQL de rapport<\/b><\/p>\n<pre><code class=\"sql\">SELECT\n1 AS 'StackedBar: Volume de Trafic par Syst\u00e8me d'Exploitation Utilisateur et par Semaine',\nstrftime('%W semaine', datetime(FCT.EVENT_DT, 'unixepoch')) AS 'Semaine',\nSUM(CASE WHEN USG.AGENT_OS IN ('Android', 'Linux') THEN FCT.BYTES ELSE 0 END) \/ 1000 AS 'Utilisateurs Android\/Linux',\nSUM(CASE WHEN USG.AGENT_OS IN ('Windows') THEN FCT.BYTES ELSE 0 END) \/ 1000 AS 'Utilisateurs Windows',\nSUM(CASE WHEN USG.AGENT_OS IN ('Macintosh', 'iOS') THEN FCT.BYTES ELSE 0 END) \/ 1000 AS 'Utilisateurs Mac\/iOS',\nSUM(CASE WHEN USG.AGENT_OS IN ('n.a.', 'BlackBerry') THEN FCT.BYTES ELSE 0 END) \/ 1000 AS 'Autre'\nFROM\n  FCT_ACCESS_USER_AGENT_DD FCT,\n  DIM_USER_AGENT USG,\n  DIM_HTTP_STATUS HST\nWHERE FCT.DIM_USER_AGENT_ID = USG.DIM_USER_AGENT_ID\n  AND FCT.DIM_HTTP_STATUS_ID = HST.DIM_HTTP_STATUS_ID\n  AND USG.AGENT_BOT = 'n.a.' \/* utilisateurs seulement *\/\n  AND HST.STATUS_GROUP IN ('Successful') \/* bonnes pages *\/\n  AND datetime(FCT.EVENT_DT, 'unixepoch') &gt; date('now', '-3 month')\nGROUP BY strftime('%W semaine', datetime(FCT.EVENT_DT, 'unixepoch'))\nORDER BY FCT.EVENT_DT<\/code><\/pre>\n<h4>Consommation intensive de trafic<\/h4>\n<p>\nLe tableau montre les groupes d'utilisateurs les plus actifs et le jour de leur activit\u00e9.<br \/>\nLes plus actifs appartiennent au cluster Linux.<\/p>\n<p><img decoding=\"async\" alt=\"Plus de statistiques sur le site dans votre petit espace de stockage\" src=\"\/wp-content\/uploads\/2019\/08\/4ff0758ef934adddd5b2c99eab3b9141.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Requ\u00eate SQL de rapport<\/b><\/p>\n<pre><code class=\"sql\">SELECT\n1 AS 'Table: Agent Utilisateur avec Forte Utilisation',\nstrftime('%d.%m.%Y', datetime(FCT.EVENT_DT, 'unixepoch')) AS 'Jour',\nROUND(1.0 * SUM(FCT.BYTES) \/ 1000000, 1) AS 'Trafic MB',\nROUND(1.0 * SUM(FCT.IP_CNT) \/ SUM(1), 1) AS 'IPs',\nROUND(1.0 * SUM(FCT.REQUEST_CNT) \/ SUM(1), 1) AS 'Demandes',\nUSA.DIM_USER_AGENT_ID AS 'ID',\nMAX(USA.USER_AGENT_NK) AS 'Agent Utilisateur',\nMAX(USA.AGENT_BOT) AS 'Bot'\nFROM\nFCT_ACCESS_USER_AGENT_DD FCT,\nDIM_USER_AGENT USA\nWHERE FCT.DIM_USER_AGENT_ID = USA.DIM_USER_AGENT_ID\n  AND datetime(FCT.EVENT_DT, 'unixepoch') &gt;= date('now', '-30 day')\nGROUP BY USA.DIM_USER_AGENT_ID, strftime('%d.%m.%Y', datetime(FCT.EVENT_DT, 'unixepoch')) \nORDER BY SUM(FCT.BYTES) DESC, FCT.EVENT_DT\nLIMIT 10<\/code><\/pre>\n<p>En utilisant les attributs jour et ID d'agent, il est possible de trouver et de suivre rapidement les statistiques par jour pour des groupes d'utilisateurs sp\u00e9cifiques. Si n\u00e9cessaire, des informations d\u00e9taill\u00e9es peuvent \u00eatre rapidement trouv\u00e9es dans la table de stage.<\/p>\n<h4>Comment obtenir des informations ?<\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/462337\/\">Les informations du fichier access.log<\/a><\/noindex> peuvent \u00eatre rendues encore plus efficaces en int\u00e9grant des sources de donn\u00e9es suppl\u00e9mentaires, en introduisant de nouveaux niveaux d'agr\u00e9gation et de regroupement.<\/p>\n<h4>Donn\u00e9es et entit\u00e9s de base<\/h4>\n<p>\nLes donn\u00e9es de base incluent des informations sur les entit\u00e9s : pages web, images, contenus vid\u00e9o et audio, et pour un magasin \u2014 produits. <\/p>\n<p>Ces entit\u00e9s servent de dimensions, et le processus de conservation des modifications des attributs est appel\u00e9 historisation. Dans une base de donn\u00e9es, ce processus est souvent r\u00e9alis\u00e9 sous forme de dimensions \u00e0 changement lent (SCD).<\/p>\n<p>Les sources de donn\u00e9es de base peuvent provenir de divers syst\u00e8mes, il est donc presque toujours n\u00e9cessaire de les int\u00e9grer.<\/p>\n<h4>Dimension \u00e0 changement lent<\/h4>\n<p>\nLa dimension DIM_REQUEST contiendra des informations sur les requ\u00eates sur le site sous forme historique.<\/p>\n<p><b class=\"spoiler_title\">Table SCD2<\/b><\/p>\n<pre><code class=\"sql\">CR\u00c9ER UNE TABLE DIM_REQUEST ( \n  DIM_REQUEST_ID      INTEGER NON NULL CL\u00c9 PRINCIPALE AUTOINCREMENT,\n  DIM_REQUEST_ID_HIST INTEGER NON NULL DEFAULT -1,\n  REQUEST_NK          TEXTE NON NULL DEFAULT 'n.a.', \n  PAGE_TITLE          TEXTE NON NULL DEFAULT 'n.a.',\n  PAGE_DESCR          TEXTE NON NULL DEFAULT 'n.a.',\n  PAGE_KEYWORDS       TEXTE NON NULL DEFAULT 'n.a.',\n  DELETE_FLAG         INTEGER NON NULL DEFAULT 0,\n  UPDATE_DT           INTEGER NON NULL DEFAULT 0,\n  UNIQUE (REQUEST_NK, DIM_REQUEST_ID_HIST)\n);\nINSERT INTO DIM_REQUEST (DIM_REQUEST_ID) VALUES (-1);<\/code><\/pre>\n<p>En plus de cela, nous allons cr\u00e9er une vue qui affichera toujours tous les enregistrements dans leur dernier \u00e9tat. Cela est n\u00e9cessaire pour charger la mesure elle-m\u00eame.<\/p>\n<p><img decoding=\"async\" alt=\"Plus de statistiques sur le site dans votre petit espace de stockage\" src=\"\/wp-content\/uploads\/2019\/08\/cea3301b30338dfd5099db60342e8d84.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Vue actuelle SCD2<\/b><\/p>\n<pre><code class=\"sql\">\/* Content: actual view on scd table *\/\nSELECT HI.DIM_REQUEST_ID,\n  HI.DIM_REQUEST_ID_HIST,\n  HI.REQUEST_NK,\n  HI.PAGE_TITLE,\n  HI.PAGE_DESCR,\n  HI.PAGE_KEYWORDS,\n  NK.CNT AS HIST_CNT,\n  HI.DELETE_FLAG,\n  strftime('%d.%m.%Y %H:%M', datetime(HI.UPDATE_DT, 'unixepoch')) AS UPDATE_DT\nFROM\n  ( SELECT REQUEST_NK, MAX(DIM_REQUEST_ID) AS DIM_REQUEST_ID, SUM(1) AS CNT\n    FROM DIM_REQUEST\n    GROUP BY REQUEST_NK\n  ) NK,\n  DIM_REQUEST HI\nWHERE 1 = 1\n  AND NK.REQUEST_NK = HI.REQUEST_NK\n  AND NK.DIM_REQUEST_ID = HI.DIM_REQUEST_ID;<\/code><\/pre>\n<p>Et une vue o\u00f9 pour chaque enregistrement, les informations historiques sont rassembl\u00e9es. Cela est n\u00e9cessaire pour \u00e9tablir une connexion historiquement correcte avec les faits.<\/p>\n<p><img decoding=\"async\" alt=\"Plus de statistiques sur le site dans votre petit espace de stockage\" src=\"\/wp-content\/uploads\/2019\/08\/05afeae70b441a7aa4a17ae70646285e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Vue historique SCD2<\/b><\/p>\n<pre><code class=\"sql\">\/* Content: actual view on scd table *\/\nSELECT SCD.DIM_REQUEST_ID,\n  SCD.DIM_REQUEST_ID_HIST,\n  SCD.REQUEST_NK,\n  SCD.PAGE_TITLE,\n  SCD.PAGE_DESCR,\n  SCD.PAGE_KEYWORDS,\n  SCD.DELETE_FLAG,\n  CASE\n    WHEN HIS.UPDATE_DT IS NULL\n    THEN 1\n    ELSE 0 END ACTIVE_FLAG,\n  SCD.DIM_REQUEST_ID_HIST AS ID_FROM,\n  SCD.DIM_REQUEST_ID AS ID_TO,\n  CASE\n    WHEN SCD.DIM_REQUEST_ID_HIST=-1\n    THEN 3600\n    ELSE IFNULL(SCD.UPDATE_DT,3600)\n  END AS TIME_FROM,\n  CASE\n    WHEN HIS.UPDATE_DT IS NULL\n    THEN 253370764800\n    ELSE HIS.UPDATE_DT\n  END AS TIME_TO,\n  CASE\n    WHEN SCD.DIM_REQUEST_ID_HIST=-1\n    THEN STRFTIME('%d.%m.%Y %H:%M', DATETIME(3600, 'unixepoch'))\n    ELSE STRFTIME('%d.%m.%Y %H:%M', DATETIME(IFNULL(SCD.UPDATE_DT,3600), 'unixepoch'))\n  END AS ACTIVE_FROM,\n  CASE\n    WHEN HIS.UPDATE_DT IS NULL\n    THEN STRFTIME('%d.%m.%Y %H:%M', DATETIME(253370764800, 'unixepoch'))\n    ELSE STRFTIME('%d.%m.%Y %H:%M', DATETIME(HIS.UPDATE_DT, 'unixepoch'))\n  END AS ACTIVE_TO\nFROM\n  DIM_REQUEST SCD\n  LEFT OUTER JOIN DIM_REQUEST HIS\n  ON SCD.REQUEST_NK = HIS.REQUEST_NK AND SCD.DIM_REQUEST_ID = HIS.DIM_REQUEST_ID_HIST;<\/code><\/pre>\n<h4>Agr\u00e9gation des donn\u00e9es<\/h4>\n<p>\nLa compression (agr\u00e9gation) permet d'\u00e9valuer les donn\u00e9es \u00e0 un niveau plus \u00e9lev\u00e9 et de d\u00e9tecter des anomalies et des tendances qui ne sont pas visibles dans les rapports d\u00e9taill\u00e9s.<\/p>\n<p>Par exemple, dans la mesure avec les codes d'\u00e9tat des requ\u00eates DIM_HTTP_STATUS, nous ajouterons un groupe :<\/p>\n<blockquote><p>\u00c9TAT \/ GROUPE<br \/>\n0xx \/ n.a.<br \/>\n1xx \/ Informatif<br \/>\n2xx \/ R\u00e9ussi<br \/>\n3xx \/ Redirection<br \/>\n4xx \/ Erreur du client<br \/>\n5xx \/ Erreur du serveur<\/p><\/blockquote>\n<p> La mesure des agents utilisateur DIM_USER_AGENT contiendra les attributs AGENT_OS et AGENT_BOT, responsables des groupes. Ils peuvent \u00eatre remplis lors du processus ETL :<\/p>\n<p><b class=\"spoiler_title\">Chargement de DIM_USER_AGENT<\/b><\/p>\n<pre><code class=\"sql\">\/* Propagate the user agent from access log *\/\nINSERT INTO DIM_USER_AGENT (USER_AGENT_NK, AGENT_OS, AGENT_ENGINE, AGENT_DEVICE, AGENT_BOT, UPDATE_DT)\nWITH CLS AS (\n\tSELECT BROWSER\n\tFROM STG_ACCESS_LOG WHERE LENGTH(BROWSER)&gt;1\n\tGROUP BY BROWSER\n)\nSELECT\n\tCLS.BROWSER AS USER_AGENT_NK,\n\tCASE\n\tWHEN INSTR(CLS.BROWSER,'Macintosh')&gt;0\n\t\tTHEN 'Macintosh'\n\tWHEN INSTR(CLS.BROWSER,'iPhone')&gt;0\n\t\t\t OR INSTR(CLS.BROWSER,'iPad')&gt;0\n\t\t\t OR INSTR(CLS.BROWSER,'iPod')&gt;0\n\t\t\t OR INSTR(CLS.BROWSER,'Apple TV')&gt;0\n\t\t\t OR INSTR(CLS.BROWSER,'Darwin')&gt;0\n\t\tTHEN 'iOS'\n\tWHEN INSTR(CLS.BROWSER,'Android')&gt;0\n\t\tTHEN 'Android'\n\tWHEN INSTR(CLS.BROWSER,'X11;')&gt;0 OR INSTR(CLS.BROWSER,'Wayland;')&gt;0 OR INSTR(CLS.BROWSER,'linux-gnu')&gt;0\n\t\tTHEN 'Linux'\n\tWHEN INSTR(CLS.BROWSER,'BB10;')&gt;0 OR INSTR(CLS.BROWSER,'BlackBerry')&gt;0\n\t\tTHEN 'BlackBerry'\n\tWHEN INSTR(CLS.BROWSER,'Windows')&gt;0\n\t\tTHEN 'Windows'\n\tELSE 'n.a.' END AS AGENT_OS, -- OS\n\tCASE\n\tWHEN INSTR(CLS.BROWSER,'AppleCoreMedia')&gt;0\n\t\tTHEN 'AppleWebKit'\n\tWHEN INSTR(CLS.BROWSER,') ')&gt;1 AND LENGTH(CLS.BROWSER)&gt;INSTR(CLS.BROWSER,') ')\n\t\tTHEN COALESCE(SUBSTR(CLS.BROWSER, INSTR(CLS.BROWSER,') ')+2, LENGTH(CLS.BROWSER) - INSTR(CLS.BROWSER,') ')-1), 'N\/A')\n\tELSE 'n.a.' END AS AGENT_ENGINE, -- Engine\n\tCASE\n\tWHEN INSTR(CLS.BROWSER,'iPhone')&gt;0\n\t\tTHEN 'iPhone'\n\tWHEN INSTR(CLS.BROWSER,'iPad')&gt;0\n\t\tTHEN 'iPad'\n\tWHEN INSTR(CLS.BROWSER,'iPod')&gt;0\n\t\tTHEN 'iPod'\n\tWHEN INSTR(CLS.BROWSER,'Apple TV')&gt;0\n\t\tTHEN 'Apple TV'\n\tWHEN INSTR(CLS.BROWSER,'Android ')&gt;0 AND INSTR(CLS.BROWSER,'Build')&gt;0\n\t\tTHEN COALESCE(SUBSTR(CLS.BROWSER, INSTR(CLS.BROWSER,'Android '), INSTR(CLS.BROWSER,'Build')-INSTR(CLS.BROWSER,'Android ')), 'n.a.')\n\tWHEN INSTR(CLS.BROWSER,'Android ')&gt;0 AND INSTR(CLS.BROWSER,'MIUI')&gt;0\n\t\tTHEN COALESCE(SUBSTR(CLS.BROWSER, INSTR(CLS.BROWSER,'Android '), INSTR(CLS.BROWSER,'MIUI')-INSTR(CLS.BROWSER,'Android ')), 'n.a.')\n\tELSE 'n.a.' END AS AGENT_DEVICE, -- Device\n\tCASE\n\tWHEN INSTR(LOWER(CLS.BROWSER),'yandex.com')&gt;0\n\t\tTHEN 'yandex'\n\tWHEN INSTR(LOWER(CLS.BROWSER),'googlebot')&gt;0\n\t\tTHEN 'google'\n\tWHEN INSTR(LOWER(CLS.BROWSER),'bingbot')&gt;0\n\t\tTHEN 'microsoft'\n\tWHEN INSTR(LOWER(CLS.BROWSER),'ahrefsbot')&gt;0\n\t\tTHEN 'ahrefs'\n\tWHEN INSTR(LOWER(CLS.BROWSER),'jobboersebot')&gt;0 OR INSTR(LOWER(CLS.BROWSER),'jobkicks')&gt;0\n\t\tTHEN 'job.de'\n\tWHEN INSTR(LOWER(CLS.BROWSER),'mail.ru')&gt;0\n\t\tTHEN 'mail.ru'\n\tWHEN INSTR(LOWER(CLS.BROWSER),'baiduspider')&gt;0\n\t\tTHEN 'baidu'\n\tWHEN INSTR(LOWER(CLS.BROWSER),'mj12bot')&gt;0\n\t\tTHEN 'majestic-12'\n\tWHEN INSTR(LOWER(CLS.BROWSER),'duckduckgo')&gt;0\n\t\tTHEN 'duckduckgo'\n\tWHEN INSTR(LOWER(CLS.BROWSER),'bytespider')&gt;0\n\t\tTHEN 'bytespider'\n\tWHEN INSTR(LOWER(CLS.BROWSER),'360spider')&gt;0\n\t\tTHEN 'so.360.cn'\n\tWHEN INSTR(LOWER(CLS.BROWSER),'compatible')&gt;0 OR INSTR(LOWER(CLS.BROWSER),'http')&gt;0\n\t\tOR INSTR(LOWER(CLS.BROWSER),'libwww')&gt;0 OR INSTR(LOWER(CLS.BROWSER),'spider')&gt;0\n\t\tOR INSTR(LOWER(CLS.BROWSER),'java')&gt;0 OR INSTR(LOWER(CLS.BROWSER),'python')&gt;0\n\t\tOR INSTR(LOWER(CLS.BROWSER),'robot')&gt;0 OR INSTR(LOWER(CLS.BROWSER),'curl')&gt;0 OR INSTR(LOWER(CLS.BROWSER),'wget')&gt;0\n\t\tTHEN 'other'\n\tELSE 'n.a.' END AS AGENT_BOT, -- Bot\n\tSTRFTIME('%s','now') AS UPDATE_DT\nFROM CLS\nLEFT OUTER JOIN DIM_USER_AGENT TRG\nON CLS.BROWSER = TRG.USER_AGENT_NK\nWHERE TRG.DIM_USER_AGENT_ID IS NULL<\/code><\/pre>\n<h4>Int\u00e9gration des donn\u00e9es<\/h4>\n<p>\nInclut l'organisation du transfert de donn\u00e9es du syst\u00e8me d'exploitation au rapport. Pour cela, il est n\u00e9cessaire de cr\u00e9er une table d'\u00e9tape avec une structure similaire \u00e0 celle de la source.<\/p>\n<p>Les informations sur les pages Web atteignent la table d'\u00e9tape \u00e0 partir de la sauvegarde de la CMS sous forme de requ\u00eates d'insertion.<\/p>\n<p>Le chargement de la table historique DIM_REQUEST avec les donn\u00e9es de base se d\u00e9roule en trois \u00e9tapes : chargement des nouvelles cl\u00e9s et attributs, mise \u00e0 jour des existants et enregistrement des enregistrements supprim\u00e9s.<\/p>\n<p><b class=\"spoiler_title\">Chargement des nouveaux enregistrements SCD2<\/b><\/p>\n<pre><code class=\"sql\">\/* Load request table SCD from master data *\/\nINSERT INTO DIM_REQUEST (DIM_REQUEST_ID_HIST, REQUEST_NK, PAGE_TITLE, PAGE_DESCR, PAGE_KEYWORDS, DELETE_FLAG, UPDATE_DT)\nWITH CLS  AS ( -- prepare keys\n\tSELECT\n\t'\/' || NAME AS REQUEST_NK,\n\tTITLE       AS PAGE_TITLE,\n\tCASE WHEN DESCRIPTION = '' OR DESCRIPTION IS NULL\n\t     THEN 'n.a.' ELSE DESCRIPTION\n\tEND AS PAGE_DESCR,\n\tCASE WHEN KEYWORDS = '' OR KEYWORDS IS NULL\n\t     THEN 'n.a.' ELSE KEYWORDS\n\tEND AS PAGE_KEYWORDS\n\tFROM STG_CMS_MENU\n\tWHERE CONTENT_TYPE != 'folder' -- only web pages\n\t  AND PAGE_TITLE != 'n.a.' -- master data which make sense\n)\n\/* new records from stage: CLS *\/\nSELECT\n\t-1 AS DIM_REQUEST_ID_HIST,\n\tCLS.REQUEST_NK,\n\tCLS.PAGE_TITLE,\n\tCLS.PAGE_DESCR,\n\tCLS.PAGE_KEYWORDS,\n\t0 AS DELETE_FLAG,\n\tSTRFTIME('%s','now') AS UPDATE_DT\nFROM CLS\nLEFT OUTER JOIN\n (\n\tSELECT\n\tDIM_REQUEST_ID,\n\tREQUEST_NK,\n\tPAGE_TITLE,\n\tPAGE_DESCR,\n\tPAGE_KEYWORDS\n\tFROM DIM_REQUEST_V_ACT\n) TRG ON CLS.REQUEST_NK = TRG.REQUEST_NK\nWHERE TRG.REQUEST_NK IS NULL -- no such record in data mart<\/code><\/pre>\n<p><b class=\"spoiler_title\">Mise \u00e0 jour des attributs SCD2<\/b><\/p>\n<pre><code class=\"sql\">\/* Load request table SCD from master data *\/\nINSERT INTO DIM_REQUEST (DIM_REQUEST_ID_HIST, REQUEST_NK, PAGE_TITLE, PAGE_DESCR, PAGE_KEYWORDS, DELETE_FLAG, UPDATE_DT)\nWITH CLS  AS ( -- prepare keys\n\tSELECT\n\t'\/' || NAME AS REQUEST_NK,\n\tTITLE       AS PAGE_TITLE,\n\tCASE WHEN DESCRIPTION = '' OR DESCRIPTION IS NULL\n\t     THEN 'n.a.' ELSE DESCRIPTION\n\tEND AS PAGE_DESCR,\n\tCASE WHEN KEYWORDS = '' OR KEYWORDS IS NULL\n\t     THEN 'n.a.' ELSE KEYWORDS\n\tEND AS PAGE_KEYWORDS\n\tFROM STG_CMS_MENU\n\tWHERE CONTENT_TYPE != 'folder' -- only web pages\n\t  AND PAGE_TITLE != 'n.a.' -- master data which make sense\n)\n\/* updated records from stage: CLS and build reference to history: HIST *\/\nSELECT\n\tHIST.DIM_REQUEST_ID AS DIM_REQUEST_ID_HIST,\n\tHIST.REQUEST_NK,\n\tCLS.PAGE_TITLE,\n\tCLS.PAGE_DESCR,\n\tCLS.PAGE_KEYWORDS,\n\t0 AS DELETE_FLAG,\n\tSTRFTIME('%s','now') AS UPDATE_DT\nFROM CLS,\n     DIM_REQUEST_V_ACT TRG,\n     DIM_REQUEST HIST\nWHERE CLS.REQUEST_NK = TRG.REQUEST_NK\n  AND TRG.DIM_REQUEST_ID = HIST.DIM_REQUEST_ID\n  AND ( CLS.PAGE_TITLE != HIST.PAGE_TITLE \/* changes only *\/\n     OR CLS.PAGE_DESCR != HIST.PAGE_DESCR\n     OR CLS.PAGE_KEYWORDS != HIST.PAGE_KEYWORDS )<\/code><\/pre>\n<p><b class=\"spoiler_title\">Enregistrements supprim\u00e9s SCD2<\/b><\/p>\n<pre><code class=\"sql\">\/* Load request table SCD from master data *\/\nINSERT INTO DIM_REQUEST (DIM_REQUEST_ID_HIST, REQUEST_NK, PAGE_TITLE, PAGE_DESCR, PAGE_KEYWORDS, DELETE_FLAG, UPDATE_DT)\nWITH CLS  AS ( -- prepare keys\n\tSELECT\n\t'\/' || NAME AS REQUEST_NK,\n\tTITLE       AS PAGE_TITLE\n\tFROM STG_CMS_MENU\n\tWHERE CONTENT_TYPE != 'folder' -- only web pages\n\t  AND PAGE_TITLE != 'n.a.' -- master data which make sense\n)\n\/*  deleted records in data mart: TRG *\/\nSELECT\n\tTRG.DIM_REQUEST_ID AS DIM_REQUEST_ID_HIST,\n\tTRG.REQUEST_NK,\n\tTRG.PAGE_TITLE,\n\tTRG.PAGE_DESCR,\n\tTRG.PAGE_KEYWORDS,\n\t1 AS DELETE_FLAG,\n\tSTRFTIME('%s','now') AS UPDATE_DT\nFROM (\n\tSELECT\n\tDIM_REQUEST_ID,\n\tREQUEST_NK,\n\tPAGE_TITLE,\n\tPAGE_DESCR,\n\tPAGE_KEYWORDS\n\tFROM DIM_REQUEST_V_ACT\n\tWHERE PAGE_TITLE != 'n.a.' -- track master data only\n\t  AND DELETE_FLAG = 0 -- not already deleted\n) TRG\nLEFT OUTER JOIN CLS ON TRG.REQUEST_NK = CLS.REQUEST_NK\nWHERE CLS.REQUEST_NK IS NULL -- no such record in stage<\/code><\/pre>\n<p>Chaque source de donn\u00e9es doit \u00eatre accompagn\u00e9e d'une description formelle, par exemple, dans un fichier readme.txt :<\/p>\n<blockquote><p>Destinataire des donn\u00e9es formellement\/techniquement : nom, adresse \u00e9lectronique<br \/>\nFournisseur de donn\u00e9es formellement\/techniquement : nom, adresse \u00e9lectronique<br \/>\nSource des donn\u00e9es : chemin d'acc\u00e8s au fichier, noms des services<br \/>\nInformations sur l'acc\u00e8s aux donn\u00e9es : utilisateurs et mots de passe<\/p><\/blockquote>\n<p>\nLe sch\u00e9ma de circulation des donn\u00e9es aidera dans le processus de maintenance et de mise \u00e0 jour, par exemple, sous forme textuelle :<\/p>\n<blockquote><p>D\u00e9placement de fichier. Source : ftp.domain.net: \/logs\/access.log Cible : \/var\/www\/access.log<br \/>\nLecture dans l'\u00e9tape. Cible : STG_ACCESS_LOG<br \/>\nChargement et transformation. Objectif : FCT_ACCESS_REQUEST_REF_HH<br \/>\nChargement et transformation. Objectif : FCT_ACCESS_USER_AGENT_DD<br \/>\nRapport. Objectif : \/var\/www\/report.html<\/p><\/blockquote>\n<h4>Sortie<\/h4>\n<p>\nAinsi, l'article d\u00e9crit des m\u00e9canismes tels que l'int\u00e9gration de bases de donn\u00e9es et l'introduction de nouveaux niveaux d'agr\u00e9gation. Ils sont n\u00e9cessaires lors de la construction d'entrep\u00f4ts de donn\u00e9es en vue d'obtenir des connaissances suppl\u00e9mentaires et d'am\u00e9liorer la qualit\u00e9 des informations.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/463493\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0441\u0430\u0439\u0442\u0430, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043d\u0438\u043c. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u044b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438 \u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435 \u0438\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0438 \u044d\u0442\u0438\u043c \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u043c \u043d\u0430\u0448 \u043e\u043f\u044b\u0442. \u041a\u043e\u0433\u0434\u0430 \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d, \u043f\u0440\u043e\u0448\u043b\u043e \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0432\u044b\u0432\u043e\u0434\u044b, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f. \u0412\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0438\u0434\u0435\u0438: \u0430 \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b? \u041d\u0430 \u044d\u0442\u043e\u043c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27858,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37156","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0441\u0430\u0439\u0442\u0430, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043d\u0438\u043c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/bolshe-statistiki-sajta-v-svoyom-malenkom-hranilishhe\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0411\u043e\u043b\u044c\u0448\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0441\u0430\u0439\u0442\u0430 \u0432 \u0441\u0432\u043e\u0451\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0441\u0430\u0439\u0442\u0430, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043d\u0438\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/bolshe-statistiki-sajta-v-svoyom-malenkom-hranilishhe\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:16:03+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:16:03+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Plus de statistiques du site dans votre petit entrep\u00f4t | ProHoster","description":"En analysant les statistiques du site, nous obtenons une vue d'ensemble de ce qui se passe avec lui.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/bolshe-statistiki-sajta-v-svoyom-malenkom-hranilishhe","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0411\u043e\u043b\u044c\u0448\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0441\u0430\u0439\u0442\u0430 \u0432 \u0441\u0432\u043e\u0451\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 | ProHoster","og:description":"\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0441\u0430\u0439\u0442\u0430, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043d\u0438\u043c.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/bolshe-statistiki-sajta-v-svoyom-malenkom-hranilishhe","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:16:03+00:00","article:modified_time":"2019-10-31T19:16:03+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37156","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 06:19:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:32:14","updated":"2026-01-22 06:19:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/37156","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=37156"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/37156\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/27858"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=37156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=37156"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=37156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}