{"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\/de\/blog\/administrirovanie\/bolshe-statistiki-sajta-v-svoyom-malenkom-hranilishhe","title":{"rendered":"Mehr Statistiken der Website in ihrem kleinen Speicher","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Durch die Analyse der Website-Statistiken erhalten wir ein Bild davon, was mit ihr passiert. Die Ergebnisse vergleichen wir mit anderem Wissen \u00fcber das Produkt oder den Service und verbessern damit unser Erlebnis.<\/p>\n<p>Nachdem die Analyse der ersten Ergebnisse abgeschlossen ist, die Informationen reflektiert wurden und Schlussfolgerungen gezogen wurden, beginnt die n\u00e4chste Phase. Es kommen Ideen auf: Was w\u00e4re, wenn wir die Daten von einer anderen Seite betrachten?<\/p>\n<p>In dieser Phase gibt es Einschr\u00e4nkungen bei den Analysetools. Das ist einer der Gr\u00fcnde, warum mir das Tool Google Analytics nicht ausreichte, insbesondere wegen der eingeschr\u00e4nkten M\u00f6glichkeit, meine Daten zu sehen und zu manipulieren.<\/p>\n<p>Ich wollte immer die grundlegenden Daten (Masterdaten) schnell hochladen, eine andere Aggregationsebene hinzuf\u00fcgen oder die vorhandenen Werte anders interpretieren.<\/p>\n<p>Das ist einfach in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/462337\/\">ihrem kleinen Speicher<\/a><\/noindex> basierend auf der Datei access.log und daf\u00fcr ben\u00f6tigt man nur die SQL-Sprache.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Also, welche Fragen wollte ich beantworten?<\/p>\n<h4>Was und wann hat sich auf der Website ge\u00e4ndert<\/h4>\n<p>\nDie Historie der \u00c4nderungen an den Basisdaten (Masterdaten) ist immer von Interesse.<\/p>\n<p><img decoding=\"async\" alt=\"Mehr Statistiken der Website in ihrem kleinen Speicher\" src=\"\/wp-content\/uploads\/2019\/08\/7613bf138d6026c808e2c4b2ee743d66.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">SQL-Abfragebericht<\/b><\/p>\n<pre><code class=\"sql\">SELECT\n\t1 as 'SideStackedBar: Inhaltsaktualisierungen nach Monaten',\n\tstrftime('%m\/%Y', datetime(UPDATE_DT, 'unixepoch')) AS 'Tag',\n\tCOUNT(CASE WHEN PAGE_TITLE != 'n.a.' THEN DIM_REQUEST_ID END) AS 'Webseitenaktualisierungen',\n\tCOUNT(CASE WHEN PAGE_DESCR = 'IMAGES' THEN DIM_REQUEST_ID END) AS 'Bild-Uploads',\n\tCOUNT(CASE WHEN PAGE_DESCR = 'VIDEO' THEN DIM_REQUEST_ID END) AS 'Video-Uploads',\n\tCOUNT(CASE WHEN PAGE_DESCR = 'AUDIO' THEN DIM_REQUEST_ID END) AS 'Audio-Uploads'\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>Zum Beispiel wurde irgendwann eine Suchmaschinenoptimierung durchgef\u00fchrt oder neuer Inhalt auf die Website hinzugef\u00fcgt, weshalb ein Anstieg des Traffics zu erwarten ist.<\/p>\n<h4>Benutzergruppen<\/h4>\n<p>\nDas einfachste Beispiel f\u00fcr eine Gruppe kann der Benutzer-Agent oder der Name des Betriebssystems sein. <\/p>\n<p>Die Messung der Benutzer-Agenten hat etwa tausend Eintr\u00e4ge angesammelt, und ich war daran interessiert, die Dynamik der Verteilung der Agenten innerhalb der Gruppe zu sehen.<\/p>\n<p><img decoding=\"async\" alt=\"Mehr Statistiken der Website in ihrem kleinen Speicher\" src=\"\/wp-content\/uploads\/2019\/08\/73d908a13f40b4f2c95c57e1e2d55945.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">SQL-Abfragebericht<\/b><\/p>\n<pre><code class=\"sql\">SELECT\n\t1 AS 'SideStackedBar: Benutzer-Agenten',\n\tAGENT_OS AS 'OS',\n\tSUM(CASE WHEN AGENT_BOT = 'n.a.' THEN 1 ELSE 0 END ) AS 'Benutzer-Agent der Benutzer',\n\tSUM(CASE WHEN AGENT_BOT != 'n.a.' THEN 1 ELSE 0 END ) AS 'Benutzer-Agent der Bots'\nFROM DIM_USER_AGENT\nWHERE DIM_USER_AGENT_ID != -1\nGROUP BY AGENT_OS\nORDER BY 3 DESC<\/code><\/pre>\n<p>Die meisten verschiedenen Kombinationen von Agenten kommen aus der Welt von Windows auf die Website. Zu den Unbestimmten geh\u00f6ren z.B. WhatsApp, PocketImageCache, PlayStation, SmartTV usw. <\/p>\n<h4>Die Aktivit\u00e4t der Benutzergruppen nach Wochen<\/h4>\n<p>\nDurch die Zusammenf\u00fchrung bestimmter Gruppen kann die Verteilung ihrer Aktivit\u00e4t beobachtet werden.<\/p>\n<p>Beispielsweise verbrauchen Benutzer des Linux-Clusters mehr Traffic auf der Website als alle anderen.<\/p>\n<p><img decoding=\"async\" alt=\"Mehr Statistiken der Website in ihrem kleinen Speicher\" src=\"\/wp-content\/uploads\/2019\/08\/b3cba5ca4408ceb6ed5bfc319664d02c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">SQL-Abfragebericht<\/b><\/p>\n<pre><code class=\"sql\">SELECT\n1 AS 'StackedBar: Traffic Volume by User OS und by Week',\nstrftime('%W Woche', datetime(FCT.EVENT_DT, 'unixepoch')) AS 'Woche',\nSUM(CASE WHEN USG.AGENT_OS IN ('Android', 'Linux') THEN FCT.BYTES ELSE 0 END) \/ 1000 AS 'Android\/Linux Benutzer',\nSUM(CASE WHEN USG.AGENT_OS IN ('Windows') THEN FCT.BYTES ELSE 0 END) \/ 1000 AS 'Windows Benutzer',\nSUM(CASE WHEN USG.AGENT_OS IN ('Macintosh', 'iOS') THEN FCT.BYTES ELSE 0 END) \/ 1000 AS 'Mac\/iOS Benutzer',\nSUM(CASE WHEN USG.AGENT_OS IN ('n.a.', 'BlackBerry') THEN FCT.BYTES ELSE 0 END) \/ 1000 AS 'Andere'\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.' \/* nur Benutzer *\/\n  AND HST.STATUS_GROUP IN ('Erfolgreich') \/* gute Seiten *\/\n  AND datetime(FCT.EVENT_DT, 'unixepoch') &gt; date('now', '-3 Monate')\nGROUP BY strftime('%W Woche', datetime(FCT.EVENT_DT, 'unixepoch'))\nORDER BY FCT.EVENT_DT<\/code><\/pre>\n<h4>Intensiver Trafficverbrauch<\/h4>\n<p>\nAus der Tabelle sind die aktivsten Gruppen von Benutzern und die Tage ihrer Aktivit\u00e4t ersichtlich.<br \/>\nDie aktivsten geh\u00f6ren zum Linux-Cluster.<\/p>\n<p><img decoding=\"async\" alt=\"Mehr Statistiken der Website in ihrem kleinen Speicher\" src=\"\/wp-content\/uploads\/2019\/08\/4ff0758ef934adddd5b2c99eab3b9141.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">SQL-Abfragebericht<\/b><\/p>\n<pre><code class=\"sql\">SELECT\n1 AS 'Tabelle: Benutzer Agent mit hohem Verbrauch',\nstrftime('%d.%m.%Y', datetime(FCT.EVENT_DT, 'unixepoch')) AS 'Tag',\nROUND(1.0 * SUM(FCT.BYTES) \/ 1000000, 1) AS 'Traffic MB',\nROUND(1.0 * SUM(FCT.IP_CNT) \/ SUM(1), 1) AS 'IPs',\nROUND(1.0 * SUM(FCT.REQUEST_CNT) \/ SUM(1), 1) AS 'Anfragen',\nUSA.DIM_USER_AGENT_ID AS 'ID',\nMAX(USA.USER_AGENT_NK) AS 'Benutzer Agent',\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 Tage')\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>Durch die Verwendung der Attribute Tag und ID des Agents wird es m\u00f6glich, die Statistiken einzelner Benutzergruppen schnell nach Tagen zu finden und nachzuvollziehen. Wenn n\u00f6tig, kann man schnell detaillierte Informationen in der Staging-Tabelle finden.<\/p>\n<h4>Wie erh\u00e4lt man Informationen?<\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/462337\/\">Informationen aus der Datei access.log<\/a><\/noindex> kann noch effektiver gestaltet werden, wenn zus\u00e4tzliche Datenquellen integriert, neue Aggregations- und Gruppierungsebenen eingef\u00fchrt werden.<\/p>\n<h4>Basisdaten und Entit\u00e4ten<\/h4>\n<p>\nZu den Basisdaten geh\u00f6ren Informationen \u00fcber Entit\u00e4ten: Webseiten, Bilder, Video- und Audioinhalte sowie Produkte im Falle eines Gesch\u00e4fts. <\/p>\n<p>Die Entit\u00e4ten selbst fungieren als Ma\u00dfeinheiten, und der Prozess der Speicherung von Attributver\u00e4nderungen wird als Historisierung bezeichnet. In Datenbanken wird dieser Prozess h\u00e4ufig in Form von langsam \u00e4ndernden Dimensionen (SCD) umgesetzt.<\/p>\n<p>Die Quellen f\u00fcr Basisdaten k\u00f6nnen sehr unterschiedlich sein, daher m\u00fcssen sie fast immer integriert werden.<\/p>\n<h4>Langsam \u00e4ndernde Dimension<\/h4>\n<p>\nDie Messung DIM_REQUEST enth\u00e4lt Informationen zu Anfragen auf der Website in historischer Form.<\/p>\n<p><b class=\"spoiler_title\">Tabelle SCD2<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE DIM_REQUEST ( \/* scd-Tabelle f\u00fcr Benutzeranfragen *\/\n  DIM_REQUEST_ID      INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n  DIM_REQUEST_ID_HIST INTEGER NOT NULL DEFAULT -1,\n  REQUEST_NK          TEXT NOT NULL DEFAULT 'n.a.', \/* Anfrage ohne ?Parameter *\/\n  PAGE_TITLE          TEXT NOT NULL DEFAULT 'n.a.',\n  PAGE_DESCR          TEXT NOT NULL DEFAULT 'n.a.',\n  PAGE_KEYWORDS       TEXT NOT NULL DEFAULT 'n.a.',\n  DELETE_FLAG         INTEGER NOT NULL DEFAULT 0,\n  UPDATE_DT           INTEGER NOT 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>Zus\u00e4tzlich werden wir eine Sicht erstellen, die immer alle Eintr\u00e4ge im letzten Zustand anzeigt. Dies ist erforderlich, um die Messung selbst zu laden.<\/p>\n<p><img decoding=\"async\" alt=\"Mehr Statistiken der Website in ihrem kleinen Speicher\" src=\"\/wp-content\/uploads\/2019\/08\/cea3301b30338dfd5099db60342e8d84.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Aktuelle Sicht 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>Und eine Sicht, in der f\u00fcr jeden Eintrag historische Informationen gesammelt wurden. Dies ist notwendig, um historisch korrekte Verbindungen zu den Fakten herzustellen.<\/p>\n<p><img decoding=\"async\" alt=\"Mehr Statistiken der Website in ihrem kleinen Speicher\" src=\"\/wp-content\/uploads\/2019\/08\/05afeae70b441a7aa4a17ae70646285e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Historische Sicht 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>Datenaggregation<\/h4>\n<p>\nDie Verdichtung (Aggregation) erm\u00f6glicht es, Daten auf einer h\u00f6heren Ebene zu bewerten und Anomalien und Trends zu erkennen, die in detaillierten Berichten nicht sichtbar sind.<\/p>\n<p>Zum Beispiel f\u00fcgen wir in die Messung mit den Statuscodes der Anfragen DIM_HTTP_STATUS eine Gruppe hinzu:<\/p>\n<blockquote><p>STATUS \/ GRUPPE<br \/>\n0xx \/ n.a.<br \/>\n1xx \/ Informations<br \/>\n2xx \/ Erfolgreich<br \/>\n3xx \/ Umleitung<br \/>\n4xx \/ Client-Fehler<br \/>\n5xx \/ Server-Fehler<\/p><\/blockquote>\n<p> Die Messung der Benutzeragenten DIM_USER_AGENT wird die Attribute AGENT_OS und AGENT_BOT enthalten, die f\u00fcr die Gruppen verantwortlich sind. Diese k\u00f6nnen im ETL-Prozess ausgef\u00fcllt werden:<\/p>\n<p><b class=\"spoiler_title\">Laden von 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>Datenintegration<\/h4>\n<p>\nUmfasst die Organisation der Daten\u00fcbertragung vom Betriebssystem in den Bericht. Dazu ist es notwendig, eine Staging-Tabelle mit einer Struktur \u00e4hnlich der des Quellens zu erstellen.<\/p>\n<p>Im Staging gelangen Informationen \u00fcber die Webseiten aus einem Backup der CMS in Form von Einf\u00fcgeanfragen.<\/p>\n<p>Das Laden der historischen Tabelle DIM_REQUEST mit grundlegenden Daten erfolgt in drei Schritten: Laden neuer Schl\u00fcssel und Attribute, Aktualisieren vorhandener und Festhalten gel\u00f6schter Eintr\u00e4ge.<\/p>\n<p><b class=\"spoiler_title\">Laden neuer Eintr\u00e4ge 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\">Aktualisierung der Attribute 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\">Gel\u00f6schte Eintr\u00e4ge 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>Jede Datenquelle muss mit einer formalen Beschreibung begleitet werden, zum Beispiel in einer Datei readme.txt:<\/p>\n<blockquote><p>Empf\u00e4nger der Daten formell\/technisch: Name, E-Mail-Adresse<br \/>\nDatenlieferant formell\/technisch: Name, E-Mail-Adresse<br \/>\nDatenquelle: Pfad zur Datei, Namen der Dienste<br \/>\nZugriffsinformationen: Benutzer und Passw\u00f6rter<\/p><\/blockquote>\n<p>\nDas Flussdiagramm der Datenbewegung wird im Rahmen der Wartung und Aktualisierung hilfreich sein, zum Beispiel in Textform:<\/p>\n<blockquote><p>Datei\u00fcbertragung. Quelle: ftp.domain.net: \/logs\/access.log Ziel: \/var\/www\/access.log<br \/>\nLesen im Staging. Ziel: STG_ACCESS_LOG<br \/>\nLaden und Transformation. Ziel: FCT_ACCESS_REQUEST_REF_HH<br \/>\nLaden und Transformation. Ziel: FCT_ACCESS_USER_AGENT_DD<br \/>\nBericht. Ziel: \/var\/www\/report.html<\/p><\/blockquote>\n<h4>Ausgabe<\/h4>\n<p>\nSomit beschreibt der Artikel Mechanismen wie die Integration von Basisdaten und die Einf\u00fchrung neuer Aggregationsebenen. Diese sind notwendig beim Aufbau von Data Warehouses, um zus\u00e4tzliche Erkenntnisse zu gewinnen und die Qualit\u00e4t der Informationen zu verbessern.<br \/>\n<br \/>Quelle: <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.1.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\/de\/blog\/administrirovanie\/bolshe-statistiki-sajta-v-svoyom-malenkom-hranilishhe\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\udd47Mehr Website-Statistiken in Ihrem kleinen Speicher | ProHoster","description":"Durch die Analyse der Website-Statistiken erhalten wir Einblick in das, was mit ihr geschieht.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/bolshe-statistiki-sajta-v-svoyom-malenkom-hranilishhe","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/37156","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=37156"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/37156\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/27858"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=37156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=37156"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=37156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}