[{"data":1,"prerenderedAt":7500},["ShallowReactive",2],{"blog":3,"blog-2026-07-07-postgresql-volltextsuche-vs-elasticsearch":4900},[4,3130,3355,3651,4107,4383],{"id":5,"title":6,"author":7,"body":8,"description":3120,"extension":3121,"keywords":3122,"meta":3123,"navigation":129,"path":3124,"publishedAt":3125,"seo":3126,"sitemap":3127,"stem":3128,"__hash__":3129},"blog\u002Fblog\u002F2026-07-07-postgresql-volltextsuche-vs-elasticsearch.md","PostgreSQL-Volltextsuche vs. Elasticsearch – wann die Datenbank reicht","Thomas Pawlitzki",{"type":9,"value":10,"toc":3106},"minimark",[11,15,19,38,43,46,51,54,59,236,258,295,302,306,311,314,431,451,499,512,516,521,759,762,766,769,970,973,977,1004,1013,1022,1026,1029,1032,1035,1675,2402,2785,2788,2791,2795,2798,2975,2979,2992,3011,3017,3021,3024,3041,3046,3050,3065,3071,3074,3077,3102],[12,13,6],"h1",{"id":14},"postgresql-volltextsuche-vs-elasticsearch-wann-die-datenbank-reicht",[16,17,18],"p",{},"Suchfunktionen sind aus modernen Webanwendungen nicht wegzudenken. Die Frage ist nur: Zieht man eine dedizierte Suchmaschine wie Elasticsearch oder OpenSearch, oder reichen die Bordmittel der bereits verwendeten PostgreSQL-Datenbank?",[16,20,21,22,26,27,26,30,33,34,37],{},"Die Antwort hängt stark von den Anforderungen ab. Dieser Artikel zeigt, was PostgreSQL mit ",[23,24,25],"code",{},"tsvector",", ",[23,28,29],{},"pg_trgm",[23,31,32],{},"fuzzystrmatch"," und ",[23,35,36],{},"pgvector"," kann, wo die Grenzen liegen und wann ein dedizierter Suchserver die richtige Wahl ist.",[39,40,42],"h2",{"id":41},"postgresql-bordmittel-für-die-suche","PostgreSQL-Bordmittel für die Suche",[16,44,45],{},"PostgreSQL bringt drei leistungsstarke Erweiterungen für verschiedene Suchszenarien mit, die in der Standardinstallation verfügbar sind – kein zusätzlicher Dienst, keine Betriebskomplexität.",[47,48,50],"h3",{"id":49},"_1-volltextsuche-mit-tsvector-tsquery","1. Volltextsuche mit tsvector \u002F tsquery",[16,52,53],{},"Die Volltextsuche arbeitet auf Wortebene: Sie zerlegt Text in Lexeme (Wortstämme) und kann nach Wortformen suchen.",[55,56],"mermaid",{":config":57,"code":58},"config","flowchart%20LR%0A%20%20Text%5B%22'Die%20Hunde%20laufen'%22%5D%20--%3E%20parser%5B%22Parser%3Cbr%2F%3E%3Csmall%3EWorttrennung%3C%2Fsmall%3E%22%5D%0A%20%20parser%20--%3E%20w1%5B%22'die'%22%5D%0A%20%20parser%20--%3E%20w2%5B%22'hunde'%22%5D%0A%20%20parser%20--%3E%20w3%5B%22'laufen'%22%5D%0A%20%20w1%20--%3E%20sw%5B%22Stopwort%3Cbr%2F%3E%3Csmall%3Ewird%20verworfen%3C%2Fsmall%3E%22%5D%0A%20%20w2%20--%3E%20stemming%5B%22Stemming%3Cbr%2F%3E%3Csmall%3Ehunde%20%E2%86%92%20hund%3C%2Fsmall%3E%22%5D%0A%20%20w3%20--%3E%20stemming2%5B%22Stemming%3Cbr%2F%3E%3Csmall%3Elaufen%20%E2%86%92%20lauf%3C%2Fsmall%3E%22%5D%0A%20%20stemming%20--%3E%20vector%5B%22tsvector%3A%20'hund'%3A1%20'lauf'%3A2%22%5D%0A%20%20stemming2%20--%3E%20vector%0A%20%20style%20sw%20fill%3A%23f99%2Ccolor%3A%23000%0A%20%20style%20vector%20fill%3A%236a6%2Ccolor%3A%23fff",[60,61,66],"pre",{"className":62,"code":63,"language":64,"meta":65,"style":65},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","CREATE TABLE artikel (\n  id SERIAL PRIMARY KEY,\n  titel TEXT,\n  inhalt TEXT,\n  suchvektor TSVECTOR\n    GENERATED ALWAYS AS (\n      to_tsvector('german', titel || ' ' || inhalt)\n    ) STORED\n);\n\nCREATE INDEX idx_suche ON artikel USING GIN (suchvektor);\n\nINSERT INTO artikel (titel, inhalt) VALUES\n  ('Die Datenbank und ihre Performance',\n   'Die Performance einer Datenbank hängt von vielen Faktoren ab.'),\n  ('Auto fahren auf der Autobahn',\n   'Auf der Autobahn mit dem Auto zu fahren macht Spaß.'),\n  ('Hunde laufen im Park',\n   'Die Hunde laufen jeden Morgen durch den Park.');\n\n-- Volltextsuche: findet Artikel 1 (enthält \"Datenbank\" UND \"Performance\")\nSELECT titel FROM artikel\nWHERE suchvektor @@ to_tsquery('german', 'Datenbank & Performance');\n\n-- to_tsquery('german', 'Datenbank & Performance')\n-- → sucht nach Lexemen: 'datenbak' & 'perform'\n-- \"Datenbank\" → Lexem \"datenbak\" ✓\n-- \"Performance\" → Lexem \"perform\" ✓\n","sql","",[23,67,68,76,82,88,94,100,106,112,118,124,131,137,142,148,154,160,166,172,178,184,189,195,201,207,212,218,224,230],{"__ignoreMap":65},[69,70,73],"span",{"class":71,"line":72},"line",1,[69,74,75],{},"CREATE TABLE artikel (\n",[69,77,79],{"class":71,"line":78},2,[69,80,81],{},"  id SERIAL PRIMARY KEY,\n",[69,83,85],{"class":71,"line":84},3,[69,86,87],{},"  titel TEXT,\n",[69,89,91],{"class":71,"line":90},4,[69,92,93],{},"  inhalt TEXT,\n",[69,95,97],{"class":71,"line":96},5,[69,98,99],{},"  suchvektor TSVECTOR\n",[69,101,103],{"class":71,"line":102},6,[69,104,105],{},"    GENERATED ALWAYS AS (\n",[69,107,109],{"class":71,"line":108},7,[69,110,111],{},"      to_tsvector('german', titel || ' ' || inhalt)\n",[69,113,115],{"class":71,"line":114},8,[69,116,117],{},"    ) STORED\n",[69,119,121],{"class":71,"line":120},9,[69,122,123],{},");\n",[69,125,127],{"class":71,"line":126},10,[69,128,130],{"emptyLinePlaceholder":129},true,"\n",[69,132,134],{"class":71,"line":133},11,[69,135,136],{},"CREATE INDEX idx_suche ON artikel USING GIN (suchvektor);\n",[69,138,140],{"class":71,"line":139},12,[69,141,130],{"emptyLinePlaceholder":129},[69,143,145],{"class":71,"line":144},13,[69,146,147],{},"INSERT INTO artikel (titel, inhalt) VALUES\n",[69,149,151],{"class":71,"line":150},14,[69,152,153],{},"  ('Die Datenbank und ihre Performance',\n",[69,155,157],{"class":71,"line":156},15,[69,158,159],{},"   'Die Performance einer Datenbank hängt von vielen Faktoren ab.'),\n",[69,161,163],{"class":71,"line":162},16,[69,164,165],{},"  ('Auto fahren auf der Autobahn',\n",[69,167,169],{"class":71,"line":168},17,[69,170,171],{},"   'Auf der Autobahn mit dem Auto zu fahren macht Spaß.'),\n",[69,173,175],{"class":71,"line":174},18,[69,176,177],{},"  ('Hunde laufen im Park',\n",[69,179,181],{"class":71,"line":180},19,[69,182,183],{},"   'Die Hunde laufen jeden Morgen durch den Park.');\n",[69,185,187],{"class":71,"line":186},20,[69,188,130],{"emptyLinePlaceholder":129},[69,190,192],{"class":71,"line":191},21,[69,193,194],{},"-- Volltextsuche: findet Artikel 1 (enthält \"Datenbank\" UND \"Performance\")\n",[69,196,198],{"class":71,"line":197},22,[69,199,200],{},"SELECT titel FROM artikel\n",[69,202,204],{"class":71,"line":203},23,[69,205,206],{},"WHERE suchvektor @@ to_tsquery('german', 'Datenbank & Performance');\n",[69,208,210],{"class":71,"line":209},24,[69,211,130],{"emptyLinePlaceholder":129},[69,213,215],{"class":71,"line":214},25,[69,216,217],{},"-- to_tsquery('german', 'Datenbank & Performance')\n",[69,219,221],{"class":71,"line":220},26,[69,222,223],{},"-- → sucht nach Lexemen: 'datenbak' & 'perform'\n",[69,225,227],{"class":71,"line":226},27,[69,228,229],{},"-- \"Datenbank\" → Lexem \"datenbak\" ✓\n",[69,231,233],{"class":71,"line":232},28,[69,234,235],{},"-- \"Performance\" → Lexem \"perform\" ✓\n",[16,237,238,239,241,242,245,246,249,250,253,254,257],{},"Der ",[23,240,25],{}," normalisiert Wörter: Aus \"läuft\", \"lief\", \"gelaufen\" wird der gemeinsame Stamm \"lauf\". Die ",[23,243,244],{},"to_tsquery","-Funktion unterstützt ",[23,247,248],{},"&"," (UND), ",[23,251,252],{},"|"," (ODER) und ",[23,255,256],{},"!"," (NICHT). Der GIN-Index macht die Suche auch auf Millionen Datensätzen schnell.",[60,259,261],{"className":62,"code":260,"language":64,"meta":65,"style":65},"-- ODER-Suche: findet Artikel mit \"Auto\" ODER \"Hund\"\nSELECT titel FROM artikel\nWHERE suchvektor @@ to_tsquery('german', 'Auto | Hund');\n\n-- NICHT-Suche: findet Artikel mit \"Auto\", aber NICHT \"Autobahn\"\nSELECT titel FROM artikel\nWHERE suchvektor @@ to_tsquery('german', 'Auto & !Autobahn');\n",[23,262,263,268,272,277,281,286,290],{"__ignoreMap":65},[69,264,265],{"class":71,"line":72},[69,266,267],{},"-- ODER-Suche: findet Artikel mit \"Auto\" ODER \"Hund\"\n",[69,269,270],{"class":71,"line":78},[69,271,200],{},[69,273,274],{"class":71,"line":84},[69,275,276],{},"WHERE suchvektor @@ to_tsquery('german', 'Auto | Hund');\n",[69,278,279],{"class":71,"line":90},[69,280,130],{"emptyLinePlaceholder":129},[69,282,283],{"class":71,"line":96},[69,284,285],{},"-- NICHT-Suche: findet Artikel mit \"Auto\", aber NICHT \"Autobahn\"\n",[69,287,288],{"class":71,"line":102},[69,289,200],{},[69,291,292],{"class":71,"line":108},[69,293,294],{},"WHERE suchvektor @@ to_tsquery('german', 'Auto & !Autobahn');\n",[16,296,297,301],{},[298,299,300],"strong",{},"Grenzen:"," Keine Tippfehlertoleranz („Datenbak\" findet „Datenbank\" nicht), keine Teilwortsuche („auto\" findet nicht „Autobahn\"), keine phonetische Ähnlichkeit („Meier\" ≠ „Meyer\").",[47,303,305],{"id":304},"_2-trigramm-suche-mit-pg_trgm","2. Trigramm-Suche mit pg_trgm",[16,307,308,310],{},[23,309,29],{}," zerlegt Text in Dreierbuchstaben-Gruppen (Trigrams) und ermittelt die Ähnlichkeit über die Überlappung dieser Trigrams.",[55,312],{":config":57,"code":313},"flowchart%20LR%0A%20%20Wort%5B%22'Autobahn'%22%5D%20--%3E%20trigram%5B%22Trigramm-Bildung%22%5D%0A%20%20trigram%20--%3E%20t1%5B%22'%20au'%22%5D%0A%20%20trigram%20--%3E%20t2%5B%22'aut'%22%5D%0A%20%20trigram%20--%3E%20t3%5B%22'uto'%22%5D%0A%20%20trigram%20--%3E%20t4%5B%22'tob'%22%5D%0A%20%20trigram%20--%3E%20t5%5B%22'oba'%22%5D%0A%20%20trigram%20--%3E%20t6%5B%22'bah'%22%5D%0A%20%20trigram%20--%3E%20t7%5B%22'ahn'%22%5D%0A%20%20trigram%20--%3E%20t8%5B%22'hn%20'%22%5D%0A%20%20t1%20--%3E%20set%5B%22Trigramm-Set%3Cbr%2F%3E%3Csmall%3E%7B'%20au'%2C'aut'%2C'uto'%2C%3Cbr%2F%3E'tob'%2C'oba'%2C'bah'%2C%3Cbr%2F%3E'ahn'%2C'hn%20'%7D%3C%2Fsmall%3E%22%5D%0A%20%20t2%20--%3E%20set%0A%20%20t3%20--%3E%20set%0A%20%20t4%20--%3E%20set%0A%20%20t5%20--%3E%20set%0A%20%20t6%20--%3E%20set%0A%20%20t7%20--%3E%20set%0A%20%20t8%20--%3E%20set%0A%20%20style%20set%20fill%3A%236a6%2Ccolor%3A%23fff",[60,315,317],{"className":62,"code":316,"language":64,"meta":65,"style":65},"CREATE EXTENSION IF NOT EXISTS pg_trgm;\n\nCREATE INDEX idx_trgm_titel ON artikel USING GIN (titel gin_trgm_ops);\nCREATE INDEX idx_trgm_inhalt ON artikel USING GIN (inhalt gin_trgm_ops);\n\n-- Tippfehlertoleranz: \"Autobahn\" vs \"Autoban\"\n-- similarity('Autobahn', 'Autoban') → 0.78 (78 % Übereinstimmung)\nSELECT titel, similarity(titel, 'Autoban') AS aehnlichkeit\nFROM artikel\nWHERE titel % 'Autoban'\nORDER BY aehnlichkeit DESC;\n\n-- Expliziter Schwellwert (statt default 0,3)\nSELECT titel, similarity(titel, 'Autoban') AS aehnlichkeit\nFROM artikel\nWHERE similarity(titel, 'Autoban') > 0.5\nORDER BY aehnlichkeit DESC;\n\n-- show() zeigt alle Trigrams eines Strings an\nSELECT show_trgm('Autobahn');\n-- → {\"  a\",\" au\",aut,bah,hn ,oba,oto,tob,uto}\n\n-- show_limit() und set_limit() steuern den Schwellwert\nSELECT set_limit(0.4);\n",[23,318,319,324,328,333,338,342,347,352,357,362,367,372,376,381,385,389,394,398,402,407,412,417,421,426],{"__ignoreMap":65},[69,320,321],{"class":71,"line":72},[69,322,323],{},"CREATE EXTENSION IF NOT EXISTS pg_trgm;\n",[69,325,326],{"class":71,"line":78},[69,327,130],{"emptyLinePlaceholder":129},[69,329,330],{"class":71,"line":84},[69,331,332],{},"CREATE INDEX idx_trgm_titel ON artikel USING GIN (titel gin_trgm_ops);\n",[69,334,335],{"class":71,"line":90},[69,336,337],{},"CREATE INDEX idx_trgm_inhalt ON artikel USING GIN (inhalt gin_trgm_ops);\n",[69,339,340],{"class":71,"line":96},[69,341,130],{"emptyLinePlaceholder":129},[69,343,344],{"class":71,"line":102},[69,345,346],{},"-- Tippfehlertoleranz: \"Autobahn\" vs \"Autoban\"\n",[69,348,349],{"class":71,"line":108},[69,350,351],{},"-- similarity('Autobahn', 'Autoban') → 0.78 (78 % Übereinstimmung)\n",[69,353,354],{"class":71,"line":114},[69,355,356],{},"SELECT titel, similarity(titel, 'Autoban') AS aehnlichkeit\n",[69,358,359],{"class":71,"line":120},[69,360,361],{},"FROM artikel\n",[69,363,364],{"class":71,"line":126},[69,365,366],{},"WHERE titel % 'Autoban'\n",[69,368,369],{"class":71,"line":133},[69,370,371],{},"ORDER BY aehnlichkeit DESC;\n",[69,373,374],{"class":71,"line":139},[69,375,130],{"emptyLinePlaceholder":129},[69,377,378],{"class":71,"line":144},[69,379,380],{},"-- Expliziter Schwellwert (statt default 0,3)\n",[69,382,383],{"class":71,"line":150},[69,384,356],{},[69,386,387],{"class":71,"line":156},[69,388,361],{},[69,390,391],{"class":71,"line":162},[69,392,393],{},"WHERE similarity(titel, 'Autoban') > 0.5\n",[69,395,396],{"class":71,"line":168},[69,397,371],{},[69,399,400],{"class":71,"line":174},[69,401,130],{"emptyLinePlaceholder":129},[69,403,404],{"class":71,"line":180},[69,405,406],{},"-- show() zeigt alle Trigrams eines Strings an\n",[69,408,409],{"class":71,"line":186},[69,410,411],{},"SELECT show_trgm('Autobahn');\n",[69,413,414],{"class":71,"line":191},[69,415,416],{},"-- → {\"  a\",\" au\",aut,bah,hn ,oba,oto,tob,uto}\n",[69,418,419],{"class":71,"line":197},[69,420,130],{"emptyLinePlaceholder":129},[69,422,423],{"class":71,"line":203},[69,424,425],{},"-- show_limit() und set_limit() steuern den Schwellwert\n",[69,427,428],{"class":71,"line":209},[69,429,430],{},"SELECT set_limit(0.4);\n",[60,432,434],{"className":62,"code":433,"language":64,"meta":65,"style":65},"-- Teilwortsuche: ILIKE nutzt den pg_trgm-Index\n-- Findet \"Auto\" auch in \"Autobahn\" oder \"Automatik\"\nSELECT titel FROM artikel WHERE titel ILIKE '%auto%';\n",[23,435,436,441,446],{"__ignoreMap":65},[69,437,438],{"class":71,"line":72},[69,439,440],{},"-- Teilwortsuche: ILIKE nutzt den pg_trgm-Index\n",[69,442,443],{"class":71,"line":78},[69,444,445],{},"-- Findet \"Auto\" auch in \"Autobahn\" oder \"Automatik\"\n",[69,447,448],{"class":71,"line":84},[69,449,450],{},"SELECT titel FROM artikel WHERE titel ILIKE '%auto%';\n",[60,452,454],{"className":62,"code":453,"language":64,"meta":65,"style":65},"-- Gewichtete Sortierung: pg_trgm + tsvector kombinieren\nSELECT titel,\n  similarity(titel, 'Autoban')     AS trigramm_aehnlichkeit,\n  ts_rank(suchvektor,\n    to_tsquery('german', 'Auto'))  AS volltext_relevanz\nFROM artikel\nWHERE titel % 'Autoban'\n   OR suchvektor @@ to_tsquery('german', 'Auto')\nORDER BY trigramm_aehnlichkeit DESC;\n",[23,455,456,461,466,471,476,481,485,489,494],{"__ignoreMap":65},[69,457,458],{"class":71,"line":72},[69,459,460],{},"-- Gewichtete Sortierung: pg_trgm + tsvector kombinieren\n",[69,462,463],{"class":71,"line":78},[69,464,465],{},"SELECT titel,\n",[69,467,468],{"class":71,"line":84},[69,469,470],{},"  similarity(titel, 'Autoban')     AS trigramm_aehnlichkeit,\n",[69,472,473],{"class":71,"line":90},[69,474,475],{},"  ts_rank(suchvektor,\n",[69,477,478],{"class":71,"line":96},[69,479,480],{},"    to_tsquery('german', 'Auto'))  AS volltext_relevanz\n",[69,482,483],{"class":71,"line":102},[69,484,361],{},[69,486,487],{"class":71,"line":108},[69,488,366],{},[69,490,491],{"class":71,"line":114},[69,492,493],{},"   OR suchvektor @@ to_tsquery('german', 'Auto')\n",[69,495,496],{"class":71,"line":120},[69,497,498],{},"ORDER BY trigramm_aehnlichkeit DESC;\n",[16,500,238,501,504,505,508,509,511],{},[23,502,503],{},"%","-Operator und die ",[23,506,507],{},"similarity()","-Funktion arbeiten mit einem Schwellwert (standardmäßig 0,3). ",[23,510,29],{}," liefert echte Tippfehlertoleranz und ermöglicht mit ILIKE auch Teilworttreffer – ohne dass der Text vorher tokenisiert werden muss.",[47,513,515],{"id":514},"_3-phonetische-suche-mit-fuzzystrmatch","3. Phonetische Suche mit fuzzystrmatch",[16,517,518,520],{},[23,519,32],{}," bietet Algorithmen für die klangbasierte Ähnlichkeitssuche – nützlich für Namenssuche, bei der Schreibvarianten häufig sind.",[60,522,524],{"className":62,"code":523,"language":64,"meta":65,"style":65},"CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;\n\n-- === Soundex ===\n-- Kodiert Wörter nach ihrem Klang (Buchstabe + 3 Ziffern)\nSELECT soundex('Meyer');  -- M600\nSELECT soundex('Meier');  -- M600\nSELECT soundex('Maier');  -- M600\n-- Alle drei klingen gleich → gleicher Soundex-Code\n\nSELECT soundex('Meyer') = soundex('Meier'); -- true\nSELECT soundex('Schmidt') = soundex('Schmitt'); -- true\n\n-- === Levenshtein ===\n-- Minimale Anzahl an Edit-Operationen (Einfügen, Löschen, Ersetzen)\nSELECT levenshtein('Hund', 'Hund');   -- 0 (identisch)\nSELECT levenshtein('Hund', 'Hunt');   -- 1 (ein Buchstabe vertauscht)\nSELECT levenshtein('Hund', 'Hunde');  -- 1 (ein Buchstabe fehlt)\nSELECT levenshtein('Schmidt', 'Schmitt'); -- 2 (2 Buchstaben differenz)\n\n-- === Metaphone (deutscher Metaphon) ===\n-- Moderner und sprachsensitiver als Soundex\nSELECT metaphon('Schmidt');  -- SMT\nSELECT metaphon('Schmitt');  -- SMT\nSELECT metaphon('Schmidt') = metaphon('Schmitt'); -- true\n\n-- === Praktische Namenssuche ===\nCREATE TABLE kunden (\n  id SERIAL PRIMARY KEY,\n  vorname TEXT,\n  nachname TEXT\n);\n\nINSERT INTO kunden (vorname, nachname) VALUES\n  ('Thomas', 'Schmidt'),\n  ('Tomas',  'Schmitt'),\n  ('Tom',    'Smith');\n\n-- Finde \"Thomas Schmidt\" trotz Schreibvarianten\nSELECT vorname, nachname,\n  levenshtein(vorname, 'Thomas')  AS vorname_distanz,\n  levenshtein(nachname, 'Schmidt') AS nachname_distanz,\n  metaphon(nachname) = metaphon('Schmidt') AS klang_gleich\nFROM kunden\nWHERE metaphon(nachname) = metaphon('Schmidt')\n   OR levenshtein(nachname, 'Schmidt') \u003C= 2;\n",[23,525,526,531,535,540,545,550,555,560,565,569,574,579,583,588,593,598,603,608,613,617,622,627,632,637,642,646,651,656,660,666,672,677,682,688,694,700,706,711,717,723,729,735,741,747,753],{"__ignoreMap":65},[69,527,528],{"class":71,"line":72},[69,529,530],{},"CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;\n",[69,532,533],{"class":71,"line":78},[69,534,130],{"emptyLinePlaceholder":129},[69,536,537],{"class":71,"line":84},[69,538,539],{},"-- === Soundex ===\n",[69,541,542],{"class":71,"line":90},[69,543,544],{},"-- Kodiert Wörter nach ihrem Klang (Buchstabe + 3 Ziffern)\n",[69,546,547],{"class":71,"line":96},[69,548,549],{},"SELECT soundex('Meyer');  -- M600\n",[69,551,552],{"class":71,"line":102},[69,553,554],{},"SELECT soundex('Meier');  -- M600\n",[69,556,557],{"class":71,"line":108},[69,558,559],{},"SELECT soundex('Maier');  -- M600\n",[69,561,562],{"class":71,"line":114},[69,563,564],{},"-- Alle drei klingen gleich → gleicher Soundex-Code\n",[69,566,567],{"class":71,"line":120},[69,568,130],{"emptyLinePlaceholder":129},[69,570,571],{"class":71,"line":126},[69,572,573],{},"SELECT soundex('Meyer') = soundex('Meier'); -- true\n",[69,575,576],{"class":71,"line":133},[69,577,578],{},"SELECT soundex('Schmidt') = soundex('Schmitt'); -- true\n",[69,580,581],{"class":71,"line":139},[69,582,130],{"emptyLinePlaceholder":129},[69,584,585],{"class":71,"line":144},[69,586,587],{},"-- === Levenshtein ===\n",[69,589,590],{"class":71,"line":150},[69,591,592],{},"-- Minimale Anzahl an Edit-Operationen (Einfügen, Löschen, Ersetzen)\n",[69,594,595],{"class":71,"line":156},[69,596,597],{},"SELECT levenshtein('Hund', 'Hund');   -- 0 (identisch)\n",[69,599,600],{"class":71,"line":162},[69,601,602],{},"SELECT levenshtein('Hund', 'Hunt');   -- 1 (ein Buchstabe vertauscht)\n",[69,604,605],{"class":71,"line":168},[69,606,607],{},"SELECT levenshtein('Hund', 'Hunde');  -- 1 (ein Buchstabe fehlt)\n",[69,609,610],{"class":71,"line":174},[69,611,612],{},"SELECT levenshtein('Schmidt', 'Schmitt'); -- 2 (2 Buchstaben differenz)\n",[69,614,615],{"class":71,"line":180},[69,616,130],{"emptyLinePlaceholder":129},[69,618,619],{"class":71,"line":186},[69,620,621],{},"-- === Metaphone (deutscher Metaphon) ===\n",[69,623,624],{"class":71,"line":191},[69,625,626],{},"-- Moderner und sprachsensitiver als Soundex\n",[69,628,629],{"class":71,"line":197},[69,630,631],{},"SELECT metaphon('Schmidt');  -- SMT\n",[69,633,634],{"class":71,"line":203},[69,635,636],{},"SELECT metaphon('Schmitt');  -- SMT\n",[69,638,639],{"class":71,"line":209},[69,640,641],{},"SELECT metaphon('Schmidt') = metaphon('Schmitt'); -- true\n",[69,643,644],{"class":71,"line":214},[69,645,130],{"emptyLinePlaceholder":129},[69,647,648],{"class":71,"line":220},[69,649,650],{},"-- === Praktische Namenssuche ===\n",[69,652,653],{"class":71,"line":226},[69,654,655],{},"CREATE TABLE kunden (\n",[69,657,658],{"class":71,"line":232},[69,659,81],{},[69,661,663],{"class":71,"line":662},29,[69,664,665],{},"  vorname TEXT,\n",[69,667,669],{"class":71,"line":668},30,[69,670,671],{},"  nachname TEXT\n",[69,673,675],{"class":71,"line":674},31,[69,676,123],{},[69,678,680],{"class":71,"line":679},32,[69,681,130],{"emptyLinePlaceholder":129},[69,683,685],{"class":71,"line":684},33,[69,686,687],{},"INSERT INTO kunden (vorname, nachname) VALUES\n",[69,689,691],{"class":71,"line":690},34,[69,692,693],{},"  ('Thomas', 'Schmidt'),\n",[69,695,697],{"class":71,"line":696},35,[69,698,699],{},"  ('Tomas',  'Schmitt'),\n",[69,701,703],{"class":71,"line":702},36,[69,704,705],{},"  ('Tom',    'Smith');\n",[69,707,709],{"class":71,"line":708},37,[69,710,130],{"emptyLinePlaceholder":129},[69,712,714],{"class":71,"line":713},38,[69,715,716],{},"-- Finde \"Thomas Schmidt\" trotz Schreibvarianten\n",[69,718,720],{"class":71,"line":719},39,[69,721,722],{},"SELECT vorname, nachname,\n",[69,724,726],{"class":71,"line":725},40,[69,727,728],{},"  levenshtein(vorname, 'Thomas')  AS vorname_distanz,\n",[69,730,732],{"class":71,"line":731},41,[69,733,734],{},"  levenshtein(nachname, 'Schmidt') AS nachname_distanz,\n",[69,736,738],{"class":71,"line":737},42,[69,739,740],{},"  metaphon(nachname) = metaphon('Schmidt') AS klang_gleich\n",[69,742,744],{"class":71,"line":743},43,[69,745,746],{},"FROM kunden\n",[69,748,750],{"class":71,"line":749},44,[69,751,752],{},"WHERE metaphon(nachname) = metaphon('Schmidt')\n",[69,754,756],{"class":71,"line":755},45,[69,757,758],{},"   OR levenshtein(nachname, 'Schmidt') \u003C= 2;\n",[55,760],{":config":57,"code":761},"flowchart%20LR%0A%20%20Input%5B%22'Schmidt'%22%5D%20--%3E%20soundex%5B%22Soundex%3Cbr%2F%3E%3Csmall%3ES532%3C%2Fsmall%3E%22%5D%0A%20%20Input%20--%3E%20metaphon%5B%22Metaphon%3Cbr%2F%3E%3Csmall%3ESMT%3C%2Fsmall%3E%22%5D%0A%20%20Input2%5B%22'Schmitt'%22%5D%20--%3E%20soundex2%5B%22Soundex%3Cbr%2F%3E%3Csmall%3ES532%3C%2Fsmall%3E%22%5D%0A%20%20Input2%20--%3E%20metaphon2%5B%22Metaphon%3Cbr%2F%3E%3Csmall%3ESMT%3C%2Fsmall%3E%22%5D%0A%20%20soundex%20--%3E%20eq1%5B%22S532%20%3D%20S532%20%E2%9C%85%22%5D%0A%20%20metaphon%20--%3E%20eq2%5B%22SMT%20%3D%20SMT%20%E2%9C%85%22%5D%0A%20%20soundex2%20--%3E%20eq1%0A%20%20metaphon2%20--%3E%20eq2%0A%20%20style%20eq1%20fill%3A%236a6%2Ccolor%3A%23fff%0A%20%20style%20eq2%20fill%3A%236a6%2Ccolor%3A%23fff",[47,763,765],{"id":764},"_4-alles-kombinieren-universelle-suchfunktion","4. Alles kombinieren: Universelle Suchfunktion",[16,767,768],{},"Die wahre Stärke von PostgreSQL liegt darin, alle Verfahren in einer Abfrage zu vereinen:",[60,770,772],{"className":62,"code":771,"language":64,"meta":65,"style":65},"-- Universelle Suchfunktion\nCREATE OR REPLACE FUNCTION suche_artikel(suchbegriff TEXT)\nRETURNS TABLE(titel TEXT, score FLOAT8) AS $$\nBEGIN\n  RETURN QUERY\n  SELECT a.titel,\n    (\n      -- Volltext-Treffer (höchste Gewichtung)\n      CASE WHEN a.suchvektor @@ to_tsquery('german',\n        replace(suchbegriff, ' ', ' & '))\n        THEN 10 ELSE 0 END\n      +\n      -- Trigramm-Ähnlichkeit\n      COALESCE(similarity(a.titel, suchbegriff) * 5, 0)\n      +\n      -- Phonetik (Bonus für Namensähnlichkeit)\n      CASE WHEN metaphon(a.titel) = metaphon(suchbegriff)\n        THEN 3 ELSE 0 END\n      +\n      -- Kurze Editier-Distanz (max 2 Änderungen)\n      CASE WHEN levenshtein(a.titel, suchbegriff) \u003C= 2\n        THEN 2 ELSE 0 END\n    )::FLOAT8 AS score\n  FROM artikel a\n  WHERE\n    a.suchvektor @@ to_tsquery('german',\n      replace(suchbegriff, ' ', ' & '))\n    OR a.titel % suchbegriff\n    OR metaphon(a.titel) = metaphon(suchbegriff)\n    OR levenshtein(a.titel, suchbegriff) \u003C= 2\n  ORDER BY score DESC\n  LIMIT 10;\nEND;\n$$ LANGUAGE plpgsql;\n\n-- Aufruf mit Tippfehler: findet trotzdem \"Autobahn\"\nSELECT * FROM suche_artikel('Autoban');\n\n-- Aufruf mit phonetischer Variante: findet \"Schmidt\"\nSELECT * FROM suche_artikel('Schmitt');\n",[23,773,774,779,784,789,794,799,804,809,814,819,824,829,834,839,844,848,853,858,863,867,872,877,882,887,892,897,902,907,912,917,922,927,932,937,942,946,951,956,960,965],{"__ignoreMap":65},[69,775,776],{"class":71,"line":72},[69,777,778],{},"-- Universelle Suchfunktion\n",[69,780,781],{"class":71,"line":78},[69,782,783],{},"CREATE OR REPLACE FUNCTION suche_artikel(suchbegriff TEXT)\n",[69,785,786],{"class":71,"line":84},[69,787,788],{},"RETURNS TABLE(titel TEXT, score FLOAT8) AS $$\n",[69,790,791],{"class":71,"line":90},[69,792,793],{},"BEGIN\n",[69,795,796],{"class":71,"line":96},[69,797,798],{},"  RETURN QUERY\n",[69,800,801],{"class":71,"line":102},[69,802,803],{},"  SELECT a.titel,\n",[69,805,806],{"class":71,"line":108},[69,807,808],{},"    (\n",[69,810,811],{"class":71,"line":114},[69,812,813],{},"      -- Volltext-Treffer (höchste Gewichtung)\n",[69,815,816],{"class":71,"line":120},[69,817,818],{},"      CASE WHEN a.suchvektor @@ to_tsquery('german',\n",[69,820,821],{"class":71,"line":126},[69,822,823],{},"        replace(suchbegriff, ' ', ' & '))\n",[69,825,826],{"class":71,"line":133},[69,827,828],{},"        THEN 10 ELSE 0 END\n",[69,830,831],{"class":71,"line":139},[69,832,833],{},"      +\n",[69,835,836],{"class":71,"line":144},[69,837,838],{},"      -- Trigramm-Ähnlichkeit\n",[69,840,841],{"class":71,"line":150},[69,842,843],{},"      COALESCE(similarity(a.titel, suchbegriff) * 5, 0)\n",[69,845,846],{"class":71,"line":156},[69,847,833],{},[69,849,850],{"class":71,"line":162},[69,851,852],{},"      -- Phonetik (Bonus für Namensähnlichkeit)\n",[69,854,855],{"class":71,"line":168},[69,856,857],{},"      CASE WHEN metaphon(a.titel) = metaphon(suchbegriff)\n",[69,859,860],{"class":71,"line":174},[69,861,862],{},"        THEN 3 ELSE 0 END\n",[69,864,865],{"class":71,"line":180},[69,866,833],{},[69,868,869],{"class":71,"line":186},[69,870,871],{},"      -- Kurze Editier-Distanz (max 2 Änderungen)\n",[69,873,874],{"class":71,"line":191},[69,875,876],{},"      CASE WHEN levenshtein(a.titel, suchbegriff) \u003C= 2\n",[69,878,879],{"class":71,"line":197},[69,880,881],{},"        THEN 2 ELSE 0 END\n",[69,883,884],{"class":71,"line":203},[69,885,886],{},"    )::FLOAT8 AS score\n",[69,888,889],{"class":71,"line":209},[69,890,891],{},"  FROM artikel a\n",[69,893,894],{"class":71,"line":214},[69,895,896],{},"  WHERE\n",[69,898,899],{"class":71,"line":220},[69,900,901],{},"    a.suchvektor @@ to_tsquery('german',\n",[69,903,904],{"class":71,"line":226},[69,905,906],{},"      replace(suchbegriff, ' ', ' & '))\n",[69,908,909],{"class":71,"line":232},[69,910,911],{},"    OR a.titel % suchbegriff\n",[69,913,914],{"class":71,"line":662},[69,915,916],{},"    OR metaphon(a.titel) = metaphon(suchbegriff)\n",[69,918,919],{"class":71,"line":668},[69,920,921],{},"    OR levenshtein(a.titel, suchbegriff) \u003C= 2\n",[69,923,924],{"class":71,"line":674},[69,925,926],{},"  ORDER BY score DESC\n",[69,928,929],{"class":71,"line":679},[69,930,931],{},"  LIMIT 10;\n",[69,933,934],{"class":71,"line":684},[69,935,936],{},"END;\n",[69,938,939],{"class":71,"line":690},[69,940,941],{},"$$ LANGUAGE plpgsql;\n",[69,943,944],{"class":71,"line":696},[69,945,130],{"emptyLinePlaceholder":129},[69,947,948],{"class":71,"line":702},[69,949,950],{},"-- Aufruf mit Tippfehler: findet trotzdem \"Autobahn\"\n",[69,952,953],{"class":71,"line":708},[69,954,955],{},"SELECT * FROM suche_artikel('Autoban');\n",[69,957,958],{"class":71,"line":713},[69,959,130],{"emptyLinePlaceholder":129},[69,961,962],{"class":71,"line":719},[69,963,964],{},"-- Aufruf mit phonetischer Variante: findet \"Schmidt\"\n",[69,966,967],{"class":71,"line":725},[69,968,969],{},"SELECT * FROM suche_artikel('Schmitt');\n",[16,971,972],{},"Eine solche Abfrage deckt Volltext-Treffer, Tippfehler, phonetische Varianten und entfernte Ähnlichkeiten gleichzeitig ab – ohne einen externen Dienst. Der Score-Wert lässt sich beliebig anpassen.",[47,974,976],{"id":975},"_5-pgvector-semantische-vektor-suche","5. pgvector – Semantische Vektor-Suche",[16,978,979,981,982,984,985,988,989,992,993,26,996,999,1000,1003],{},[23,980,36],{}," ist eine PostgreSQL-Extension, die Vektor-Ähnlichkeitssuche direkt in der Datenbank ermöglicht. Text, Bilder oder andere Daten werden über Machine-Learning-Modelle (z. B. OpenAI Embeddings, Sentence-Transformers) in numerische Vektoren (Embeddings) umgewandelt. ",[23,983,36],{}," speichert diese Vektoren als eigenen Datentyp (",[23,986,987],{},"vector",") und kann per ",[23,990,991],{},"ORDER BY"," über Distanzmetriken wie ",[23,994,995],{},"L2 distance",[23,997,998],{},"cosine distance"," oder ",[23,1001,1002],{},"inner product"," die ähnlichsten Einträge finden – unterstützt durch IVFFlat- oder HNSW-Indizes für performante ANN-Suche (Approximate Nearest Neighbor).",[16,1005,1006,1007,1009,1010,1012],{},"Im Gegensatz zu ",[23,1008,25],{}," sucht ",[23,1011,36],{}," nicht nach exakten Wörtern oder Lexemen, sondern nach semantischer Ähnlichkeit: „König\" und „Monarch\" liegen im Vektorraum nah beieinander, auch wenn sie keine gemeinsamen Wortstämme teilen. Das Verfahren eignet sich für Empfehlungssysteme, semantische Duplikatserkennung, Ähnlichkeitssuche in Produktkatalogen und Retrieval-Augmented Generation (RAG) in KI-Anwendungen.",[16,1014,1015,1018,1019,1021],{},[298,1016,1017],{},"Bewertung:"," ",[23,1020,36],{}," macht PostgreSQL zu einem ernsthaften Kandidaten für semantische Suche, die früher nur dedizierten Vektor-Datenbanken vorbehalten war. Die Integration in die bestehende SQL-Umgebung und der Verzicht auf einen zusätzlichen Dienst sind große Vorteile. Allerdings ist die Performance bei sehr großen Vektorkollektionen (>10 Mio. Vektoren) und die Feature-Tiefe (kein hybrides Scoring, kein eingebautes Highlighting) nicht mit Elasticsearch 8.x oder OpenSearch 2.x vergleichbar, die Vektor-Suche nativ mit textuellen Queries kombinieren.",[39,1023,1025],{"id":1024},"elasticsearch-opensearch","Elasticsearch \u002F OpenSearch",[16,1027,1028],{},"Dedizierte Suchserver wie Elasticsearch oder die OpenSearch-Variante sind als eigenständige Cluster konzipiert.",[55,1030],{":config":57,"code":1031},"flowchart%20TB%0A%20%20subgraph%20ES%5B%22Elasticsearch-Cluster%22%5D%0A%20%20%20%20n1%5B%22Node%201%3Cbr%2F%3E%3Csmall%3EShard%20A%20(Prim%C3%A4r)%3C%2Fsmall%3E%22%5D%0A%20%20%20%20n2%5B%22Node%202%3Cbr%2F%3E%3Csmall%3EShard%20A%20(Replica)%3Cbr%2F%3EShard%20B%20(Prim%C3%A4r)%3C%2Fsmall%3E%22%5D%0A%20%20%20%20n3%5B%22Node%203%3Cbr%2F%3E%3Csmall%3EShard%20B%20(Replica)%3C%2Fsmall%3E%22%5D%0A%20%20end%0A%20%20app%5B%22Applikation%22%5D%20--%3E%20lb%5B%22Load%20Balancer%22%5D%0A%20%20lb%20--%3E%20n1%0A%20%20lb%20--%3E%20n2%0A%20%20lb%20--%3E%20n3%0A%0A%20%20subgraph%20PG%5B%22PostgreSQL%20(Single-Node)%22%5D%0A%20%20%20%20db%5B%22DB-Server%3Cbr%2F%3E%3Csmall%3EEin%20Index%2C%20kein%20Sharding%3C%2Fsmall%3E%22%5D%0A%20%20end%0A%20%20app2%5B%22Applikation%22%5D%20--%3E%20db%0A%0A%20%20style%20n1%20fill%3A%2339f%2Ccolor%3A%23fff%0A%20%20style%20n2%20fill%3A%2339f%2Ccolor%3A%23fff%0A%20%20style%20n3%20fill%3A%2339f%2Ccolor%3A%23fff%0A%20%20style%20db%20fill%3A%236a6%2Ccolor%3A%23fff",[16,1033,1034],{},"Der Funktionsumfang geht weit über das hinaus, was PostgreSQL bietet:",[60,1036,1040],{"className":1037,"code":1038,"language":1039,"meta":65,"style":65},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Index-Definition mit deutschem Analyzer\nPUT \u002Fartikel\n{\n  \"settings\": {\n    \"analysis\": {\n      \"analyzer\": {\n        \"german_advanced\": {\n          \"type\": \"german\",\n          \"stopwords\": \"_german_\"\n        }\n      }\n    }\n  },\n  \"mappings\": {\n    \"properties\": {\n      \"titel\": {\n        \"type\": \"text\",\n        \"analyzer\": \"german_advanced\",\n        \"fields\": {\n          \"keyword\": { \"type\": \"keyword\" },\n          \"trigram\": {\n            \"type\": \"text\",\n            \"analyzer\": \"trigram\"\n          }\n        }\n      },\n      \"inhalt\":   { \"type\": \"text\", \"analyzer\": \"german_advanced\" },\n      \"status\":   { \"type\": \"keyword\" },\n      \"preis\":    { \"type\": \"float\" },\n      \"tags\":     { \"type\": \"keyword\" },\n      \"erstellt\": { \"type\": \"date\" }\n    }\n  },\n  \"settings\": {\n    \"analysis\": {\n      \"analyzer\": {\n        \"trigram\": {\n          \"tokenizer\": \"ngram\",\n          \"ngram\": { \"min_gram\": 3, \"max_gram\": 3 }\n        }\n      }\n    }\n  }\n}\n","json",[23,1041,1042,1048,1054,1060,1078,1093,1108,1123,1148,1167,1172,1177,1182,1187,1200,1213,1226,1245,1263,1276,1308,1321,1340,1356,1361,1365,1370,1417,1446,1477,1507,1538,1542,1546,1558,1570,1582,1594,1614,1653,1657,1661,1665,1670],{"__ignoreMap":65},[69,1043,1044],{"class":71,"line":72},[69,1045,1047],{"class":1046},"sHwdD","\u002F\u002F Index-Definition mit deutschem Analyzer\n",[69,1049,1050],{"class":71,"line":78},[69,1051,1053],{"class":1052},"sTEyZ","PUT \u002Fartikel\n",[69,1055,1056],{"class":71,"line":84},[69,1057,1059],{"class":1058},"sMK4o","{\n",[69,1061,1062,1065,1069,1072,1075],{"class":71,"line":90},[69,1063,1064],{"class":1058},"  \"",[69,1066,1068],{"class":1067},"spNyl","settings",[69,1070,1071],{"class":1058},"\"",[69,1073,1074],{"class":1058},":",[69,1076,1077],{"class":1058}," {\n",[69,1079,1080,1083,1087,1089,1091],{"class":71,"line":96},[69,1081,1082],{"class":1058},"    \"",[69,1084,1086],{"class":1085},"sBMFI","analysis",[69,1088,1071],{"class":1058},[69,1090,1074],{"class":1058},[69,1092,1077],{"class":1058},[69,1094,1095,1098,1102,1104,1106],{"class":71,"line":102},[69,1096,1097],{"class":1058},"      \"",[69,1099,1101],{"class":1100},"sbssI","analyzer",[69,1103,1071],{"class":1058},[69,1105,1074],{"class":1058},[69,1107,1077],{"class":1058},[69,1109,1110,1113,1117,1119,1121],{"class":71,"line":108},[69,1111,1112],{"class":1058},"        \"",[69,1114,1116],{"class":1115},"swJcz","german_advanced",[69,1118,1071],{"class":1058},[69,1120,1074],{"class":1058},[69,1122,1077],{"class":1058},[69,1124,1125,1128,1132,1134,1136,1139,1143,1145],{"class":71,"line":114},[69,1126,1127],{"class":1058},"          \"",[69,1129,1131],{"class":1130},"su27w","type",[69,1133,1071],{"class":1058},[69,1135,1074],{"class":1058},[69,1137,1138],{"class":1058}," \"",[69,1140,1142],{"class":1141},"sfazB","german",[69,1144,1071],{"class":1058},[69,1146,1147],{"class":1058},",\n",[69,1149,1150,1152,1155,1157,1159,1161,1164],{"class":71,"line":120},[69,1151,1127],{"class":1058},[69,1153,1154],{"class":1130},"stopwords",[69,1156,1071],{"class":1058},[69,1158,1074],{"class":1058},[69,1160,1138],{"class":1058},[69,1162,1163],{"class":1141},"_german_",[69,1165,1166],{"class":1058},"\"\n",[69,1168,1169],{"class":71,"line":126},[69,1170,1171],{"class":1058},"        }\n",[69,1173,1174],{"class":71,"line":133},[69,1175,1176],{"class":1058},"      }\n",[69,1178,1179],{"class":71,"line":139},[69,1180,1181],{"class":1058},"    }\n",[69,1183,1184],{"class":71,"line":144},[69,1185,1186],{"class":1058},"  },\n",[69,1188,1189,1191,1194,1196,1198],{"class":71,"line":150},[69,1190,1064],{"class":1058},[69,1192,1193],{"class":1067},"mappings",[69,1195,1071],{"class":1058},[69,1197,1074],{"class":1058},[69,1199,1077],{"class":1058},[69,1201,1202,1204,1207,1209,1211],{"class":71,"line":156},[69,1203,1082],{"class":1058},[69,1205,1206],{"class":1085},"properties",[69,1208,1071],{"class":1058},[69,1210,1074],{"class":1058},[69,1212,1077],{"class":1058},[69,1214,1215,1217,1220,1222,1224],{"class":71,"line":162},[69,1216,1097],{"class":1058},[69,1218,1219],{"class":1100},"titel",[69,1221,1071],{"class":1058},[69,1223,1074],{"class":1058},[69,1225,1077],{"class":1058},[69,1227,1228,1230,1232,1234,1236,1238,1241,1243],{"class":71,"line":168},[69,1229,1112],{"class":1058},[69,1231,1131],{"class":1115},[69,1233,1071],{"class":1058},[69,1235,1074],{"class":1058},[69,1237,1138],{"class":1058},[69,1239,1240],{"class":1141},"text",[69,1242,1071],{"class":1058},[69,1244,1147],{"class":1058},[69,1246,1247,1249,1251,1253,1255,1257,1259,1261],{"class":71,"line":174},[69,1248,1112],{"class":1058},[69,1250,1101],{"class":1115},[69,1252,1071],{"class":1058},[69,1254,1074],{"class":1058},[69,1256,1138],{"class":1058},[69,1258,1116],{"class":1141},[69,1260,1071],{"class":1058},[69,1262,1147],{"class":1058},[69,1264,1265,1267,1270,1272,1274],{"class":71,"line":180},[69,1266,1112],{"class":1058},[69,1268,1269],{"class":1115},"fields",[69,1271,1071],{"class":1058},[69,1273,1074],{"class":1058},[69,1275,1077],{"class":1058},[69,1277,1278,1280,1283,1285,1287,1290,1292,1295,1297,1299,1301,1303,1305],{"class":71,"line":186},[69,1279,1127],{"class":1058},[69,1281,1282],{"class":1130},"keyword",[69,1284,1071],{"class":1058},[69,1286,1074],{"class":1058},[69,1288,1289],{"class":1058}," {",[69,1291,1138],{"class":1058},[69,1293,1131],{"class":1294},"s2Zo4",[69,1296,1071],{"class":1058},[69,1298,1074],{"class":1058},[69,1300,1138],{"class":1058},[69,1302,1282],{"class":1141},[69,1304,1071],{"class":1058},[69,1306,1307],{"class":1058}," },\n",[69,1309,1310,1312,1315,1317,1319],{"class":71,"line":191},[69,1311,1127],{"class":1058},[69,1313,1314],{"class":1130},"trigram",[69,1316,1071],{"class":1058},[69,1318,1074],{"class":1058},[69,1320,1077],{"class":1058},[69,1322,1323,1326,1328,1330,1332,1334,1336,1338],{"class":71,"line":197},[69,1324,1325],{"class":1058},"            \"",[69,1327,1131],{"class":1294},[69,1329,1071],{"class":1058},[69,1331,1074],{"class":1058},[69,1333,1138],{"class":1058},[69,1335,1240],{"class":1141},[69,1337,1071],{"class":1058},[69,1339,1147],{"class":1058},[69,1341,1342,1344,1346,1348,1350,1352,1354],{"class":71,"line":203},[69,1343,1325],{"class":1058},[69,1345,1101],{"class":1294},[69,1347,1071],{"class":1058},[69,1349,1074],{"class":1058},[69,1351,1138],{"class":1058},[69,1353,1314],{"class":1141},[69,1355,1166],{"class":1058},[69,1357,1358],{"class":71,"line":209},[69,1359,1360],{"class":1058},"          }\n",[69,1362,1363],{"class":71,"line":214},[69,1364,1171],{"class":1058},[69,1366,1367],{"class":71,"line":220},[69,1368,1369],{"class":1058},"      },\n",[69,1371,1372,1374,1377,1379,1381,1384,1386,1388,1390,1392,1394,1396,1398,1401,1403,1405,1407,1409,1411,1413,1415],{"class":71,"line":226},[69,1373,1097],{"class":1058},[69,1375,1376],{"class":1100},"inhalt",[69,1378,1071],{"class":1058},[69,1380,1074],{"class":1058},[69,1382,1383],{"class":1058},"   {",[69,1385,1138],{"class":1058},[69,1387,1131],{"class":1115},[69,1389,1071],{"class":1058},[69,1391,1074],{"class":1058},[69,1393,1138],{"class":1058},[69,1395,1240],{"class":1141},[69,1397,1071],{"class":1058},[69,1399,1400],{"class":1058},",",[69,1402,1138],{"class":1058},[69,1404,1101],{"class":1115},[69,1406,1071],{"class":1058},[69,1408,1074],{"class":1058},[69,1410,1138],{"class":1058},[69,1412,1116],{"class":1141},[69,1414,1071],{"class":1058},[69,1416,1307],{"class":1058},[69,1418,1419,1421,1424,1426,1428,1430,1432,1434,1436,1438,1440,1442,1444],{"class":71,"line":232},[69,1420,1097],{"class":1058},[69,1422,1423],{"class":1100},"status",[69,1425,1071],{"class":1058},[69,1427,1074],{"class":1058},[69,1429,1383],{"class":1058},[69,1431,1138],{"class":1058},[69,1433,1131],{"class":1115},[69,1435,1071],{"class":1058},[69,1437,1074],{"class":1058},[69,1439,1138],{"class":1058},[69,1441,1282],{"class":1141},[69,1443,1071],{"class":1058},[69,1445,1307],{"class":1058},[69,1447,1448,1450,1453,1455,1457,1460,1462,1464,1466,1468,1470,1473,1475],{"class":71,"line":662},[69,1449,1097],{"class":1058},[69,1451,1452],{"class":1100},"preis",[69,1454,1071],{"class":1058},[69,1456,1074],{"class":1058},[69,1458,1459],{"class":1058},"    {",[69,1461,1138],{"class":1058},[69,1463,1131],{"class":1115},[69,1465,1071],{"class":1058},[69,1467,1074],{"class":1058},[69,1469,1138],{"class":1058},[69,1471,1472],{"class":1141},"float",[69,1474,1071],{"class":1058},[69,1476,1307],{"class":1058},[69,1478,1479,1481,1484,1486,1488,1491,1493,1495,1497,1499,1501,1503,1505],{"class":71,"line":668},[69,1480,1097],{"class":1058},[69,1482,1483],{"class":1100},"tags",[69,1485,1071],{"class":1058},[69,1487,1074],{"class":1058},[69,1489,1490],{"class":1058},"     {",[69,1492,1138],{"class":1058},[69,1494,1131],{"class":1115},[69,1496,1071],{"class":1058},[69,1498,1074],{"class":1058},[69,1500,1138],{"class":1058},[69,1502,1282],{"class":1141},[69,1504,1071],{"class":1058},[69,1506,1307],{"class":1058},[69,1508,1509,1511,1514,1516,1518,1520,1522,1524,1526,1528,1530,1533,1535],{"class":71,"line":674},[69,1510,1097],{"class":1058},[69,1512,1513],{"class":1100},"erstellt",[69,1515,1071],{"class":1058},[69,1517,1074],{"class":1058},[69,1519,1289],{"class":1058},[69,1521,1138],{"class":1058},[69,1523,1131],{"class":1115},[69,1525,1071],{"class":1058},[69,1527,1074],{"class":1058},[69,1529,1138],{"class":1058},[69,1531,1532],{"class":1141},"date",[69,1534,1071],{"class":1058},[69,1536,1537],{"class":1058}," }\n",[69,1539,1540],{"class":71,"line":679},[69,1541,1181],{"class":1058},[69,1543,1544],{"class":71,"line":684},[69,1545,1186],{"class":1058},[69,1547,1548,1550,1552,1554,1556],{"class":71,"line":690},[69,1549,1064],{"class":1058},[69,1551,1068],{"class":1067},[69,1553,1071],{"class":1058},[69,1555,1074],{"class":1058},[69,1557,1077],{"class":1058},[69,1559,1560,1562,1564,1566,1568],{"class":71,"line":696},[69,1561,1082],{"class":1058},[69,1563,1086],{"class":1085},[69,1565,1071],{"class":1058},[69,1567,1074],{"class":1058},[69,1569,1077],{"class":1058},[69,1571,1572,1574,1576,1578,1580],{"class":71,"line":702},[69,1573,1097],{"class":1058},[69,1575,1101],{"class":1100},[69,1577,1071],{"class":1058},[69,1579,1074],{"class":1058},[69,1581,1077],{"class":1058},[69,1583,1584,1586,1588,1590,1592],{"class":71,"line":708},[69,1585,1112],{"class":1058},[69,1587,1314],{"class":1115},[69,1589,1071],{"class":1058},[69,1591,1074],{"class":1058},[69,1593,1077],{"class":1058},[69,1595,1596,1598,1601,1603,1605,1607,1610,1612],{"class":71,"line":713},[69,1597,1127],{"class":1058},[69,1599,1600],{"class":1130},"tokenizer",[69,1602,1071],{"class":1058},[69,1604,1074],{"class":1058},[69,1606,1138],{"class":1058},[69,1608,1609],{"class":1141},"ngram",[69,1611,1071],{"class":1058},[69,1613,1147],{"class":1058},[69,1615,1616,1618,1620,1622,1624,1626,1628,1631,1633,1635,1638,1640,1642,1645,1647,1649,1651],{"class":71,"line":719},[69,1617,1127],{"class":1058},[69,1619,1609],{"class":1130},[69,1621,1071],{"class":1058},[69,1623,1074],{"class":1058},[69,1625,1289],{"class":1058},[69,1627,1138],{"class":1058},[69,1629,1630],{"class":1294},"min_gram",[69,1632,1071],{"class":1058},[69,1634,1074],{"class":1058},[69,1636,1637],{"class":1100}," 3",[69,1639,1400],{"class":1058},[69,1641,1138],{"class":1058},[69,1643,1644],{"class":1294},"max_gram",[69,1646,1071],{"class":1058},[69,1648,1074],{"class":1058},[69,1650,1637],{"class":1100},[69,1652,1537],{"class":1058},[69,1654,1655],{"class":71,"line":725},[69,1656,1171],{"class":1058},[69,1658,1659],{"class":71,"line":731},[69,1660,1176],{"class":1058},[69,1662,1663],{"class":71,"line":737},[69,1664,1181],{"class":1058},[69,1666,1667],{"class":71,"line":743},[69,1668,1669],{"class":1058},"  }\n",[69,1671,1672],{"class":71,"line":749},[69,1673,1674],{"class":1058},"}\n",[60,1676,1678],{"className":1037,"code":1677,"language":1039,"meta":65,"style":65},"\u002F\u002F Komplexe Suche mit Highlighting, Filtern, Boosting und Aggregation\nGET \u002Fartikel\u002F_search\n{\n  \"query\": {\n    \"bool\": {\n      \"must\": [\n        {\n          \"match\": {\n            \"titel\": {\n              \"query\": \"Autobahn\",\n              \"fuzziness\": \"AUTO\",\n              \"operator\": \"and\",\n              \"boost\": 3.0\n            }\n          }\n        }\n      ],\n      \"filter\": [\n        { \"term\": { \"status\": \"published\" } },\n        { \"range\": { \"preis\": { \"lte\": 100 } } }\n      ],\n      \"should\": [\n        { \"match\": { \"tags\": \"neu\" } }\n      ]\n    }\n  },\n  \"aggregations\": {\n    \"preis_gruppen\": {\n      \"range\": {\n        \"field\": \"preis\",\n        \"ranges\": [\n          { \"to\": 10 },\n          { \"from\": 10, \"to\": 50 },\n          { \"from\": 50 }\n        ]\n      }\n    },\n    \"tags\": {\n      \"terms\": { \"field\": \"tags\", \"size\": 20 }\n    }\n  },\n  \"highlight\": {\n    \"fields\": {\n      \"titel\": { \"number_of_fragments\": 0 },\n      \"inhalt\": { \"fragment_size\": 150 }\n    }\n  },\n  \"suggest\": {\n    \"did_you_mean\": {\n      \"text\": \"Autoban\",\n      \"term\": { \"field\": \"titel\" }\n    }\n  }\n}\n",[23,1679,1680,1685,1690,1694,1707,1720,1734,1739,1752,1764,1784,1804,1824,1838,1843,1847,1851,1856,1869,1905,1948,1952,1965,1998,2003,2007,2011,2024,2037,2049,2068,2081,2100,2130,2146,2151,2155,2160,2172,2215,2219,2223,2236,2248,2274,2300,2305,2310,2324,2338,2358,2387,2392,2397],{"__ignoreMap":65},[69,1681,1682],{"class":71,"line":72},[69,1683,1684],{"class":1046},"\u002F\u002F Komplexe Suche mit Highlighting, Filtern, Boosting und Aggregation\n",[69,1686,1687],{"class":71,"line":78},[69,1688,1689],{"class":1052},"GET \u002Fartikel\u002F_search\n",[69,1691,1692],{"class":71,"line":84},[69,1693,1059],{"class":1058},[69,1695,1696,1698,1701,1703,1705],{"class":71,"line":90},[69,1697,1064],{"class":1058},[69,1699,1700],{"class":1067},"query",[69,1702,1071],{"class":1058},[69,1704,1074],{"class":1058},[69,1706,1077],{"class":1058},[69,1708,1709,1711,1714,1716,1718],{"class":71,"line":96},[69,1710,1082],{"class":1058},[69,1712,1713],{"class":1085},"bool",[69,1715,1071],{"class":1058},[69,1717,1074],{"class":1058},[69,1719,1077],{"class":1058},[69,1721,1722,1724,1727,1729,1731],{"class":71,"line":102},[69,1723,1097],{"class":1058},[69,1725,1726],{"class":1100},"must",[69,1728,1071],{"class":1058},[69,1730,1074],{"class":1058},[69,1732,1733],{"class":1058}," [\n",[69,1735,1736],{"class":71,"line":108},[69,1737,1738],{"class":1058},"        {\n",[69,1740,1741,1743,1746,1748,1750],{"class":71,"line":114},[69,1742,1127],{"class":1058},[69,1744,1745],{"class":1115},"match",[69,1747,1071],{"class":1058},[69,1749,1074],{"class":1058},[69,1751,1077],{"class":1058},[69,1753,1754,1756,1758,1760,1762],{"class":71,"line":120},[69,1755,1325],{"class":1058},[69,1757,1219],{"class":1130},[69,1759,1071],{"class":1058},[69,1761,1074],{"class":1058},[69,1763,1077],{"class":1058},[69,1765,1766,1769,1771,1773,1775,1777,1780,1782],{"class":71,"line":126},[69,1767,1768],{"class":1058},"              \"",[69,1770,1700],{"class":1294},[69,1772,1071],{"class":1058},[69,1774,1074],{"class":1058},[69,1776,1138],{"class":1058},[69,1778,1779],{"class":1141},"Autobahn",[69,1781,1071],{"class":1058},[69,1783,1147],{"class":1058},[69,1785,1786,1788,1791,1793,1795,1797,1800,1802],{"class":71,"line":133},[69,1787,1768],{"class":1058},[69,1789,1790],{"class":1294},"fuzziness",[69,1792,1071],{"class":1058},[69,1794,1074],{"class":1058},[69,1796,1138],{"class":1058},[69,1798,1799],{"class":1141},"AUTO",[69,1801,1071],{"class":1058},[69,1803,1147],{"class":1058},[69,1805,1806,1808,1811,1813,1815,1817,1820,1822],{"class":71,"line":139},[69,1807,1768],{"class":1058},[69,1809,1810],{"class":1294},"operator",[69,1812,1071],{"class":1058},[69,1814,1074],{"class":1058},[69,1816,1138],{"class":1058},[69,1818,1819],{"class":1141},"and",[69,1821,1071],{"class":1058},[69,1823,1147],{"class":1058},[69,1825,1826,1828,1831,1833,1835],{"class":71,"line":144},[69,1827,1768],{"class":1058},[69,1829,1830],{"class":1294},"boost",[69,1832,1071],{"class":1058},[69,1834,1074],{"class":1058},[69,1836,1837],{"class":1100}," 3.0\n",[69,1839,1840],{"class":71,"line":150},[69,1841,1842],{"class":1058},"            }\n",[69,1844,1845],{"class":71,"line":156},[69,1846,1360],{"class":1058},[69,1848,1849],{"class":71,"line":162},[69,1850,1171],{"class":1058},[69,1852,1853],{"class":71,"line":168},[69,1854,1855],{"class":1058},"      ],\n",[69,1857,1858,1860,1863,1865,1867],{"class":71,"line":174},[69,1859,1097],{"class":1058},[69,1861,1862],{"class":1100},"filter",[69,1864,1071],{"class":1058},[69,1866,1074],{"class":1058},[69,1868,1733],{"class":1058},[69,1870,1871,1874,1876,1879,1881,1883,1885,1887,1889,1891,1893,1895,1898,1900,1903],{"class":71,"line":180},[69,1872,1873],{"class":1058},"        {",[69,1875,1138],{"class":1058},[69,1877,1878],{"class":1115},"term",[69,1880,1071],{"class":1058},[69,1882,1074],{"class":1058},[69,1884,1289],{"class":1058},[69,1886,1138],{"class":1058},[69,1888,1423],{"class":1130},[69,1890,1071],{"class":1058},[69,1892,1074],{"class":1058},[69,1894,1138],{"class":1058},[69,1896,1897],{"class":1141},"published",[69,1899,1071],{"class":1058},[69,1901,1902],{"class":1058}," }",[69,1904,1307],{"class":1058},[69,1906,1907,1909,1911,1914,1916,1918,1920,1922,1924,1926,1928,1930,1932,1935,1937,1939,1942,1944,1946],{"class":71,"line":186},[69,1908,1873],{"class":1058},[69,1910,1138],{"class":1058},[69,1912,1913],{"class":1115},"range",[69,1915,1071],{"class":1058},[69,1917,1074],{"class":1058},[69,1919,1289],{"class":1058},[69,1921,1138],{"class":1058},[69,1923,1452],{"class":1130},[69,1925,1071],{"class":1058},[69,1927,1074],{"class":1058},[69,1929,1289],{"class":1058},[69,1931,1138],{"class":1058},[69,1933,1934],{"class":1294},"lte",[69,1936,1071],{"class":1058},[69,1938,1074],{"class":1058},[69,1940,1941],{"class":1100}," 100",[69,1943,1902],{"class":1058},[69,1945,1902],{"class":1058},[69,1947,1537],{"class":1058},[69,1949,1950],{"class":71,"line":191},[69,1951,1855],{"class":1058},[69,1953,1954,1956,1959,1961,1963],{"class":71,"line":197},[69,1955,1097],{"class":1058},[69,1957,1958],{"class":1100},"should",[69,1960,1071],{"class":1058},[69,1962,1074],{"class":1058},[69,1964,1733],{"class":1058},[69,1966,1967,1969,1971,1973,1975,1977,1979,1981,1983,1985,1987,1989,1992,1994,1996],{"class":71,"line":203},[69,1968,1873],{"class":1058},[69,1970,1138],{"class":1058},[69,1972,1745],{"class":1115},[69,1974,1071],{"class":1058},[69,1976,1074],{"class":1058},[69,1978,1289],{"class":1058},[69,1980,1138],{"class":1058},[69,1982,1483],{"class":1130},[69,1984,1071],{"class":1058},[69,1986,1074],{"class":1058},[69,1988,1138],{"class":1058},[69,1990,1991],{"class":1141},"neu",[69,1993,1071],{"class":1058},[69,1995,1902],{"class":1058},[69,1997,1537],{"class":1058},[69,1999,2000],{"class":71,"line":209},[69,2001,2002],{"class":1058},"      ]\n",[69,2004,2005],{"class":71,"line":214},[69,2006,1181],{"class":1058},[69,2008,2009],{"class":71,"line":220},[69,2010,1186],{"class":1058},[69,2012,2013,2015,2018,2020,2022],{"class":71,"line":226},[69,2014,1064],{"class":1058},[69,2016,2017],{"class":1067},"aggregations",[69,2019,1071],{"class":1058},[69,2021,1074],{"class":1058},[69,2023,1077],{"class":1058},[69,2025,2026,2028,2031,2033,2035],{"class":71,"line":232},[69,2027,1082],{"class":1058},[69,2029,2030],{"class":1085},"preis_gruppen",[69,2032,1071],{"class":1058},[69,2034,1074],{"class":1058},[69,2036,1077],{"class":1058},[69,2038,2039,2041,2043,2045,2047],{"class":71,"line":662},[69,2040,1097],{"class":1058},[69,2042,1913],{"class":1100},[69,2044,1071],{"class":1058},[69,2046,1074],{"class":1058},[69,2048,1077],{"class":1058},[69,2050,2051,2053,2056,2058,2060,2062,2064,2066],{"class":71,"line":668},[69,2052,1112],{"class":1058},[69,2054,2055],{"class":1115},"field",[69,2057,1071],{"class":1058},[69,2059,1074],{"class":1058},[69,2061,1138],{"class":1058},[69,2063,1452],{"class":1141},[69,2065,1071],{"class":1058},[69,2067,1147],{"class":1058},[69,2069,2070,2072,2075,2077,2079],{"class":71,"line":674},[69,2071,1112],{"class":1058},[69,2073,2074],{"class":1115},"ranges",[69,2076,1071],{"class":1058},[69,2078,1074],{"class":1058},[69,2080,1733],{"class":1058},[69,2082,2083,2086,2088,2091,2093,2095,2098],{"class":71,"line":679},[69,2084,2085],{"class":1058},"          {",[69,2087,1138],{"class":1058},[69,2089,2090],{"class":1130},"to",[69,2092,1071],{"class":1058},[69,2094,1074],{"class":1058},[69,2096,2097],{"class":1100}," 10",[69,2099,1307],{"class":1058},[69,2101,2102,2104,2106,2109,2111,2113,2115,2117,2119,2121,2123,2125,2128],{"class":71,"line":684},[69,2103,2085],{"class":1058},[69,2105,1138],{"class":1058},[69,2107,2108],{"class":1130},"from",[69,2110,1071],{"class":1058},[69,2112,1074],{"class":1058},[69,2114,2097],{"class":1100},[69,2116,1400],{"class":1058},[69,2118,1138],{"class":1058},[69,2120,2090],{"class":1130},[69,2122,1071],{"class":1058},[69,2124,1074],{"class":1058},[69,2126,2127],{"class":1100}," 50",[69,2129,1307],{"class":1058},[69,2131,2132,2134,2136,2138,2140,2142,2144],{"class":71,"line":690},[69,2133,2085],{"class":1058},[69,2135,1138],{"class":1058},[69,2137,2108],{"class":1130},[69,2139,1071],{"class":1058},[69,2141,1074],{"class":1058},[69,2143,2127],{"class":1100},[69,2145,1537],{"class":1058},[69,2147,2148],{"class":71,"line":696},[69,2149,2150],{"class":1058},"        ]\n",[69,2152,2153],{"class":71,"line":702},[69,2154,1176],{"class":1058},[69,2156,2157],{"class":71,"line":708},[69,2158,2159],{"class":1058},"    },\n",[69,2161,2162,2164,2166,2168,2170],{"class":71,"line":713},[69,2163,1082],{"class":1058},[69,2165,1483],{"class":1085},[69,2167,1071],{"class":1058},[69,2169,1074],{"class":1058},[69,2171,1077],{"class":1058},[69,2173,2174,2176,2179,2181,2183,2185,2187,2189,2191,2193,2195,2197,2199,2201,2203,2206,2208,2210,2213],{"class":71,"line":719},[69,2175,1097],{"class":1058},[69,2177,2178],{"class":1100},"terms",[69,2180,1071],{"class":1058},[69,2182,1074],{"class":1058},[69,2184,1289],{"class":1058},[69,2186,1138],{"class":1058},[69,2188,2055],{"class":1115},[69,2190,1071],{"class":1058},[69,2192,1074],{"class":1058},[69,2194,1138],{"class":1058},[69,2196,1483],{"class":1141},[69,2198,1071],{"class":1058},[69,2200,1400],{"class":1058},[69,2202,1138],{"class":1058},[69,2204,2205],{"class":1115},"size",[69,2207,1071],{"class":1058},[69,2209,1074],{"class":1058},[69,2211,2212],{"class":1100}," 20",[69,2214,1537],{"class":1058},[69,2216,2217],{"class":71,"line":725},[69,2218,1181],{"class":1058},[69,2220,2221],{"class":71,"line":731},[69,2222,1186],{"class":1058},[69,2224,2225,2227,2230,2232,2234],{"class":71,"line":737},[69,2226,1064],{"class":1058},[69,2228,2229],{"class":1067},"highlight",[69,2231,1071],{"class":1058},[69,2233,1074],{"class":1058},[69,2235,1077],{"class":1058},[69,2237,2238,2240,2242,2244,2246],{"class":71,"line":743},[69,2239,1082],{"class":1058},[69,2241,1269],{"class":1085},[69,2243,1071],{"class":1058},[69,2245,1074],{"class":1058},[69,2247,1077],{"class":1058},[69,2249,2250,2252,2254,2256,2258,2260,2262,2265,2267,2269,2272],{"class":71,"line":749},[69,2251,1097],{"class":1058},[69,2253,1219],{"class":1100},[69,2255,1071],{"class":1058},[69,2257,1074],{"class":1058},[69,2259,1289],{"class":1058},[69,2261,1138],{"class":1058},[69,2263,2264],{"class":1115},"number_of_fragments",[69,2266,1071],{"class":1058},[69,2268,1074],{"class":1058},[69,2270,2271],{"class":1100}," 0",[69,2273,1307],{"class":1058},[69,2275,2276,2278,2280,2282,2284,2286,2288,2291,2293,2295,2298],{"class":71,"line":755},[69,2277,1097],{"class":1058},[69,2279,1376],{"class":1100},[69,2281,1071],{"class":1058},[69,2283,1074],{"class":1058},[69,2285,1289],{"class":1058},[69,2287,1138],{"class":1058},[69,2289,2290],{"class":1115},"fragment_size",[69,2292,1071],{"class":1058},[69,2294,1074],{"class":1058},[69,2296,2297],{"class":1100}," 150",[69,2299,1537],{"class":1058},[69,2301,2303],{"class":71,"line":2302},46,[69,2304,1181],{"class":1058},[69,2306,2308],{"class":71,"line":2307},47,[69,2309,1186],{"class":1058},[69,2311,2313,2315,2318,2320,2322],{"class":71,"line":2312},48,[69,2314,1064],{"class":1058},[69,2316,2317],{"class":1067},"suggest",[69,2319,1071],{"class":1058},[69,2321,1074],{"class":1058},[69,2323,1077],{"class":1058},[69,2325,2327,2329,2332,2334,2336],{"class":71,"line":2326},49,[69,2328,1082],{"class":1058},[69,2330,2331],{"class":1085},"did_you_mean",[69,2333,1071],{"class":1058},[69,2335,1074],{"class":1058},[69,2337,1077],{"class":1058},[69,2339,2341,2343,2345,2347,2349,2351,2354,2356],{"class":71,"line":2340},50,[69,2342,1097],{"class":1058},[69,2344,1240],{"class":1100},[69,2346,1071],{"class":1058},[69,2348,1074],{"class":1058},[69,2350,1138],{"class":1058},[69,2352,2353],{"class":1141},"Autoban",[69,2355,1071],{"class":1058},[69,2357,1147],{"class":1058},[69,2359,2361,2363,2365,2367,2369,2371,2373,2375,2377,2379,2381,2383,2385],{"class":71,"line":2360},51,[69,2362,1097],{"class":1058},[69,2364,1878],{"class":1100},[69,2366,1071],{"class":1058},[69,2368,1074],{"class":1058},[69,2370,1289],{"class":1058},[69,2372,1138],{"class":1058},[69,2374,2055],{"class":1115},[69,2376,1071],{"class":1058},[69,2378,1074],{"class":1058},[69,2380,1138],{"class":1058},[69,2382,1219],{"class":1141},[69,2384,1071],{"class":1058},[69,2386,1537],{"class":1058},[69,2388,2390],{"class":71,"line":2389},52,[69,2391,1181],{"class":1058},[69,2393,2395],{"class":71,"line":2394},53,[69,2396,1669],{"class":1058},[69,2398,2400],{"class":71,"line":2399},54,[69,2401,1674],{"class":1058},[60,2403,2405],{"className":1037,"code":2404,"language":1039,"meta":65,"style":65},"\u002F\u002F Antwort (Auszug)\n{\n  \"hits\": {\n    \"total\": 42,\n    \"hits\": [\n      {\n        \"_score\": 12.34,\n        \"_source\": { \"titel\": \"Auto fahren auf der Autobahn\" },\n        \"highlight\": {\n          \"titel\": [\"Auto fahren auf der \u003Cem>Autobahn\u003C\u002Fem>\"]\n        }\n      }\n    ]\n  },\n  \"aggregations\": {\n    \"preis_gruppen\": {\n      \"buckets\": [\n        { \"key\": \"*-10.0\",   \"doc_count\": 12 },\n        { \"key\": \"10.0-50.0\",\"doc_count\": 24 },\n        { \"key\": \"50.0-*\",   \"doc_count\": 6 }\n      ]\n    }\n  },\n  \"suggest\": {\n    \"did_you_mean\": [\n      { \"text\": \"Autobahn\", \"score\": 0.95 }\n    ]\n  }\n}\n",[23,2406,2407,2412,2416,2429,2445,2457,2462,2478,2508,2520,2543,2547,2551,2556,2560,2572,2584,2597,2634,2668,2702,2706,2710,2714,2726,2738,2773,2777,2781],{"__ignoreMap":65},[69,2408,2409],{"class":71,"line":72},[69,2410,2411],{"class":1046},"\u002F\u002F Antwort (Auszug)\n",[69,2413,2414],{"class":71,"line":78},[69,2415,1059],{"class":1058},[69,2417,2418,2420,2423,2425,2427],{"class":71,"line":84},[69,2419,1064],{"class":1058},[69,2421,2422],{"class":1067},"hits",[69,2424,1071],{"class":1058},[69,2426,1074],{"class":1058},[69,2428,1077],{"class":1058},[69,2430,2431,2433,2436,2438,2440,2443],{"class":71,"line":90},[69,2432,1082],{"class":1058},[69,2434,2435],{"class":1085},"total",[69,2437,1071],{"class":1058},[69,2439,1074],{"class":1058},[69,2441,2442],{"class":1100}," 42",[69,2444,1147],{"class":1058},[69,2446,2447,2449,2451,2453,2455],{"class":71,"line":96},[69,2448,1082],{"class":1058},[69,2450,2422],{"class":1085},[69,2452,1071],{"class":1058},[69,2454,1074],{"class":1058},[69,2456,1733],{"class":1058},[69,2458,2459],{"class":71,"line":102},[69,2460,2461],{"class":1058},"      {\n",[69,2463,2464,2466,2469,2471,2473,2476],{"class":71,"line":108},[69,2465,1112],{"class":1058},[69,2467,2468],{"class":1100},"_score",[69,2470,1071],{"class":1058},[69,2472,1074],{"class":1058},[69,2474,2475],{"class":1100}," 12.34",[69,2477,1147],{"class":1058},[69,2479,2480,2482,2485,2487,2489,2491,2493,2495,2497,2499,2501,2504,2506],{"class":71,"line":114},[69,2481,1112],{"class":1058},[69,2483,2484],{"class":1100},"_source",[69,2486,1071],{"class":1058},[69,2488,1074],{"class":1058},[69,2490,1289],{"class":1058},[69,2492,1138],{"class":1058},[69,2494,1219],{"class":1115},[69,2496,1071],{"class":1058},[69,2498,1074],{"class":1058},[69,2500,1138],{"class":1058},[69,2502,2503],{"class":1141},"Auto fahren auf der Autobahn",[69,2505,1071],{"class":1058},[69,2507,1307],{"class":1058},[69,2509,2510,2512,2514,2516,2518],{"class":71,"line":120},[69,2511,1112],{"class":1058},[69,2513,2229],{"class":1100},[69,2515,1071],{"class":1058},[69,2517,1074],{"class":1058},[69,2519,1077],{"class":1058},[69,2521,2522,2524,2526,2528,2530,2533,2535,2538,2540],{"class":71,"line":126},[69,2523,1127],{"class":1058},[69,2525,1219],{"class":1115},[69,2527,1071],{"class":1058},[69,2529,1074],{"class":1058},[69,2531,2532],{"class":1058}," [",[69,2534,1071],{"class":1058},[69,2536,2537],{"class":1141},"Auto fahren auf der \u003Cem>Autobahn\u003C\u002Fem>",[69,2539,1071],{"class":1058},[69,2541,2542],{"class":1058},"]\n",[69,2544,2545],{"class":71,"line":133},[69,2546,1171],{"class":1058},[69,2548,2549],{"class":71,"line":139},[69,2550,1176],{"class":1058},[69,2552,2553],{"class":71,"line":144},[69,2554,2555],{"class":1058},"    ]\n",[69,2557,2558],{"class":71,"line":150},[69,2559,1186],{"class":1058},[69,2561,2562,2564,2566,2568,2570],{"class":71,"line":156},[69,2563,1064],{"class":1058},[69,2565,2017],{"class":1067},[69,2567,1071],{"class":1058},[69,2569,1074],{"class":1058},[69,2571,1077],{"class":1058},[69,2573,2574,2576,2578,2580,2582],{"class":71,"line":162},[69,2575,1082],{"class":1058},[69,2577,2030],{"class":1085},[69,2579,1071],{"class":1058},[69,2581,1074],{"class":1058},[69,2583,1077],{"class":1058},[69,2585,2586,2588,2591,2593,2595],{"class":71,"line":168},[69,2587,1097],{"class":1058},[69,2589,2590],{"class":1100},"buckets",[69,2592,1071],{"class":1058},[69,2594,1074],{"class":1058},[69,2596,1733],{"class":1058},[69,2598,2599,2601,2603,2606,2608,2610,2612,2615,2617,2619,2622,2625,2627,2629,2632],{"class":71,"line":174},[69,2600,1873],{"class":1058},[69,2602,1138],{"class":1058},[69,2604,2605],{"class":1115},"key",[69,2607,1071],{"class":1058},[69,2609,1074],{"class":1058},[69,2611,1138],{"class":1058},[69,2613,2614],{"class":1141},"*-10.0",[69,2616,1071],{"class":1058},[69,2618,1400],{"class":1058},[69,2620,2621],{"class":1058},"   \"",[69,2623,2624],{"class":1115},"doc_count",[69,2626,1071],{"class":1058},[69,2628,1074],{"class":1058},[69,2630,2631],{"class":1100}," 12",[69,2633,1307],{"class":1058},[69,2635,2636,2638,2640,2642,2644,2646,2648,2651,2653,2655,2657,2659,2661,2663,2666],{"class":71,"line":180},[69,2637,1873],{"class":1058},[69,2639,1138],{"class":1058},[69,2641,2605],{"class":1115},[69,2643,1071],{"class":1058},[69,2645,1074],{"class":1058},[69,2647,1138],{"class":1058},[69,2649,2650],{"class":1141},"10.0-50.0",[69,2652,1071],{"class":1058},[69,2654,1400],{"class":1058},[69,2656,1071],{"class":1058},[69,2658,2624],{"class":1115},[69,2660,1071],{"class":1058},[69,2662,1074],{"class":1058},[69,2664,2665],{"class":1100}," 24",[69,2667,1307],{"class":1058},[69,2669,2670,2672,2674,2676,2678,2680,2682,2685,2687,2689,2691,2693,2695,2697,2700],{"class":71,"line":186},[69,2671,1873],{"class":1058},[69,2673,1138],{"class":1058},[69,2675,2605],{"class":1115},[69,2677,1071],{"class":1058},[69,2679,1074],{"class":1058},[69,2681,1138],{"class":1058},[69,2683,2684],{"class":1141},"50.0-*",[69,2686,1071],{"class":1058},[69,2688,1400],{"class":1058},[69,2690,2621],{"class":1058},[69,2692,2624],{"class":1115},[69,2694,1071],{"class":1058},[69,2696,1074],{"class":1058},[69,2698,2699],{"class":1100}," 6",[69,2701,1537],{"class":1058},[69,2703,2704],{"class":71,"line":191},[69,2705,2002],{"class":1058},[69,2707,2708],{"class":71,"line":197},[69,2709,1181],{"class":1058},[69,2711,2712],{"class":71,"line":203},[69,2713,1186],{"class":1058},[69,2715,2716,2718,2720,2722,2724],{"class":71,"line":209},[69,2717,1064],{"class":1058},[69,2719,2317],{"class":1067},[69,2721,1071],{"class":1058},[69,2723,1074],{"class":1058},[69,2725,1077],{"class":1058},[69,2727,2728,2730,2732,2734,2736],{"class":71,"line":214},[69,2729,1082],{"class":1058},[69,2731,2331],{"class":1085},[69,2733,1071],{"class":1058},[69,2735,1074],{"class":1058},[69,2737,1733],{"class":1058},[69,2739,2740,2743,2745,2747,2749,2751,2753,2755,2757,2759,2761,2764,2766,2768,2771],{"class":71,"line":220},[69,2741,2742],{"class":1058},"      {",[69,2744,1138],{"class":1058},[69,2746,1240],{"class":1100},[69,2748,1071],{"class":1058},[69,2750,1074],{"class":1058},[69,2752,1138],{"class":1058},[69,2754,1779],{"class":1141},[69,2756,1071],{"class":1058},[69,2758,1400],{"class":1058},[69,2760,1138],{"class":1058},[69,2762,2763],{"class":1100},"score",[69,2765,1071],{"class":1058},[69,2767,1074],{"class":1058},[69,2769,2770],{"class":1100}," 0.95",[69,2772,1537],{"class":1058},[69,2774,2775],{"class":71,"line":226},[69,2776,2555],{"class":1058},[69,2778,2779],{"class":71,"line":232},[69,2780,1669],{"class":1058},[69,2782,2783],{"class":71,"line":662},[69,2784,1674],{"class":1058},[16,2786,2787],{},"Elasticsearch liefert mit einem JSON-Request Highlighting, Fuzziness, Filter, Boosting, Aggregationen und \"Did you mean?\" aus einer Hand. Die Antwort ist direkt konsumierbar – kein manuelles Ranking, kein Post-Processing im Anwendungscode.",[55,2789],{":config":57,"code":2790},"flowchart%20LR%0A%20%20Query%5B%22Suchanfrage%22%5D%20--%3E%20es%5B%22Elasticsearch%3Cbr%2F%3Ekoordinierender%20Node%22%5D%0A%20%20es%20--%3E%20n1%5B%22Node%201%3Cbr%2F%3EShard%20A%22%5D%0A%20%20es%20--%3E%20n2%5B%22Node%202%3Cbr%2F%3EShard%20B%22%5D%0A%20%20n1%20--%3E%20merge%5B%22Ergebnis-Merge%3Cbr%2F%3ESortierung%20%26%20Scoring%22%5D%0A%20%20n2%20--%3E%20merge%0A%20%20merge%20--%3E%20agg%5B%22Aggregationen%3Cbr%2F%3EFacetten%22%5D%0A%20%20merge%20--%3E%20hl%5B%22Highlighting%3Cbr%2F%3ESnippets%22%5D%0A%20%20merge%20--%3E%20suggest%5B%22Suggestions%3Cbr%2F%3EDid%20you%20mean%3F%22%5D%0A%20%20agg%20--%3E%20response%5B%22JSON-Response%22%5D%0A%20%20hl%20--%3E%20response%0A%20%20suggest%20--%3E%20response%0A%20%20style%20es%20fill%3A%2339f%2Ccolor%3A%23fff%0A%20%20style%20response%20fill%3A%236a6%2Ccolor%3A%23fff",[39,2792,2794],{"id":2793},"entscheidungsmatrix","Entscheidungsmatrix",[55,2796],{":config":57,"code":2797},"flowchart%20TD%0A%20%20Frage%7B%22Welche%20Suchanforderungen%3Cbr%2F%3Ehast%20du%3F%22%7D%0A%20%20Frage%20--%3E%7C%22Nur%20Volltext%20%2B%20Tippfehler%22%7C%20PG1%5B%22PostgreSQL%3Cbr%2F%3Etsvector%20%2B%20pg_trgm%22%5D%0A%20%20Frage%20--%3E%7C%22%2B%20Phonetik%20(Namenssuche)%22%7C%20PG2%5B%22PostgreSQL%3Cbr%2F%3E%2B%20fuzzystrmatch%22%5D%0A%20%20Frage%20--%3E%7C%22Millionen%20Dokumente%3Cbr%2F%3Eoder%20Facetten%22%7C%20ES1%5B%22Elasticsearch%2F%3Cbr%2F%3EOpenSearch%22%5D%0A%20%20Frage%20--%3E%7C%22Semantische%3Cbr%2F%3EVektor-Suche%22%7C%20ES2%5B%22Elasticsearch%208%2B%3Cbr%2F%3Eoder%20pgvector%22%5D%0A%0A%20%20PG1%20--%3E%20Menge%7B%22Datenmenge%20%3E%2050%20Mio%3Cbr%2F%3Eoder%20horizontale%3Cbr%2F%3ESkalierung%20n%C3%B6tig%3F%22%7D%0A%20%20PG2%20--%3E%20Menge%0A%20%20Menge%20--%3E%7Cnein%7C%20PG_OK%5B%22%E2%9C%85%20PostgreSQL%20reicht%22%5D%0A%20%20Menge%20--%3E%7Cja%7C%20ES_Cluster%5B%22%E2%86%92%20Elasticsearch%20Cluster%22%5D%0A%0A%20%20ES1%20--%3E%20ES_Cluster%0A%20%20ES2%20--%3E%20ES_Cluster%0A%20%20ES_Cluster%20--%3E%20ES_OK%5B%22%E2%9C%85%20Elasticsearch%20n%C3%B6tig%22%5D%0A%0A%20%20style%20PG_OK%20fill%3A%236a6%2Ccolor%3A%23fff%0A%20%20style%20ES_OK%20fill%3A%2339f%2Ccolor%3A%23fff%0A%20%20style%20ES_Cluster%20fill%3A%2339f%2Ccolor%3A%23fff",[2799,2800,2801,2816],"table",{},[2802,2803,2804],"thead",{},[2805,2806,2807,2811,2814],"tr",{},[2808,2809,2810],"th",{},"Kriterium",[2808,2812,2813],{},"PostgreSQL",[2808,2815,1025],{},[2817,2818,2819,2833,2846,2859,2872,2885,2898,2911,2924,2936,2949,2962],"tbody",{},[2805,2820,2821,2827,2830],{},[2822,2823,2824],"td",{},[298,2825,2826],{},"Tippfehlertoleranz",[2822,2828,2829],{},"✅ pg_trgm, fuzzystrmatch",[2822,2831,2832],{},"✅ Fuzziness, Suggest",[2805,2834,2835,2840,2843],{},[2822,2836,2837],{},[298,2838,2839],{},"Volltextsuche",[2822,2841,2842],{},"✅ tsvector\u002Ftsquery",[2822,2844,2845],{},"✅ Multi-Field, Analyzer",[2805,2847,2848,2853,2856],{},[2822,2849,2850],{},[298,2851,2852],{},"Phonetische Suche",[2822,2854,2855],{},"✅ fuzzystrmatch",[2822,2857,2858],{},"✅ (via Plugin)",[2805,2860,2861,2866,2869],{},[2822,2862,2863],{},[298,2864,2865],{},"Teilwortsuche",[2822,2867,2868],{},"✅ pg_trgm (ILIKE)",[2822,2870,2871],{},"✅ N-Gram-Tokenizer",[2805,2873,2874,2879,2882],{},[2822,2875,2876],{},[298,2877,2878],{},"Skalierung (>50 Mio. Docs)",[2822,2880,2881],{},"⚠️ Vertikal",[2822,2883,2884],{},"✅ Horizontal (Sharding)",[2805,2886,2887,2892,2895],{},[2822,2888,2889],{},[298,2890,2891],{},"Facettierung \u002F Aggregation",[2822,2893,2894],{},"❌ Umständlich mit GROUP BY",[2822,2896,2897],{},"✅ Nativ",[2805,2899,2900,2905,2908],{},[2822,2901,2902],{},[298,2903,2904],{},"Vektor-Suche (semantisch)",[2822,2906,2907],{},"✅ pgvector (IVFFlat\u002FHNSW-Indizes)",[2822,2909,2910],{},"✅ Native kNN + hybrid Scoring (ab ES 8.x)",[2805,2912,2913,2918,2921],{},[2822,2914,2915],{},[298,2916,2917],{},"Highlighting",[2822,2919,2920],{},"❌ Self-made",[2822,2922,2923],{},"✅ Integriert",[2805,2925,2926,2931,2933],{},[2822,2927,2928],{},[298,2929,2930],{},"\"Did you mean?\"",[2822,2932,2920],{},[2822,2934,2935],{},"✅ Term Suggest",[2805,2937,2938,2943,2946],{},[2822,2939,2940],{},[298,2941,2942],{},"Betriebskomplexität",[2822,2944,2945],{},"✅ Kein zusätzlicher Dienst",[2822,2947,2948],{},"❌ Cluster-Operationen",[2805,2950,2951,2956,2959],{},[2822,2952,2953],{},[298,2954,2955],{},"Latenz (Single-Request)",[2822,2957,2958],{},"✅ 2–10 ms (Index-Lookup)",[2822,2960,2961],{},"⚠️ 10–50 ms (Netzwerk)",[2805,2963,2964,2969,2972],{},[2822,2965,2966],{},[298,2967,2968],{},"Kosten",[2822,2970,2971],{},"✅ In PostgreSQL enthalten",[2822,2973,2974],{},"❌ Eigenes Hosting oder Cloud",[39,2976,2978],{"id":2977},"wann-reicht-postgresql","Wann reicht PostgreSQL?",[16,2980,2981,2982,26,2984,26,2986,2988,2989,2991],{},"PostgreSQL mit ",[23,2983,25],{},[23,2985,29],{},[23,2987,32],{}," und optional ",[23,2990,36],{}," ist die richtige Wahl, wenn:",[2993,2994,2995,2999,3002,3005,3008],"ul",{},[2996,2997,2998],"li",{},"Daten und Suche auf demselben Server liegen (kein Netzwerk-Overhead)",[2996,3000,3001],{},"Bis zu mehreren Millionen Dokumenten durchsucht werden",[2996,3003,3004],{},"Keine Facettierung oder Aggregationen benötigt werden",[2996,3006,3007],{},"Das Team PostgreSQL bereits beherrscht und kein Elasticsearch-Wissen aufbauen möchte",[2996,3009,3010],{},"Die Infrastruktur einfach bleiben soll",[16,3012,3013,3016],{},[298,3014,3015],{},"Ideal für:"," CMS-Suche, Blog-Suche, einfache Produktsuche, interne Verwaltungsoberflächen, API-Endpunkte mit \"Suche\"-Funktion.",[39,3018,3020],{"id":3019},"wann-braucht-es-elasticsearch","Wann braucht es Elasticsearch?",[16,3022,3023],{},"Ein dedizierter Suchserver wird interessant, wenn:",[2993,3025,3026,3029,3032,3035,3038],{},[2996,3027,3028],{},"Sehr große Datenmengen (Milliarden Dokumente) über mehrere Maschinen verteilt werden müssen",[2996,3030,3031],{},"Komplexe Suchanalysen mit Aggregationen, Facetten und Echtzeit-Statistiken nötig sind",[2996,3033,3034],{},"Semantische Suche mit hybridem Scoring (Vektor + Text) benötigt wird, das Elasticsearch nativ kann, pgvector aber nur mit Zusatzaufwand",[2996,3036,3037],{},"Hochverfügbarkeit und Ausfallsicherheit für die Suchfunktion vertraglich zugesichert werden müssen",[2996,3039,3040],{},"\"Did you mean?\"-Vorschläge und Autovervollständigung aus dem Suchverlauf abgeleitet werden",[16,3042,3043,3045],{},[298,3044,3015],{}," E-Commerce-Suche, Log-Analyse (ELK-Stack), DMS-Suche, Wissensdatenbanken.",[39,3047,3049],{"id":3048},"fazit","Fazit",[16,3051,3052,3053,3055,3056,3058,3059,3061,3062,3064],{},"PostgreSQL ist für 80 % der Suchanwendungen vollkommen ausreichend – besonders in Webanwendungen mit überschaubaren Datenmengen. Die Kombination aus ",[23,3054,25],{}," (Volltext), ",[23,3057,29],{}," (Tippfehler, Teilwörter), ",[23,3060,32],{}," (Phonetik) und optional ",[23,3063,36],{}," (semantische Vektor-Suche) deckt ein breites Spektrum ab, ohne dass ein zweites System betrieben werden muss.",[16,3066,3067,3068,3070],{},"Erst wenn horizontale Skalierung, komplexe Facetten, hybrides Vektor-Text-Scoring (kombinierte Gewichtung aus Embedding-Distanz und textuellem Match) oder \"Did you mean?\" ins Spiel kommen, wird Elasticsearch \u002F OpenSearch zum unverzichtbaren Werkzeug. Für reine Vektor-Ähnlichkeitssuche ohne diese Zusatzanforderungen ist ",[23,3069,36],{}," dagegen eine vollwertige Alternative.",[16,3072,3073],{},"Der beste Ansatz: Mit PostgreSQL starten, den Suchindex beobachten und erst migrieren, wenn die Anforderungen es wirklich erfordern. Die Umstellung von PostgreSQL auf Elasticsearch ist gut dokumentiert – der umgekehrte Weg (unnötige Komplexität wieder abbauen) ist deutlich schwieriger.",[3075,3076],"hr",{},[16,3078,3079],{},[3080,3081,3082,3083,33,3085,3087,3088,3091,3092,3095,3096,3098,3099,3101],"em",{},"Hinweis: Die PostgreSQL-Beispiele wurden mit Version 16 getestet. ",[23,3084,29],{},[23,3086,32],{}," sind in der ",[23,3089,3090],{},"contrib","-Extension enthalten und müssen ggf. mit ",[23,3093,3094],{},"CREATE EXTENSION"," aktiviert werden. ",[23,3097,36],{}," muss separat installiert werden (nicht in ",[23,3100,3090],{},"). Elasticsearch und OpenSearch beziehen sich auf die Versionen 8.x bzw. 2.x.",[3103,3104,3105],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .su27w, html code.shiki .su27w{--shiki-light:#916B53;--shiki-default:#916B53;--shiki-dark:#916B53}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":65,"searchDepth":78,"depth":78,"links":3107},[3108,3115,3116,3117,3118,3119],{"id":41,"depth":78,"text":42,"children":3109},[3110,3111,3112,3113,3114],{"id":49,"depth":84,"text":50},{"id":304,"depth":84,"text":305},{"id":514,"depth":84,"text":515},{"id":764,"depth":84,"text":765},{"id":975,"depth":84,"text":976},{"id":1024,"depth":78,"text":1025},{"id":2793,"depth":78,"text":2794},{"id":2977,"depth":78,"text":2978},{"id":3019,"depth":78,"text":3020},{"id":3048,"depth":78,"text":3049},"Suchfunktionen in PostgreSQL mit pg_trgm, tsvector und Fuzzystrmatch – und wann Elasticsearch oder OpenSearch die bessere Wahl ist. Mit Code-Beispielen und Entscheidungsmatrix.","md","PostgreSQL, Elasticsearch, OpenSearch, Volltextsuche, pg_trgm, tsvector, Fuzzystrmatch, Trigramm, Suche",{},"\u002Fblog\u002F2026-07-07-postgresql-volltextsuche-vs-elasticsearch","2026-07-07",{"title":6,"description":3120},{"loc":3124},"blog\u002F2026-07-07-postgresql-volltextsuche-vs-elasticsearch","8KKkIZSKjZRfy7fSjjOJsaHRBBKe6rWRNs-dCFTPj0A",{"id":3131,"title":3132,"author":7,"body":3133,"description":3346,"extension":3121,"keywords":3347,"meta":3348,"navigation":129,"path":3349,"publishedAt":3350,"seo":3351,"sitemap":3352,"stem":3353,"__hash__":3354},"blog\u002Fblog\u002F2026-06-26-dsgvo-konformes-tracking-mit-umami.md","DSGVO-konformes Tracking mit Umami – ohne Cookie-Banner",{"type":9,"value":3134,"toc":3336},[3135,3138,3141,3144,3148,3151,3162,3166,3169,3195,3199,3202,3205,3209,3212,3215,3226,3229,3233,3236,3250,3253,3267,3271,3278,3285,3292,3295,3300,3314,3318,3321,3324,3326,3329,3331],[12,3136,3132],{"id":3137},"dsgvo-konformes-tracking-mit-umami-ohne-cookie-banner",[16,3139,3140],{},"Tracking auf der eigenen Website ist ein zweischneidiges Schwert. Einerseits willst du verstehen, wie Besucher deine Seite nutzen. Andererseits bedeuten Google Analytics & Co. meist einen Rattenschwanz an Cookie-Bannern, Einwilligungen und Datenschutz-Folgenabschätzungen.",[16,3142,3143],{},"Umami ist ein schlankes Analytics-Tool, das diesen Konflikt auflöst – ohne Kompromisse bei den Daten.",[39,3145,3147],{"id":3146},"was-ist-umami","Was ist Umami?",[16,3149,3150],{},"Umami ist ein Open-Source-Analytics-Tool, das als Alternative zu Google Analytics entwickelt wurde. Es zeichnet Seitenaufrufe, Besucherzahlen und Events auf – verzichtet dabei aber konsequent auf Cookies und personenbezogene Daten.",[16,3152,3153,3154,3161],{},"Du kannst Umami entweder selbst hosten (eigener Server, eigene Daten) oder den Cloud-Dienst auf ",[3155,3156,3160],"a",{"href":3157,"rel":3158},"https:\u002F\u002Fcloud.umami.is",[3159],"nofollow","cloud.umami.is"," nutzen. In beiden Fällen liegt die Kontrolle über die Daten bei dir.",[39,3163,3165],{"id":3164},"warum-umami-dsgvo-konform-ist","Warum Umami DSGVO-konform ist",[16,3167,3168],{},"Umami kommt ohne die typischen Tracking-Fallen aus:",[2993,3170,3171,3177,3183,3189],{},[2996,3172,3173,3176],{},[298,3174,3175],{},"Keine Cookies",": Umami setzt keine Cookies – weder Erstanbieter- noch Drittanbieter-Cookies. Damit entfällt die Notwendigkeit einer Einwilligung nach § 25 TTDSG.",[2996,3178,3179,3182],{},[298,3180,3181],{},"Keine personenbezogenen Daten",": Es werden keine IP-Adressen dauerhaft gespeichert, keine User-IDs vergeben und kein Browser-Fingerprinting betrieben. Die Daten sind anonym.",[2996,3184,3185,3188],{},[298,3186,3187],{},"Kein Data-Sharing mit Dritten",": Die Daten verbleiben auf deinem Server oder bei dir als Data Controller – sie werden nicht an Werbenetzwerke oder andere Dritte weitergegeben.",[2996,3190,3191,3194],{},[298,3192,3193],{},"Pseudonyme Nutzungsanalyse",": Nach Art. 6 Abs. 1 lit. f DSGVO ist die Verarbeitung anonymisierter Daten zu Analysezwecken auch ohne Einwilligung zulässig.",[39,3196,3198],{"id":3197},"kein-cookie-banner-nötig","Kein Cookie-Banner nötig",[16,3200,3201],{},"Weil Umami keine Cookies setzt und keine personenbezogenen Daten verarbeitet, entfällt die Pflicht zur Einholung einer aktiven Einwilligung. Der Einsatz kann sich auf das berechtigte Interesse des Websitebetreibers stützen (§ 25 Abs. 2 Nr. 2 TTDSG, Art. 6 Abs. 1 lit. f DSGVO).",[16,3203,3204],{},"Voraussetzung ist, dass du in deiner Datenschutzerklärung transparent machst, dass du Umami einsetzt, welche Daten erfasst werden und dass diese anonym sind. Ein Cookie-Banner mit Opt-in ist dagegen nicht erforderlich.",[39,3206,3208],{"id":3207},"die-nachteile-von-google-analytics","Die Nachteile von Google Analytics",[16,3210,3211],{},"Google Analytics sammelt standardmäßig eine Vielzahl personenbezogener Daten (IP-Adressen, geräteübergreifende IDs, Browser-Fingerprinting). Die Rechtsprechung (EuGH, DSK) hat wiederholt klargestellt, dass dafür eine aktive Einwilligung nötig ist – der reine Hinweis im Cookie-Banner reicht nicht.",[16,3213,3214],{},"Hinzu kommen:",[2993,3216,3217,3220,3223],{},[2996,3218,3219],{},"Datenverarbeitung in den USA ohne angemessenes Datenschutzniveau (trotz DPF)",[2996,3221,3222],{},"Weitergabe an Werbenetzwerke und andere Google-Dienste",[2996,3224,3225],{},"Komplexität bei der DSGVO-konformen Konfiguration",[16,3227,3228],{},"Umami vermeidet all diese Punkte von Haus aus.",[39,3230,3232],{"id":3231},"welche-daten-erfasst-umami","Welche Daten erfasst Umami?",[16,3234,3235],{},"Umami erfasst nur, was für eine sinnvolle Analyse nötig ist:",[2993,3237,3238,3241,3244,3247],{},[2996,3239,3240],{},"Seitenaufrufe (URL, Titel)",[2996,3242,3243],{},"Referrer (Herkunft des Besuchers)",[2996,3245,3246],{},"Gerätetyp, Bildschirmgröße, Betriebssystem, Browser",[2996,3248,3249],{},"Land (auf Geo-Ebene, nicht City-Ebene – keine Rückschlüsse auf einzelne Personen)",[16,3251,3252],{},"Nicht erfasst werden:",[2993,3254,3255,3258,3261,3264],{},[2996,3256,3257],{},"IP-Adressen (werden beim Proxy-Vorgang im Arbeitsspeicher verarbeitet, aber nicht gespeichert)",[2996,3259,3260],{},"Cookies",[2996,3262,3263],{},"User-IDs",[2996,3265,3266],{},"Browser-Fingerprints",[39,3268,3270],{"id":3269},"technische-umsetzung-auf-dieser-seite","Technische Umsetzung auf dieser Seite",[16,3272,3273,3274,3277],{},"Auf dieser Seite läuft Umami über das ",[23,3275,3276],{},"nuxt-umami","-Modul im Proxy-Modus (\"cloak\"). Vereinfacht dargestellt:",[60,3279,3283],{"className":3280,"code":3282,"language":1240},[3281],"language-text","Browser → \u002Fapi\u002Fsavory (gleiche Domain) → Nitro-Handler → cloud.umami.is\n",[23,3284,3282],{"__ignoreMap":65},[16,3286,3287,3288,3291],{},"Der Browser sendet die anonymen Nutzungsdaten an einen Endpunkt auf derselben Domain (",[23,3289,3290],{},"\u002Fapi\u002Fsavory","). Ein Server-Handler leitet die Daten dann an den Umami-Cloud-Dienst weiter. Dabei wird die echte IP des Besuchers nur im Arbeitsspeicher des Servers verarbeitet und nicht gespeichert.",[55,3293],{":config":57,"code":3294},"flowchart%20LR%0A%20%20Browser%5B%22Browser%3Cbr%2F%3E%3Csmall%3Epawlitzki.dev%3C%2Fsmall%3E%22%5D%0A%20%20Savory%5B%22%2Fapi%2Fsavory%3Cbr%2F%3E%3Csmall%3ENitro%20Server%20Handler%3C%2Fsmall%3E%22%5D%0A%20%20Umami%5B%22cloud.umami.is%3Cbr%2F%3E%3Csmall%3EUmami%20Cloud%3C%2Fsmall%3E%22%5D%0A%0A%20%20Browser%20--%20%22POST%20(anonyme%20Daten)%22%20--%3E%20Savory%0A%20%20Savory%20--%20%22POST%20%2B%20echte%20IP%22%20--%3E%20Umami%0A%20%20style%20Umami%20fill%3A%230f3460%2Ccolor%3A%23fff",[16,3296,3297],{},[298,3298,3299],{},"Vorteile dieser Architektur:",[2993,3301,3302,3305,3308,3311],{},[2996,3303,3304],{},"Browser blockt keine Requests (Same-Origin, kein externer Script-Load)",[2996,3306,3307],{},"Ad-Blocker (Brave, uBlock Origin) haben keine Angriffsfläche",[2996,3309,3310],{},"Die echte IP wird korrekt an Umami übermittelt (Geo-Location funktioniert)",[2996,3312,3313],{},"Kein externes Script wird nachgeladen – alles ist Teil des Nuxt-Bundles",[39,3315,3317],{"id":3316},"und-die-kehrseite","Und die Kehrseite?",[16,3319,3320],{},"Umami ist kein Universalersatz für Google Analytics. Wer Kampagnen-Tracking auf Nutzer-Ebene, Trichter-Analysen mit User-Journey über mehrere Sessions oder eine Integration mit Google Ads benötigt, wird mit Umami nicht glücklich.",[16,3322,3323],{},"Für die 80 % der Websites, die einfach nur wissen wollen: \"Wie viele Besucher habe ich, woher kommen sie und welche Inhalte sind beliebt?\" – ist Umami die klar bessere Wahl.",[39,3325,3049],{"id":3048},[16,3327,3328],{},"Umami ist eine erfrischende Alternative im Analytics-Dschungel. Cookielos, datenschutzkonform, schnell und übersichtlich. Wer auf Google Analytics verzichten kann, spart sich nicht nur den Cookie-Banner, sondern auch ein schlechtes Gewissen.",[3075,3330],{},[16,3332,3333],{},[3080,3334,3335],{},"Hinweis: Dieser Artikel stellt keine Rechtsberatung dar. Ich bin kein Anwalt und die beschriebenen Sachverhalte sind meine eigene Einschätzung, basierend auf Recherche und praktischer Erfahrung. Für eine verbindliche rechtliche Bewertung wende dich bitte an einen Fachanwalt für Datenschutzrecht.",{"title":65,"searchDepth":78,"depth":78,"links":3337},[3338,3339,3340,3341,3342,3343,3344,3345],{"id":3146,"depth":78,"text":3147},{"id":3164,"depth":78,"text":3165},{"id":3197,"depth":78,"text":3198},{"id":3207,"depth":78,"text":3208},{"id":3231,"depth":78,"text":3232},{"id":3269,"depth":78,"text":3270},{"id":3316,"depth":78,"text":3317},{"id":3048,"depth":78,"text":3049},"Warum Umami eine echte Alternative zu Google Analytics ist – datenschutzfreundlich, cookielos und trotzdem aussagekräftig.","Umami, Tracking, DSGVO, Datenschutz, Cookie-Banner, Analytics, Privacy",{},"\u002Fblog\u002F2026-06-26-dsgvo-konformes-tracking-mit-umami","2026-06-26",{"title":3132,"description":3346},{"loc":3349},"blog\u002F2026-06-26-dsgvo-konformes-tracking-mit-umami","mS4dGIjIX5OrT8uAGXeaPFwL38yjgzETcGZvGGomMSk",{"id":3356,"title":3357,"author":7,"body":3358,"description":3642,"extension":3121,"keywords":3643,"meta":3644,"navigation":129,"path":3645,"publishedAt":3646,"seo":3647,"sitemap":3648,"stem":3649,"__hash__":3650},"blog\u002Fblog\u002F2026-06-25-make-or-buy-in-der-produktentwicklung.md","Make or Buy in der Produktentwicklung",{"type":9,"value":3359,"toc":3627},[3360,3363,3366,3370,3373,3377,3380,3386,3392,3395,3401,3407,3411,3415,3421,3424,3428,3431,3457,3460,3464,3467,3471,3474,3477,3481,3495,3499,3513,3517,3520,3522,3525,3616,3619,3621,3624],[12,3361,3357],{"id":3362},"make-or-buy-in-der-produktentwicklung",[16,3364,3365],{},"Kaum eine Frage beschäftigt Produktteams so sehr wie die Make-or-Buy-Entscheidung: Bauen wir ein Feature selbst, oder kaufen wir eine bestehende Lösung dazu? Die Antwort ist selten eindeutisch, aber wer sie systematisch angeht, spart Zeit, Geld und vermeidet technische Schulden.",[39,3367,3369],{"id":3368},"das-kernproblem","Das Kernproblem",[16,3371,3372],{},"Jedes Feature, das du selbst entwickelst, bindet Kapazitäten, die du nicht in dein Kernprodukt stecken kannst. Jedes Feature, das du zukaufst, schafft Abhängigkeiten, die du später vielleicht bereust. Die Kunst liegt darin, die richtige Balance zu finden.",[39,3374,3376],{"id":3375},"praxisbeispiel-personensuche-in-einem-versicherungs-partnersystem","Praxisbeispiel: Personensuche in einem Versicherungs-Partnersystem",[16,3378,3379],{},"Ein aktuelles Projekt aus der Versicherungsbranche zeigt, wie komplex Make-or-Buy-Entscheidungen in der Realität sind.",[16,3381,3382,3385],{},[298,3383,3384],{},"Die Ausgangslage",": Ein großer Versicherungskonzern betreibt ein Partnersystem, das alle Geschäftsbeziehungen abbildet – Kunden, Vertragspartner, Zeugen, Partnerfirmen und interne Organisationseinheiten. Eine neue Anforderung lautet: Die Partner sollen über eine Personensuche (Name, Geburtsdatum, Adresse, Rolle) im System schnell und zuverlässig gefunden werden können.",[16,3387,3388,3391],{},[298,3389,3390],{},"Das eigentliche Problem",": Das zugrundeliegende Datenmodell ist ein Historienschwebe-Konzept – jede Entität wird über mehrere Versionen und Zeiträume abgebildet. Wer war wann in welcher Rolle aktiv? Welche Adresse galt zu welchem Zeitpunkt? Das Modell ist für korrekte Historienführung optimiert – nicht für Suche. Eine einfache Volltextsuche greift hier zu kurz, weil der relevante Datensatz vom Kontext abhängt (Zeitraum, Rolle, Beziehungstyp).",[16,3393,3394],{},"Hinzu kommt: Die Fachseite ist unsicher, ob komplexe Suchfunktionen wie Fuzzy-Suche oder phonetische Suche den Endanwendern tatsächlich einen Mehrwert bieten. Oft ist das Finden des richtigen Partners weniger ein technisches Suchproblem als eine Frage des korrekten Kontexts – und hier stößt jedes allgemeine Suchtool an seine Grenzen.",[16,3396,3397,3400],{},[298,3398,3399],{},"Die Make-Option",": Eine eigene Suchkomponente entwickeln, die das Historienschwebe-Modell versteht, die Daten gezielt für die Suche aufbereitet und eine an die Fachdomäne angepasste Oberfläche bietet.",[16,3402,3403,3406],{},[298,3404,3405],{},"Die Buy-Option",": Ein im Versicherungsumfeld etabliertes Identity-Resolution- oder Master-Data-Management-Tool integrieren, das bereits mit historischen Personenmodellen umgehen kann.",[39,3408,3410],{"id":3409},"entscheidungskriterien-im-überblick","Entscheidungskriterien im Überblick",[47,3412,3414],{"id":3413},"kernkompetenz","Kernkompetenz",[16,3416,3417,3420],{},[3080,3418,3419],{},"Frage",": Ist die Suchfunktion Teil deines Produktversprechens? Wenn dein Produkt eine Suchplattform ist, dann ja. Wenn es ein Versicherungsverwaltungssystem ist, dann nein – die Suche ist ein unterstützendes Feature.",[16,3422,3423],{},"Bei unserem Versicherungskunden ist die Personensuche ein Hilfsmittel, nicht das Kernprodukt. Das spricht für Buy.",[47,3425,3427],{"id":3426},"entwicklungs-und-betriebskosten","Entwicklungs- und Betriebskosten",[16,3429,3430],{},"Die Kosten für eine Eigenentwicklung werden häufig unterschätzt:",[2993,3432,3433,3439,3445,3451],{},[2996,3434,3435,3438],{},[298,3436,3437],{},"Initialentwicklung",": Datenmodell-Analyse, Aufbereitung der Historienschwebe, Indexierung, API, UI – schnell 8-12 Wochen",[2996,3440,3441,3444],{},[298,3442,3443],{},"Testen",": Korrektheit der historischen Ergebnisse, Grenzfälle bei Rollenwechseln – aufwändiger als eine reine Volltextsuche",[2996,3446,3447,3450],{},[298,3448,3449],{},"Betrieb",": Der Suchindex muss bei jeder Datenmodell-Änderung gepflegt werden",[2996,3452,3453,3456],{},[298,3454,3455],{},"Wartung",": Neue Beziehungstypen oder Rollen erfordern Anpassungen der Suchlogik",[16,3458,3459],{},"Eine Buy-Lösung kostet monatliche Lizenzgebühren, dafür sind Entwicklung und Betrieb beim Anbieter – allerdings nur, wenn der Anbieter das Historienschwebe-Modell abbilden kann.",[47,3461,3463],{"id":3462},"time-to-market","Time-to-Market",[16,3465,3466],{},"In der Versicherungswelt sind regulatorische Vorgaben oft der Treiber. Wenn die Personensuche in drei Monaten live sein muss, ist Buy meist der einzige Weg. Eine Eigenentwicklung ist planbar, aber du trägst das volle Risiko.",[47,3468,3470],{"id":3469},"integration-und-abhängigkeiten","Integration und Abhängigkeiten",[16,3472,3473],{},"Buy-Lösungen kommen mit eigenen APIs, Datenformaten und Vertragsbedingungen. Ein Anbieterwechsel kann teuer werden. Make-Lösungen geben dir die volle Kontrolle – aber auch die volle Verantwortung.",[16,3475,3476],{},"In unserem Fall zeigt sich: Keines der Standardprodukte bildet das Historienschwebe-Konzept zufriedenstellend ab. Der Kunde steht vor der Wahl, entweder ein Buy-Produkt anzupassen (was die Wartbarkeit verschlechtert) oder ein eigenes Such-Feature zu bauen (was Ressourcen bindet). Eine finale Entscheidung steht noch aus.",[39,3478,3480],{"id":3479},"wann-make-die-richtige-wahl-ist","Wann Make die richtige Wahl ist",[2993,3482,3483,3486,3489,3492],{},[2996,3484,3485],{},"Das Feature ist deine Kernkompetenz und differenziert dein Produkt vom Wettbewerb",[2996,3487,3488],{},"Du hast das Team und die Zeit für Entwicklung und Betrieb",[2996,3490,3491],{},"Die Anforderungen sind so spezifisch, dass kein Standardprodukt passt – wie im Beispiel das Historienschwebe-Modell",[2996,3493,3494],{},"Du willst keine Abhängigkeit von einem Drittanbieter eingehen",[39,3496,3498],{"id":3497},"wann-buy-die-richtige-wahl-ist","Wann Buy die richtige Wahl ist",[2993,3500,3501,3504,3507,3510],{},[2996,3502,3503],{},"Das Feature ist unterstützend und nicht Teil deines Produktversprechens",[2996,3505,3506],{},"Es gibt etablierte Anbieter, die die Domäne bereits abdecken",[2996,3508,3509],{},"Die Time-to-Market ist kritisch",[2996,3511,3512],{},"Du willst Entwickler-Kapazität auf das Kernprodukt konzentrieren",[39,3514,3516],{"id":3515},"der-hybride-weg","Der hybride Weg",[16,3518,3519],{},"Oft ist die beste Antwort nicht Make oder Buy, sondern eine Kombination. Ein Standardprodukt für die Basis, ergänzt um domänenspezifische Eigenentwicklung für das, was den wirklichen Unterschied macht. Wichtig ist, die Grenze sauber zu ziehen: Der Suchindex selbst kann zugekauft sein – die Logik, die dein Datenmodell versteht, ist der Teil, den du selbst bauen musst.",[39,3521,2794],{"id":2793},[16,3523,3524],{},"Ich empfehle ein einfaches Raster:",[2799,3526,3527,3542],{},[2802,3528,3529],{},[2805,3530,3531,3533,3536,3539],{},[2808,3532,2810],{},[2808,3534,3535],{},"Gewicht",[2808,3537,3538],{},"Make",[2808,3540,3541],{},"Buy",[2817,3543,3544,3557,3570,3582,3593,3605],{},[2805,3545,3546,3548,3551,3554],{},[2822,3547,3414],{},[2822,3549,3550],{},"hoch",[2822,3552,3553],{},"++",[2822,3555,3556],{},"--",[2805,3558,3559,3561,3564,3567],{},[2822,3560,3463],{},[2822,3562,3563],{},"mittel",[2822,3565,3566],{},"0",[2822,3568,3569],{},"+",[2805,3571,3572,3575,3577,3579],{},[2822,3573,3574],{},"Domänen-Passung",[2822,3576,3550],{},[2822,3578,3553],{},[2822,3580,3581],{},"-",[2805,3583,3584,3587,3589,3591],{},[2822,3585,3586],{},"Entwicklungsrisiko",[2822,3588,3563],{},[2822,3590,3556],{},[2822,3592,3569],{},[2805,3594,3595,3598,3601,3603],{},[2822,3596,3597],{},"Betriebskosten (langfristig)",[2822,3599,3600],{},"niedrig",[2822,3602,3569],{},[2822,3604,3581],{},[2805,3606,3607,3610,3612,3614],{},[2822,3608,3609],{},"Flexibilität",[2822,3611,3550],{},[2822,3613,3553],{},[2822,3615,3556],{},[16,3617,3618],{},"Zähle die Bewertung pro Spalte zusammen. Meist zeigt sich schnell, welche Richtung die richtige ist.",[39,3620,3049],{"id":3048},[16,3622,3623],{},"Die Make-or-Buy-Frage stellt sich in jedem Produktteam immer wieder. Der wichtigste Rat: Sei ehrlich zu dir selbst, ob ein Feature wirklich deine Kernkompetenz betrifft. Viel zu oft wird \"Make\" gewählt, weil es sich kontrollierter anfühlt – dabei bindet es Ressourcen, die an anderer Stelle dringend gebraucht werden.",[16,3625,3626],{},"Im Zweifel: Kauf dazu, was nicht dein Kernprodukt ist. Aber unterschätze nicht die Domänenkomplexität – manchmal führt kein Weg an einer Eigenentwicklung vorbei, wenn die fachlichen Anforderungen zu spezifisch sind.",{"title":65,"searchDepth":78,"depth":78,"links":3628},[3629,3630,3631,3637,3638,3639,3640,3641],{"id":3368,"depth":78,"text":3369},{"id":3375,"depth":78,"text":3376},{"id":3409,"depth":78,"text":3410,"children":3632},[3633,3634,3635,3636],{"id":3413,"depth":84,"text":3414},{"id":3426,"depth":84,"text":3427},{"id":3462,"depth":84,"text":3463},{"id":3469,"depth":84,"text":3470},{"id":3479,"depth":78,"text":3480},{"id":3497,"depth":78,"text":3498},{"id":3515,"depth":78,"text":3516},{"id":2793,"depth":78,"text":2794},{"id":3048,"depth":78,"text":3049},"Wann du Features selbst entwickeln und wann du bestehende Software integrieren solltest – mit konkreten Entscheidungskriterien und einem Praxisbeispiel zur Personensuche in einem Versicherungs-Partnersystem mit komplexem Historienschwebe-Modell.","Make or Buy, Produktentwicklung, Softwarearchitektur, Kernkompetenz, Historienschwebe, Personensuche, Versicherung",{},"\u002Fblog\u002F2026-06-25-make-or-buy-in-der-produktentwicklung","2026-06-25",{"title":3357,"description":3642},{"loc":3645},"blog\u002F2026-06-25-make-or-buy-in-der-produktentwicklung","GrxQx6xKhBvGUyF0uSSRxk_E2k2i5chiGdZtRZuStuI",{"id":3652,"title":3653,"author":7,"body":3654,"description":4098,"extension":3121,"keywords":4099,"meta":4100,"navigation":129,"path":4101,"publishedAt":4102,"seo":4103,"sitemap":4104,"stem":4105,"__hash__":4106},"blog\u002Fblog\u002F2026-06-10-modernes-og-image-handling.md","Modernes OG-Image-Handling mit Takumi",{"type":9,"value":3655,"toc":4091},[3656,3659,3662,3666,3669,3689,3693,3706,3823,3826,3830,3837,3868,3871,3885,3889,3895,3979,3982,3986,4003,4085,4088],[12,3657,3653],{"id":3658},"modernes-og-image-handling-mit-takumi",[16,3660,3661],{},"Open-Graph-Bilder sind entscheidend für die Optik deiner Seite in sozialen Netzwerken. Sie werden beim Teilen von Links auf Plattformen wie LinkedIn, X (Twitter) oder WhatsApp angezeigt und sind oft der erste visuelle Eindruck, den Besucher von deiner Seite bekommen. Mit dem Takumi-Plugin für nuxt-og-image wird die Generierung dieser Bilder zum Kinderspiel – ganz ohne externen Dienst.",[39,3663,3665],{"id":3664},"warum-takumi","Warum Takumi?",[16,3667,3668],{},"Takumi ist ein spezialisierter Renderer, der HTML und CSS serverseitig in PNG-Bilder umwandelt. Anders als die Standard-Lösung von nuxt-og-image (die auf Chromium setzt) oder externe Dienste wie Vercel OG, läuft Takumi als reiner Rust-Prozess. Das bedeutet:",[2993,3670,3671,3677,3683],{},[2996,3672,3673,3676],{},[298,3674,3675],{},"Geschwindigkeit",": Ein OG-Bild wird in wenigen Millisekunden gerendert, nicht in Sekunden.",[2996,3678,3679,3682],{},[298,3680,3681],{},"Kein Chromium",": Du sparst dir das Installieren und Betreiben einer kompletten Browser-Engine auf dem Server.",[2996,3684,3685,3688],{},[298,3686,3687],{},"Deterministisch",": Gleicher Input liefert immer das gleiche Output – keine Caching-Probleme.",[39,3690,3692],{"id":3691},"setup-in-nuxt-4","Setup in Nuxt 4",[16,3694,3695,3696,33,3699,3702,3703,1074],{},"Die Einrichtung ist denkbar einfach. Nach der Installation von ",[23,3697,3698],{},"@nuxt-og-image",[23,3700,3701],{},"@takumi-rs\u002Fcore"," erstellst du eine Takumi-Komponente unter ",[23,3704,3705],{},"components\u002FOgImage\u002F",[60,3707,3711],{"className":3708,"code":3709,"language":3710,"meta":65,"style":65},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Ctemplate>\n  \u003Cdiv class=\"w-[1200px] h-[600px] flex flex-col items-center justify-center bg-gray-900 p-16\">\n    \u003Ch1 class=\"text-5xl font-bold text-white text-center\">{{ title }}\u003C\u002Fh1>\n    \u003Cp class=\"text-2xl text-gray-400 mt-6\">{{ description }}\u003C\u002Fp>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n","vue",[23,3712,3713,3724,3747,3778,3806,3815],{"__ignoreMap":65},[69,3714,3715,3718,3721],{"class":71,"line":72},[69,3716,3717],{"class":1058},"\u003C",[69,3719,3720],{"class":1115},"template",[69,3722,3723],{"class":1058},">\n",[69,3725,3726,3729,3732,3735,3738,3740,3743,3745],{"class":71,"line":78},[69,3727,3728],{"class":1058},"  \u003C",[69,3730,3731],{"class":1115},"div",[69,3733,3734],{"class":1067}," class",[69,3736,3737],{"class":1058},"=",[69,3739,1071],{"class":1058},[69,3741,3742],{"class":1141},"w-[1200px] h-[600px] flex flex-col items-center justify-center bg-gray-900 p-16",[69,3744,1071],{"class":1058},[69,3746,3723],{"class":1058},[69,3748,3749,3752,3754,3756,3758,3760,3763,3765,3768,3771,3774,3776],{"class":71,"line":84},[69,3750,3751],{"class":1058},"    \u003C",[69,3753,12],{"class":1115},[69,3755,3734],{"class":1067},[69,3757,3737],{"class":1058},[69,3759,1071],{"class":1058},[69,3761,3762],{"class":1141},"text-5xl font-bold text-white text-center",[69,3764,1071],{"class":1058},[69,3766,3767],{"class":1058},">",[69,3769,3770],{"class":1052},"{{ title }}",[69,3772,3773],{"class":1058},"\u003C\u002F",[69,3775,12],{"class":1115},[69,3777,3723],{"class":1058},[69,3779,3780,3782,3784,3786,3788,3790,3793,3795,3797,3800,3802,3804],{"class":71,"line":90},[69,3781,3751],{"class":1058},[69,3783,16],{"class":1115},[69,3785,3734],{"class":1067},[69,3787,3737],{"class":1058},[69,3789,1071],{"class":1058},[69,3791,3792],{"class":1141},"text-2xl text-gray-400 mt-6",[69,3794,1071],{"class":1058},[69,3796,3767],{"class":1058},[69,3798,3799],{"class":1052},"{{ description }}",[69,3801,3773],{"class":1058},[69,3803,16],{"class":1115},[69,3805,3723],{"class":1058},[69,3807,3808,3811,3813],{"class":71,"line":96},[69,3809,3810],{"class":1058},"  \u003C\u002F",[69,3812,3731],{"class":1115},[69,3814,3723],{"class":1058},[69,3816,3817,3819,3821],{"class":71,"line":102},[69,3818,3773],{"class":1058},[69,3820,3720],{"class":1115},[69,3822,3723],{"class":1058},[16,3824,3825],{},"Wichtig: Takumi unterstützt nur einen Teil der Tailwind-Klassen. Transform-, Filter- und Shadow-Klassen funktionieren nicht – stattdessen verwendest du inline styles.",[39,3827,3829],{"id":3828},"zero-runtime","Zero Runtime",[16,3831,3832,3833,3836],{},"Durch ",[23,3834,3835],{},"zeroRuntime: true"," in der nuxt.config.ts werden alle OG-Images bereits beim Build generiert:",[60,3838,3842],{"className":3839,"code":3840,"language":3841,"meta":65,"style":65},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ogImage: {\n  zeroRuntime: true\n}\n","ts",[23,3843,3844,3853,3864],{"__ignoreMap":65},[69,3845,3846,3849,3851],{"class":71,"line":72},[69,3847,3848],{"class":1085},"ogImage",[69,3850,1074],{"class":1058},[69,3852,1077],{"class":1058},[69,3854,3855,3858,3860],{"class":71,"line":78},[69,3856,3857],{"class":1085},"  zeroRuntime",[69,3859,1074],{"class":1058},[69,3861,3863],{"class":3862},"sfNiH"," true\n",[69,3865,3866],{"class":71,"line":84},[69,3867,1674],{"class":1058},[16,3869,3870],{},"Das bedeutet:",[2993,3872,3873,3876,3879,3882],{},[2996,3874,3875],{},"Kein API-Call zur Laufzeit",[2996,3877,3878],{},"Keine Latenz beim ersten Aufruf",[2996,3880,3881],{},"Die Bilder liegen als statische PNGs im Build-Output",[2996,3883,3884],{},"Perfekt für Netlify Deploy Previews und CDN-Caching",[39,3886,3888],{"id":3887},"self-hosted-fonts","Self-hosted Fonts",[16,3890,3891,3892,1074],{},"Damit die OG-Images DSGVO-konform sind, werden die Schriftarten nicht von Google Fonts geladen, sondern direkt ins Bild eingebunden. Dazu konfigurierst du die gewünschten Fonts via ",[23,3893,3894],{},"@nuxt\u002Ffonts",[60,3896,3898],{"className":3839,"code":3897,"language":3841,"meta":65,"style":65},"fonts: {\n  families: [\n    { name: \"Inter\", provider: \"google\", weights: [400, 700] }\n  ]\n}\n",[23,3899,3900,3909,3918,3970,3975],{"__ignoreMap":65},[69,3901,3902,3905,3907],{"class":71,"line":72},[69,3903,3904],{"class":1085},"fonts",[69,3906,1074],{"class":1058},[69,3908,1077],{"class":1058},[69,3910,3911,3914,3916],{"class":71,"line":78},[69,3912,3913],{"class":1085},"  families",[69,3915,1074],{"class":1058},[69,3917,1733],{"class":1115},[69,3919,3920,3922,3925,3927,3929,3932,3934,3936,3939,3941,3943,3946,3948,3950,3953,3955,3957,3960,3962,3965,3968],{"class":71,"line":84},[69,3921,1459],{"class":1058},[69,3923,3924],{"class":1115}," name",[69,3926,1074],{"class":1058},[69,3928,1138],{"class":1058},[69,3930,3931],{"class":1141},"Inter",[69,3933,1071],{"class":1058},[69,3935,1400],{"class":1058},[69,3937,3938],{"class":1115}," provider",[69,3940,1074],{"class":1058},[69,3942,1138],{"class":1058},[69,3944,3945],{"class":1141},"google",[69,3947,1071],{"class":1058},[69,3949,1400],{"class":1058},[69,3951,3952],{"class":1115}," weights",[69,3954,1074],{"class":1058},[69,3956,2532],{"class":1115},[69,3958,3959],{"class":1100},"400",[69,3961,1400],{"class":1058},[69,3963,3964],{"class":1100}," 700",[69,3966,3967],{"class":1115},"] ",[69,3969,1674],{"class":1058},[69,3971,3972],{"class":71,"line":90},[69,3973,3974],{"class":1115},"  ]\n",[69,3976,3977],{"class":71,"line":96},[69,3978,1674],{"class":1058},[16,3980,3981],{},"Das Modul lädt die Fonts herunter und bettet sie in die OG-Images ein – kein Runtime-Request, keine Datenschutzbedenken.",[39,3983,3985],{"id":3984},"einsatz-auf-jeder-seite","Einsatz auf jeder Seite",[16,3987,3988,3989,3992,3993,3995,3996,33,3999,4002],{},"Die Nutzung ist komfortabel: Auf jeder Seite rufst du einfach ",[23,3990,3991],{},"defineOgImage(\"MeinTemplate\")"," auf. Der Name bezieht sich dabei auf die Datei unter ",[23,3994,3705],{},". Werte wie ",[23,3997,3998],{},"title",[23,4000,4001],{},"description"," werden automatisch aus den SeoMeta-Tags übernommen – oder du übergibst sie explizit:",[60,4004,4006],{"className":3839,"code":4005,"language":3841,"meta":65,"style":65},"defineOgImage({\n  component: \"Default\",\n  props: {\n    title: \"Mein eigener Titel\",\n    description: \"Eine individuelle Beschreibung\"\n  }\n})\n",[23,4007,4008,4018,4034,4043,4059,4073,4077],{"__ignoreMap":65},[69,4009,4010,4013,4016],{"class":71,"line":72},[69,4011,4012],{"class":1294},"defineOgImage",[69,4014,4015],{"class":1052},"(",[69,4017,1059],{"class":1058},[69,4019,4020,4023,4025,4027,4030,4032],{"class":71,"line":78},[69,4021,4022],{"class":1115},"  component",[69,4024,1074],{"class":1058},[69,4026,1138],{"class":1058},[69,4028,4029],{"class":1141},"Default",[69,4031,1071],{"class":1058},[69,4033,1147],{"class":1058},[69,4035,4036,4039,4041],{"class":71,"line":84},[69,4037,4038],{"class":1115},"  props",[69,4040,1074],{"class":1058},[69,4042,1077],{"class":1058},[69,4044,4045,4048,4050,4052,4055,4057],{"class":71,"line":90},[69,4046,4047],{"class":1115},"    title",[69,4049,1074],{"class":1058},[69,4051,1138],{"class":1058},[69,4053,4054],{"class":1141},"Mein eigener Titel",[69,4056,1071],{"class":1058},[69,4058,1147],{"class":1058},[69,4060,4061,4064,4066,4068,4071],{"class":71,"line":96},[69,4062,4063],{"class":1115},"    description",[69,4065,1074],{"class":1058},[69,4067,1138],{"class":1058},[69,4069,4070],{"class":1141},"Eine individuelle Beschreibung",[69,4072,1166],{"class":1058},[69,4074,4075],{"class":71,"line":102},[69,4076,1669],{"class":1058},[69,4078,4079,4082],{"class":71,"line":108},[69,4080,4081],{"class":1058},"}",[69,4083,4084],{"class":1052},")\n",[16,4086,4087],{},"Das Ergebnis sind scharfe, konsistente OG-Images für jede Seite – ohne manuelle Arbeit.",[3103,4089,4090],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":65,"searchDepth":78,"depth":78,"links":4092},[4093,4094,4095,4096,4097],{"id":3664,"depth":78,"text":3665},{"id":3691,"depth":78,"text":3692},{"id":3828,"depth":78,"text":3829},{"id":3887,"depth":78,"text":3888},{"id":3984,"depth":78,"text":3985},"Wie du dynamische Open-Graph-Bilder mit nuxt-og-image und dem Takumi-Plugin erstellst – ohne externe Dienste, DSGVO-konform und mit zero Runtime.","OG Image, Open Graph, Takumi, SEO, Social Media Preview, DSGVO",{},"\u002Fblog\u002F2026-06-10-modernes-og-image-handling","2026-06-10",{"title":3653,"description":4098},{"loc":4101},"blog\u002F2026-06-10-modernes-og-image-handling","nQT519OPNiPw9g5T5NVrdEoqp1sYhDRH9ov3e1Uufx8",{"id":4108,"title":4109,"author":7,"body":4110,"description":4374,"extension":3121,"keywords":4375,"meta":4376,"navigation":129,"path":4377,"publishedAt":4378,"seo":4379,"sitemap":4380,"stem":4381,"__hash__":4382},"blog\u002Fblog\u002F2026-06-01-erste-schritte-mit-nuxt-4.md","Erste Schritte mit Nuxt 4",{"type":9,"value":4111,"toc":4366},[4112,4115,4118,4126,4135,4138,4144,4147,4171,4175,4178,4182,4185,4264,4267,4271,4274,4294,4297,4321,4325,4328,4360,4363],[12,4113,4109],{"id":4114},"erste-schritte-mit-nuxt-4",[16,4116,4117],{},"Nuxt 4 bringt einige spannende Neuerungen mit sich. Nach langer Entwicklungszeit ist das Release endlich da und macht die Entwicklung von Vue-Anwendungen noch angenehmer. In diesem Artikel werfen wir einen Blick auf die wichtigsten Änderungen und zeigen, wie du dein bestehendes Projekt migrierst.",[39,4119,4121,4122,4125],{"id":4120},"das-neue-app-verzeichnis","Das neue ",[23,4123,4124],{},"app\u002F","-Verzeichnis",[16,4127,4128,4129,4131,4132,4134],{},"Die auffälligste Änderung: Statt alles im Projektroot zu verteilen, liegt der Anwendungscode jetzt zentral unter ",[23,4130,4124],{},". Das sorgt für eine klarere Struktur und trennt Framework-Konfiguration (Root) von Anwendungscode (",[23,4133,4124],{},").",[16,4136,4137],{},"Ein typisches Nuxt 4 Projekt sieht so aus:",[60,4139,4142],{"className":4140,"code":4141,"language":1240},[3281],"nuxt.config.ts\napp\u002F\n  app.vue\n  pages\u002F\n  components\u002F\n  layouts\u002F\n  assets\u002F\n  composables\u002F\n  data\u002F\ncontent\u002F\npublic\u002F\n",[23,4143,4141],{"__ignoreMap":65},[16,4145,4146],{},"Vorteile dieser Struktur:",[2993,4148,4149,4155,4161],{},[2996,4150,4151,4154],{},[298,4152,4153],{},"Klarer Schnitt",": Framework-Konfiguration vs. Anwendungslogik",[2996,4156,4157,4160],{},[298,4158,4159],{},"Skalierbarkeit",": Auch bei vielen Dateien bleibt das Root übersichtlich",[2996,4162,4163,4166,4167,4170],{},[298,4164,4165],{},"Migration",": ",[23,4168,4169],{},"nuxt prepare"," verschiebt vorhandene Dateien automatisch",[39,4172,4174],{"id":4173},"turbo-modus","Turbo-Modus",[16,4176,4177],{},"Nuxt 4 führt den Turbo-Modus ein. Dabei werden Seiten und Komponenten asynchron geladen, sobald der Nutzer mit ihnen interagiert. Die Navigation zwischen Seiten fühlt sich dadurch flüssiger an – ähnlich wie bei einer Single-Page-Application, aber ohne die Nachteile für SEO.",[39,4179,4181],{"id":4180},"typescript-first","TypeScript-First",[16,4183,4184],{},"Nuxt 4 setzt noch stärker auf TypeScript. Viele APIs wurden typ-sicherer gemacht, was die Entwicklung angenehmer macht:",[60,4186,4188],{"className":3839,"code":4187,"language":3841,"meta":65,"style":65},"\u002F\u002F useFetch ist jetzt voll typisiert\nconst { data } = await useFetch\u003CMyType>(\"\u002Fapi\u002Fendpoint\")\n\n\u002F\u002F useRuntimeConfig liefert die richtigen Typen\nconst config = useRuntimeConfig()\n\u002F\u002F config.public.myKey ist automatisch typisiert\n",[23,4189,4190,4195,4235,4239,4244,4259],{"__ignoreMap":65},[69,4191,4192],{"class":71,"line":72},[69,4193,4194],{"class":1046},"\u002F\u002F useFetch ist jetzt voll typisiert\n",[69,4196,4197,4200,4202,4205,4207,4210,4214,4217,4219,4222,4224,4226,4228,4231,4233],{"class":71,"line":78},[69,4198,4199],{"class":1067},"const",[69,4201,1289],{"class":1058},[69,4203,4204],{"class":1052}," data ",[69,4206,4081],{"class":1058},[69,4208,4209],{"class":1058}," =",[69,4211,4213],{"class":4212},"s7zQu"," await",[69,4215,4216],{"class":1294}," useFetch",[69,4218,3717],{"class":1058},[69,4220,4221],{"class":1085},"MyType",[69,4223,3767],{"class":1058},[69,4225,4015],{"class":1052},[69,4227,1071],{"class":1058},[69,4229,4230],{"class":1141},"\u002Fapi\u002Fendpoint",[69,4232,1071],{"class":1058},[69,4234,4084],{"class":1052},[69,4236,4237],{"class":71,"line":84},[69,4238,130],{"emptyLinePlaceholder":129},[69,4240,4241],{"class":71,"line":90},[69,4242,4243],{"class":1046},"\u002F\u002F useRuntimeConfig liefert die richtigen Typen\n",[69,4245,4246,4248,4251,4253,4256],{"class":71,"line":96},[69,4247,4199],{"class":1067},[69,4249,4250],{"class":1052}," config ",[69,4252,3737],{"class":1058},[69,4254,4255],{"class":1294}," useRuntimeConfig",[69,4257,4258],{"class":1052},"()\n",[69,4260,4261],{"class":71,"line":102},[69,4262,4263],{"class":1046},"\u002F\u002F config.public.myKey ist automatisch typisiert\n",[16,4265,4266],{},"Der TypeScript-Support wurde nicht nur verbessert, sondern ist jetzt Standard: Jedes neue Nuxt-Projekt wird mit TypeScript ausgeliefert.",[39,4268,4270],{"id":4269},"performance","Performance",[16,4272,4273],{},"Durch verschiedene Optimierungen im Core läuft Nuxt 4 spürbar schneller – sowohl im Dev-Modus:",[2993,4275,4276,4282,4288],{},[2996,4277,4278,4281],{},[298,4279,4280],{},"Vite 7",": Deutlich schnellere Modul-Auflösung und HMR",[2996,4283,4284,4287],{},[298,4285,4286],{},"Optimierte Serialisierung",": Weniger Overhead bei der Server-Kommunikation",[2996,4289,4290,4293],{},[298,4291,4292],{},"Lazy Hydration",": Komponenten werden nur hydriert, wenn sie im Viewport sind",[16,4295,4296],{},"als auch im Production-Build:",[2993,4298,4299,4305,4311],{},[2996,4300,4301,4304],{},[298,4302,4303],{},"Kleinere Bundles",": Durch Tree-Shaking auf Komponenten-Ebene",[2996,4306,4307,4310],{},[298,4308,4309],{},"Schnellere Navigation",": Prefetching von Seiten-Visits",[2996,4312,4313,4316,4317,4320],{},[298,4314,4315],{},"Optimierte Bildverarbeitung",": Integration mit ",[23,4318,4319],{},"@nuxt\u002Fimage"," ohne Extra-Konfiguration",[39,4322,4324],{"id":4323},"migration-von-nuxt-3","Migration von Nuxt 3",[16,4326,4327],{},"Die Migration von Nuxt 3 auf 4 ist dank des integrierten Migrations-Tools einfach:",[60,4329,4333],{"className":4330,"code":4331,"language":4332,"meta":65,"style":65},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx nuxi upgrade --force\nnuxt prepare --migrate\n","bash",[23,4334,4335,4349],{"__ignoreMap":65},[69,4336,4337,4340,4343,4346],{"class":71,"line":72},[69,4338,4339],{"class":1085},"npx",[69,4341,4342],{"class":1141}," nuxi",[69,4344,4345],{"class":1141}," upgrade",[69,4347,4348],{"class":1141}," --force\n",[69,4350,4351,4354,4357],{"class":71,"line":78},[69,4352,4353],{"class":1085},"nuxt",[69,4355,4356],{"class":1141}," prepare",[69,4358,4359],{"class":1141}," --migrate\n",[16,4361,4362],{},"Das Tool verschiebt automatisch Dateien, aktualisiert die Konfiguration und passt Import-Pfade an. In den meisten Fällen sind danach nur minimale manuelle Anpassungen nötig.",[3103,4364,4365],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":65,"searchDepth":78,"depth":78,"links":4367},[4368,4370,4371,4372,4373],{"id":4120,"depth":78,"text":4369},"Das neue app\u002F-Verzeichnis",{"id":4173,"depth":78,"text":4174},{"id":4180,"depth":78,"text":4181},{"id":4269,"depth":78,"text":4270},{"id":4323,"depth":78,"text":4324},"Ein Überblick über die Neuerungen in Nuxt 4, das neue app\u002F-Verzeichnis und wie du dein Projekt migrierst.","Nuxt 4, Vue.js, TypeScript, Web Development, Migration, Framework",{},"\u002Fblog\u002F2026-06-01-erste-schritte-mit-nuxt-4","2026-06-01",{"title":4109,"description":4374},{"loc":4377},"blog\u002F2026-06-01-erste-schritte-mit-nuxt-4","fWCg-uqLXjWge1_xhmfXNBO9SAtB6g5_JgHS-EvRyJM",{"id":4384,"title":4385,"author":7,"body":4386,"description":4891,"extension":3121,"keywords":4892,"meta":4893,"navigation":129,"path":4894,"publishedAt":4895,"seo":4896,"sitemap":4897,"stem":4898,"__hash__":4899},"blog\u002Fblog\u002F2026-05-15-tailwind-v4-mit-nuxt.md","Tailwind CSS v4 mit Nuxt nutzen",{"type":9,"value":4387,"toc":4883},[4388,4391,4394,4398,4405,4424,4431,4485,4491,4524,4528,4539,4603,4606,4626,4630,4636,4687,4690,4729,4733,4736,4760,4763,4765,4768,4771,4790,4794,4804,4870,4880],[12,4389,4385],{"id":4390},"tailwind-css-v4-mit-nuxt-nutzen",[16,4392,4393],{},"Tailwind CSS v4 ist da und bringt viele Verbesserungen gegenüber v3. Neben einer grundlegend überarbeiteten Konfiguration und besserer Performance gibt es ein neues Plugin-System. Hier zeige ich dir, wie du es mit Nuxt kombinierst.",[39,4395,4397],{"id":4396},"installation","Installation",[16,4399,4400,4401,4404],{},"In einem bestehenden Nuxt-Projekt installierst du Tailwind v4 über npm. Da ",[23,4402,4403],{},"@nuxt\u002Fui"," v4 bereits Tailwind v4 mitbringt, entfällt in vielen Fällen die manuelle Installation:",[60,4406,4408],{"className":4330,"code":4407,"language":4332,"meta":65,"style":65},"npm install tailwindcss @tailwindcss\u002Fvite\n",[23,4409,4410],{"__ignoreMap":65},[69,4411,4412,4415,4418,4421],{"class":71,"line":72},[69,4413,4414],{"class":1085},"npm",[69,4416,4417],{"class":1141}," install",[69,4419,4420],{"class":1141}," tailwindcss",[69,4422,4423],{"class":1141}," @tailwindcss\u002Fvite\n",[16,4425,4426,4427,4430],{},"In der ",[23,4428,4429],{},"nuxt.config.ts"," bindest du das Vite-Plugin ein:",[60,4432,4434],{"className":3839,"code":4433,"language":3841,"meta":65,"style":65},"export default defineNuxtConfig({\n  vite: {\n    plugins: [tailwindcss()]\n  }\n})\n",[23,4435,4436,4451,4460,4475,4479],{"__ignoreMap":65},[69,4437,4438,4441,4444,4447,4449],{"class":71,"line":72},[69,4439,4440],{"class":4212},"export",[69,4442,4443],{"class":4212}," default",[69,4445,4446],{"class":1294}," defineNuxtConfig",[69,4448,4015],{"class":1052},[69,4450,1059],{"class":1058},[69,4452,4453,4456,4458],{"class":71,"line":78},[69,4454,4455],{"class":1115},"  vite",[69,4457,1074],{"class":1058},[69,4459,1077],{"class":1058},[69,4461,4462,4465,4467,4469,4472],{"class":71,"line":84},[69,4463,4464],{"class":1115},"    plugins",[69,4466,1074],{"class":1058},[69,4468,2532],{"class":1052},[69,4470,4471],{"class":1294},"tailwindcss",[69,4473,4474],{"class":1052},"()]\n",[69,4476,4477],{"class":71,"line":90},[69,4478,1669],{"class":1058},[69,4480,4481,4483],{"class":71,"line":96},[69,4482,4081],{"class":1058},[69,4484,4084],{"class":1052},[16,4486,4487,4488,4490],{},"Alternativ – und das ist der empfohlene Weg mit ",[23,4489,4403],{}," v4 – importierst du Tailwind über die CSS-Datei:",[60,4492,4496],{"className":4493,"code":4494,"language":4495,"meta":65,"style":65},"language-css shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@import \"tailwindcss\";\n@import \"@nuxt\u002Fui\";\n","css",[23,4497,4498,4512],{"__ignoreMap":65},[69,4499,4500,4503,4505,4507,4509],{"class":71,"line":72},[69,4501,4502],{"class":4212},"@import",[69,4504,1138],{"class":1058},[69,4506,4471],{"class":1141},[69,4508,1071],{"class":1058},[69,4510,4511],{"class":1058},";\n",[69,4513,4514,4516,4518,4520,4522],{"class":71,"line":78},[69,4515,4502],{"class":4212},[69,4517,1138],{"class":1058},[69,4519,4403],{"class":1141},[69,4521,1071],{"class":1058},[69,4523,4511],{"class":1058},[39,4525,4527],{"id":4526},"css-first-konfiguration","CSS-First Konfiguration",[16,4529,4530,4531,4534,4535,4538],{},"Anders als in v3 wird die Konfiguration jetzt direkt in CSS-Dateien gesteuert. Der ",[23,4532,4533],{},"tailwind.config.js"," entfällt komplett. Stattdessen verwendest du die ",[23,4536,4537],{},"@theme","-Direktive:",[60,4540,4542],{"className":4493,"code":4541,"language":4495,"meta":65,"style":65},"@theme {\n  --color-primary: oklch(0.55 0.2 150);\n  --font-sans: 'Inter', sans-serif;\n  --font-display: 'Space Grotesk', sans-serif;\n  --radius-box: 0.75rem;\n}\n",[23,4543,4544,4550,4571,4583,4594,4599],{"__ignoreMap":65},[69,4545,4546,4548],{"class":71,"line":72},[69,4547,4537],{"class":4212},[69,4549,1077],{"class":1058},[69,4551,4552,4555,4558,4561,4563,4565,4568],{"class":71,"line":78},[69,4553,4554],{"class":1052},"  --color-primary: oklch(0",[69,4556,4557],{"class":1058},".",[69,4559,4560],{"class":1085},"55",[69,4562,2271],{"class":1052},[69,4564,4557],{"class":1058},[69,4566,4567],{"class":1085},"2",[69,4569,4570],{"class":1052}," 150);\n",[69,4572,4573,4576,4578,4581],{"class":71,"line":84},[69,4574,4575],{"class":1052},"  --font-sans: 'Inter'",[69,4577,1400],{"class":1058},[69,4579,4580],{"class":1085}," sans-serif",[69,4582,4511],{"class":1052},[69,4584,4585,4588,4590,4592],{"class":71,"line":90},[69,4586,4587],{"class":1052},"  --font-display: 'Space Grotesk'",[69,4589,1400],{"class":1058},[69,4591,4580],{"class":1085},[69,4593,4511],{"class":1052},[69,4595,4596],{"class":71,"line":96},[69,4597,4598],{"class":1052},"  --radius-box: 0.75rem;\n",[69,4600,4601],{"class":71,"line":102},[69,4602,1674],{"class":1052},[16,4604,4605],{},"Das hat mehrere Vorteile:",[2993,4607,4608,4614,4620],{},[2996,4609,4610,4613],{},[298,4611,4612],{},"Ein zentraler Ort",": Design-Tokens und Styling in einer Datei",[2996,4615,4616,4619],{},[298,4617,4618],{},"Kein JS-Build-Schritt",": Die Konfiguration wird direkt vom CSS-Parser verstanden",[2996,4621,4622,4625],{},[298,4623,4624],{},"Bessere IDE-Unterstützung",": Autovervollständigung für Theme-Variablen",[39,4627,4629],{"id":4628},"theme-direktive","@theme Direktive",[16,4631,4632,4633,4635],{},"Die ",[23,4634,4537],{},"-Direktive definiert dein Design-System. Im Gegensatz zu Tailwind v3, wo die Konfiguration in JavaScript erfolgte, arbeitest du jetzt rein in CSS:",[60,4637,4639],{"className":4493,"code":4638,"language":4495,"meta":65,"style":65},"@theme {\n  --color-brand: #00DC82;\n  --color-brand-dark: #00A155;\n  --font-mono: 'JetBrains Mono', monospace;\n  --spacing-page: 2rem;\n}\n",[23,4640,4641,4647,4658,4668,4678,4683],{"__ignoreMap":65},[69,4642,4643,4645],{"class":71,"line":72},[69,4644,4537],{"class":4212},[69,4646,1077],{"class":1058},[69,4648,4649,4652,4655],{"class":71,"line":78},[69,4650,4651],{"class":1052},"  --color-brand: ",[69,4653,4654],{"class":1058},"#",[69,4656,4657],{"class":1052},"00DC82;\n",[69,4659,4660,4663,4665],{"class":71,"line":84},[69,4661,4662],{"class":1052},"  --color-brand-dark: ",[69,4664,4654],{"class":1058},[69,4666,4667],{"class":1052},"00A155;\n",[69,4669,4670,4673,4675],{"class":71,"line":90},[69,4671,4672],{"class":1052},"  --font-mono: 'JetBrains Mono'",[69,4674,1400],{"class":1058},[69,4676,4677],{"class":1052}," monospace;\n",[69,4679,4680],{"class":71,"line":96},[69,4681,4682],{"class":1052},"  --spacing-page: 2rem;\n",[69,4684,4685],{"class":71,"line":102},[69,4686,1674],{"class":1052},[16,4688,4689],{},"Die Variablen sind dann sowohl in deinem CSS als auch in Tailwind-Klassen nutzbar:",[60,4691,4695],{"className":4692,"code":4693,"language":4694,"meta":65,"style":65},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cdiv class=\"bg-brand text-white p-page\">\n  Mit Tailwind v4\n\u003C\u002Fdiv>\n","html",[23,4696,4697,4716,4721],{"__ignoreMap":65},[69,4698,4699,4701,4703,4705,4707,4709,4712,4714],{"class":71,"line":72},[69,4700,3717],{"class":1058},[69,4702,3731],{"class":1115},[69,4704,3734],{"class":1067},[69,4706,3737],{"class":1058},[69,4708,1071],{"class":1058},[69,4710,4711],{"class":1141},"bg-brand text-white p-page",[69,4713,1071],{"class":1058},[69,4715,3723],{"class":1058},[69,4717,4718],{"class":71,"line":78},[69,4719,4720],{"class":1052},"  Mit Tailwind v4\n",[69,4722,4723,4725,4727],{"class":71,"line":84},[69,4724,3773],{"class":1058},[69,4726,3731],{"class":1115},[69,4728,3723],{"class":1058},[39,4730,4732],{"id":4731},"plugin-system","Plugin-System",[16,4734,4735],{},"Plugins werden in Tailwind v4 ebenfalls über CSS eingebunden:",[60,4737,4739],{"className":4493,"code":4738,"language":4495,"meta":65,"style":65},"@plugin \"@tailwindcss\u002Ftypography\";\n@plugin \"@tailwindcss\u002Fforms\";\n",[23,4740,4741,4751],{"__ignoreMap":65},[69,4742,4743,4746,4749],{"class":71,"line":72},[69,4744,4745],{"class":4212},"@plugin",[69,4747,4748],{"class":1052}," \"@tailwindcss\u002Ftypography\"",[69,4750,4511],{"class":1058},[69,4752,4753,4755,4758],{"class":71,"line":78},[69,4754,4745],{"class":4212},[69,4756,4757],{"class":1052}," \"@tailwindcss\u002Fforms\"",[69,4759,4511],{"class":1058},[16,4761,4762],{},"Das mag auf den ersten Blick ungewohnt wirken, macht aber das Build-System einfacher und schneller. Jedes Plugin registriert sich selbstständig und fügt seine Utilities und Theme-Werte hinzu.",[39,4764,4270],{"id":4269},[16,4766,4767],{},"Tailwind v4 generiert nur noch das CSS, das du tatsächlich nutzt – und das schneller als je zuvor. Der neue Parser arbeitet streaming-basiert und muss nicht mehr das gesamte Projekt scannen, bevor der erste CSS-Token ausgegeben wird.",[16,4769,4770],{},"In der Praxis bedeutet das:",[2993,4772,4773,4778,4784],{},[2996,4774,4775,4777],{},[298,4776,4303],{},": Kein ungenutztes CSS mehr – auch ohne PurgeCSS",[2996,4779,4780,4783],{},[298,4781,4782],{},"Schnellere Builds",": Bis zu 10x schneller als v3 bei großen Projekten",[2996,4785,4786,4789],{},[298,4787,4788],{},"Bessere DX",": HMR-Updates sind gefühlt sofort da",[39,4791,4793],{"id":4792},"integration-mit-nuxtui-v4","Integration mit @nuxt\u002Fui v4",[16,4795,4796,4797,4799,4800,4803],{},"Wenn du ",[23,4798,4403],{}," v4 verwendest, ist Tailwind v4 bereits integriert. Du musst nur noch deine Theme-Variablen in der ",[23,4801,4802],{},"main.css"," definieren:",[60,4805,4807],{"className":4493,"code":4806,"language":4495,"meta":65,"style":65},"@import \"tailwindcss\";\n@import \"@nuxt\u002Fui\";\n\n@theme static {\n  --font-sans: 'Inter', sans-serif;\n  --font-display: 'Space Grotesk', sans-serif;\n}\n",[23,4808,4809,4821,4833,4837,4846,4856,4866],{"__ignoreMap":65},[69,4810,4811,4813,4815,4817,4819],{"class":71,"line":72},[69,4812,4502],{"class":4212},[69,4814,1138],{"class":1058},[69,4816,4471],{"class":1141},[69,4818,1071],{"class":1058},[69,4820,4511],{"class":1058},[69,4822,4823,4825,4827,4829,4831],{"class":71,"line":78},[69,4824,4502],{"class":4212},[69,4826,1138],{"class":1058},[69,4828,4403],{"class":1141},[69,4830,1071],{"class":1058},[69,4832,4511],{"class":1058},[69,4834,4835],{"class":71,"line":84},[69,4836,130],{"emptyLinePlaceholder":129},[69,4838,4839,4841,4844],{"class":71,"line":90},[69,4840,4537],{"class":4212},[69,4842,4843],{"class":1052}," static ",[69,4845,1059],{"class":1058},[69,4847,4848,4850,4852,4854],{"class":71,"line":96},[69,4849,4575],{"class":1052},[69,4851,1400],{"class":1058},[69,4853,4580],{"class":1085},[69,4855,4511],{"class":1052},[69,4857,4858,4860,4862,4864],{"class":71,"line":102},[69,4859,4587],{"class":1052},[69,4861,1400],{"class":1058},[69,4863,4580],{"class":1085},[69,4865,4511],{"class":1052},[69,4867,4868],{"class":71,"line":108},[69,4869,1674],{"class":1052},[16,4871,4872,4873,4876,4877,4879],{},"Das ",[23,4874,4875],{},"static","-Keyword verhindert dabei, dass deine Theme-Werte durch die Standardwerte von ",[23,4878,4403],{}," überschrieben werden.",[3103,4881,4882],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":65,"searchDepth":78,"depth":78,"links":4884},[4885,4886,4887,4888,4889,4890],{"id":4396,"depth":78,"text":4397},{"id":4526,"depth":78,"text":4527},{"id":4628,"depth":78,"text":4629},{"id":4731,"depth":78,"text":4732},{"id":4269,"depth":78,"text":4270},{"id":4792,"depth":78,"text":4793},"Wie du Tailwind CSS v4 in deinem Nuxt-Projekt einrichtest, die CSS-First-Konfiguration nutzt und von verbesserter Performance profitierst.","Tailwind CSS v4, CSS Framework, Nuxt, Utility-First, Web Design, Frontend Entwicklung",{},"\u002Fblog\u002F2026-05-15-tailwind-v4-mit-nuxt","2026-05-15",{"title":4385,"description":4891},{"loc":4894},"blog\u002F2026-05-15-tailwind-v4-mit-nuxt","djEOGTHf3eE7BDRQX9B8BPYC7h5o9aV39oVRSGm-po4",{"id":5,"title":6,"author":7,"body":4901,"description":3120,"extension":3121,"keywords":3122,"meta":7497,"navigation":129,"path":3124,"publishedAt":3125,"seo":7498,"sitemap":7499,"stem":3128,"__hash__":3129},{"type":9,"value":4902,"toc":7483},[4903,4905,4907,4917,4919,4921,4923,4925,4927,5043,5055,5087,5091,5093,5097,5099,5199,5215,5255,5263,5265,5269,5453,5455,5457,5459,5623,5625,5627,5643,5649,5655,5657,5659,5661,5663,6233,6899,7255,7257,7259,7261,7263,7397,7399,7409,7421,7425,7427,7429,7441,7445,7447,7457,7461,7463,7465,7481],[12,4904,6],{"id":14},[16,4906,18],{},[16,4908,21,4909,26,4911,26,4913,33,4915,37],{},[23,4910,25],{},[23,4912,29],{},[23,4914,32],{},[23,4916,36],{},[39,4918,42],{"id":41},[16,4920,45],{},[47,4922,50],{"id":49},[16,4924,53],{},[55,4926],{":config":57,"code":58},[60,4928,4929],{"className":62,"code":63,"language":64,"meta":65,"style":65},[23,4930,4931,4935,4939,4943,4947,4951,4955,4959,4963,4967,4971,4975,4979,4983,4987,4991,4995,4999,5003,5007,5011,5015,5019,5023,5027,5031,5035,5039],{"__ignoreMap":65},[69,4932,4933],{"class":71,"line":72},[69,4934,75],{},[69,4936,4937],{"class":71,"line":78},[69,4938,81],{},[69,4940,4941],{"class":71,"line":84},[69,4942,87],{},[69,4944,4945],{"class":71,"line":90},[69,4946,93],{},[69,4948,4949],{"class":71,"line":96},[69,4950,99],{},[69,4952,4953],{"class":71,"line":102},[69,4954,105],{},[69,4956,4957],{"class":71,"line":108},[69,4958,111],{},[69,4960,4961],{"class":71,"line":114},[69,4962,117],{},[69,4964,4965],{"class":71,"line":120},[69,4966,123],{},[69,4968,4969],{"class":71,"line":126},[69,4970,130],{"emptyLinePlaceholder":129},[69,4972,4973],{"class":71,"line":133},[69,4974,136],{},[69,4976,4977],{"class":71,"line":139},[69,4978,130],{"emptyLinePlaceholder":129},[69,4980,4981],{"class":71,"line":144},[69,4982,147],{},[69,4984,4985],{"class":71,"line":150},[69,4986,153],{},[69,4988,4989],{"class":71,"line":156},[69,4990,159],{},[69,4992,4993],{"class":71,"line":162},[69,4994,165],{},[69,4996,4997],{"class":71,"line":168},[69,4998,171],{},[69,5000,5001],{"class":71,"line":174},[69,5002,177],{},[69,5004,5005],{"class":71,"line":180},[69,5006,183],{},[69,5008,5009],{"class":71,"line":186},[69,5010,130],{"emptyLinePlaceholder":129},[69,5012,5013],{"class":71,"line":191},[69,5014,194],{},[69,5016,5017],{"class":71,"line":197},[69,5018,200],{},[69,5020,5021],{"class":71,"line":203},[69,5022,206],{},[69,5024,5025],{"class":71,"line":209},[69,5026,130],{"emptyLinePlaceholder":129},[69,5028,5029],{"class":71,"line":214},[69,5030,217],{},[69,5032,5033],{"class":71,"line":220},[69,5034,223],{},[69,5036,5037],{"class":71,"line":226},[69,5038,229],{},[69,5040,5041],{"class":71,"line":232},[69,5042,235],{},[16,5044,238,5045,241,5047,245,5049,249,5051,253,5053,257],{},[23,5046,25],{},[23,5048,244],{},[23,5050,248],{},[23,5052,252],{},[23,5054,256],{},[60,5056,5057],{"className":62,"code":260,"language":64,"meta":65,"style":65},[23,5058,5059,5063,5067,5071,5075,5079,5083],{"__ignoreMap":65},[69,5060,5061],{"class":71,"line":72},[69,5062,267],{},[69,5064,5065],{"class":71,"line":78},[69,5066,200],{},[69,5068,5069],{"class":71,"line":84},[69,5070,276],{},[69,5072,5073],{"class":71,"line":90},[69,5074,130],{"emptyLinePlaceholder":129},[69,5076,5077],{"class":71,"line":96},[69,5078,285],{},[69,5080,5081],{"class":71,"line":102},[69,5082,200],{},[69,5084,5085],{"class":71,"line":108},[69,5086,294],{},[16,5088,5089,301],{},[298,5090,300],{},[47,5092,305],{"id":304},[16,5094,5095,310],{},[23,5096,29],{},[55,5098],{":config":57,"code":313},[60,5100,5101],{"className":62,"code":316,"language":64,"meta":65,"style":65},[23,5102,5103,5107,5111,5115,5119,5123,5127,5131,5135,5139,5143,5147,5151,5155,5159,5163,5167,5171,5175,5179,5183,5187,5191,5195],{"__ignoreMap":65},[69,5104,5105],{"class":71,"line":72},[69,5106,323],{},[69,5108,5109],{"class":71,"line":78},[69,5110,130],{"emptyLinePlaceholder":129},[69,5112,5113],{"class":71,"line":84},[69,5114,332],{},[69,5116,5117],{"class":71,"line":90},[69,5118,337],{},[69,5120,5121],{"class":71,"line":96},[69,5122,130],{"emptyLinePlaceholder":129},[69,5124,5125],{"class":71,"line":102},[69,5126,346],{},[69,5128,5129],{"class":71,"line":108},[69,5130,351],{},[69,5132,5133],{"class":71,"line":114},[69,5134,356],{},[69,5136,5137],{"class":71,"line":120},[69,5138,361],{},[69,5140,5141],{"class":71,"line":126},[69,5142,366],{},[69,5144,5145],{"class":71,"line":133},[69,5146,371],{},[69,5148,5149],{"class":71,"line":139},[69,5150,130],{"emptyLinePlaceholder":129},[69,5152,5153],{"class":71,"line":144},[69,5154,380],{},[69,5156,5157],{"class":71,"line":150},[69,5158,356],{},[69,5160,5161],{"class":71,"line":156},[69,5162,361],{},[69,5164,5165],{"class":71,"line":162},[69,5166,393],{},[69,5168,5169],{"class":71,"line":168},[69,5170,371],{},[69,5172,5173],{"class":71,"line":174},[69,5174,130],{"emptyLinePlaceholder":129},[69,5176,5177],{"class":71,"line":180},[69,5178,406],{},[69,5180,5181],{"class":71,"line":186},[69,5182,411],{},[69,5184,5185],{"class":71,"line":191},[69,5186,416],{},[69,5188,5189],{"class":71,"line":197},[69,5190,130],{"emptyLinePlaceholder":129},[69,5192,5193],{"class":71,"line":203},[69,5194,425],{},[69,5196,5197],{"class":71,"line":209},[69,5198,430],{},[60,5200,5201],{"className":62,"code":433,"language":64,"meta":65,"style":65},[23,5202,5203,5207,5211],{"__ignoreMap":65},[69,5204,5205],{"class":71,"line":72},[69,5206,440],{},[69,5208,5209],{"class":71,"line":78},[69,5210,445],{},[69,5212,5213],{"class":71,"line":84},[69,5214,450],{},[60,5216,5217],{"className":62,"code":453,"language":64,"meta":65,"style":65},[23,5218,5219,5223,5227,5231,5235,5239,5243,5247,5251],{"__ignoreMap":65},[69,5220,5221],{"class":71,"line":72},[69,5222,460],{},[69,5224,5225],{"class":71,"line":78},[69,5226,465],{},[69,5228,5229],{"class":71,"line":84},[69,5230,470],{},[69,5232,5233],{"class":71,"line":90},[69,5234,475],{},[69,5236,5237],{"class":71,"line":96},[69,5238,480],{},[69,5240,5241],{"class":71,"line":102},[69,5242,361],{},[69,5244,5245],{"class":71,"line":108},[69,5246,366],{},[69,5248,5249],{"class":71,"line":114},[69,5250,493],{},[69,5252,5253],{"class":71,"line":120},[69,5254,498],{},[16,5256,238,5257,504,5259,508,5261,511],{},[23,5258,503],{},[23,5260,507],{},[23,5262,29],{},[47,5264,515],{"id":514},[16,5266,5267,520],{},[23,5268,32],{},[60,5270,5271],{"className":62,"code":523,"language":64,"meta":65,"style":65},[23,5272,5273,5277,5281,5285,5289,5293,5297,5301,5305,5309,5313,5317,5321,5325,5329,5333,5337,5341,5345,5349,5353,5357,5361,5365,5369,5373,5377,5381,5385,5389,5393,5397,5401,5405,5409,5413,5417,5421,5425,5429,5433,5437,5441,5445,5449],{"__ignoreMap":65},[69,5274,5275],{"class":71,"line":72},[69,5276,530],{},[69,5278,5279],{"class":71,"line":78},[69,5280,130],{"emptyLinePlaceholder":129},[69,5282,5283],{"class":71,"line":84},[69,5284,539],{},[69,5286,5287],{"class":71,"line":90},[69,5288,544],{},[69,5290,5291],{"class":71,"line":96},[69,5292,549],{},[69,5294,5295],{"class":71,"line":102},[69,5296,554],{},[69,5298,5299],{"class":71,"line":108},[69,5300,559],{},[69,5302,5303],{"class":71,"line":114},[69,5304,564],{},[69,5306,5307],{"class":71,"line":120},[69,5308,130],{"emptyLinePlaceholder":129},[69,5310,5311],{"class":71,"line":126},[69,5312,573],{},[69,5314,5315],{"class":71,"line":133},[69,5316,578],{},[69,5318,5319],{"class":71,"line":139},[69,5320,130],{"emptyLinePlaceholder":129},[69,5322,5323],{"class":71,"line":144},[69,5324,587],{},[69,5326,5327],{"class":71,"line":150},[69,5328,592],{},[69,5330,5331],{"class":71,"line":156},[69,5332,597],{},[69,5334,5335],{"class":71,"line":162},[69,5336,602],{},[69,5338,5339],{"class":71,"line":168},[69,5340,607],{},[69,5342,5343],{"class":71,"line":174},[69,5344,612],{},[69,5346,5347],{"class":71,"line":180},[69,5348,130],{"emptyLinePlaceholder":129},[69,5350,5351],{"class":71,"line":186},[69,5352,621],{},[69,5354,5355],{"class":71,"line":191},[69,5356,626],{},[69,5358,5359],{"class":71,"line":197},[69,5360,631],{},[69,5362,5363],{"class":71,"line":203},[69,5364,636],{},[69,5366,5367],{"class":71,"line":209},[69,5368,641],{},[69,5370,5371],{"class":71,"line":214},[69,5372,130],{"emptyLinePlaceholder":129},[69,5374,5375],{"class":71,"line":220},[69,5376,650],{},[69,5378,5379],{"class":71,"line":226},[69,5380,655],{},[69,5382,5383],{"class":71,"line":232},[69,5384,81],{},[69,5386,5387],{"class":71,"line":662},[69,5388,665],{},[69,5390,5391],{"class":71,"line":668},[69,5392,671],{},[69,5394,5395],{"class":71,"line":674},[69,5396,123],{},[69,5398,5399],{"class":71,"line":679},[69,5400,130],{"emptyLinePlaceholder":129},[69,5402,5403],{"class":71,"line":684},[69,5404,687],{},[69,5406,5407],{"class":71,"line":690},[69,5408,693],{},[69,5410,5411],{"class":71,"line":696},[69,5412,699],{},[69,5414,5415],{"class":71,"line":702},[69,5416,705],{},[69,5418,5419],{"class":71,"line":708},[69,5420,130],{"emptyLinePlaceholder":129},[69,5422,5423],{"class":71,"line":713},[69,5424,716],{},[69,5426,5427],{"class":71,"line":719},[69,5428,722],{},[69,5430,5431],{"class":71,"line":725},[69,5432,728],{},[69,5434,5435],{"class":71,"line":731},[69,5436,734],{},[69,5438,5439],{"class":71,"line":737},[69,5440,740],{},[69,5442,5443],{"class":71,"line":743},[69,5444,746],{},[69,5446,5447],{"class":71,"line":749},[69,5448,752],{},[69,5450,5451],{"class":71,"line":755},[69,5452,758],{},[55,5454],{":config":57,"code":761},[47,5456,765],{"id":764},[16,5458,768],{},[60,5460,5461],{"className":62,"code":771,"language":64,"meta":65,"style":65},[23,5462,5463,5467,5471,5475,5479,5483,5487,5491,5495,5499,5503,5507,5511,5515,5519,5523,5527,5531,5535,5539,5543,5547,5551,5555,5559,5563,5567,5571,5575,5579,5583,5587,5591,5595,5599,5603,5607,5611,5615,5619],{"__ignoreMap":65},[69,5464,5465],{"class":71,"line":72},[69,5466,778],{},[69,5468,5469],{"class":71,"line":78},[69,5470,783],{},[69,5472,5473],{"class":71,"line":84},[69,5474,788],{},[69,5476,5477],{"class":71,"line":90},[69,5478,793],{},[69,5480,5481],{"class":71,"line":96},[69,5482,798],{},[69,5484,5485],{"class":71,"line":102},[69,5486,803],{},[69,5488,5489],{"class":71,"line":108},[69,5490,808],{},[69,5492,5493],{"class":71,"line":114},[69,5494,813],{},[69,5496,5497],{"class":71,"line":120},[69,5498,818],{},[69,5500,5501],{"class":71,"line":126},[69,5502,823],{},[69,5504,5505],{"class":71,"line":133},[69,5506,828],{},[69,5508,5509],{"class":71,"line":139},[69,5510,833],{},[69,5512,5513],{"class":71,"line":144},[69,5514,838],{},[69,5516,5517],{"class":71,"line":150},[69,5518,843],{},[69,5520,5521],{"class":71,"line":156},[69,5522,833],{},[69,5524,5525],{"class":71,"line":162},[69,5526,852],{},[69,5528,5529],{"class":71,"line":168},[69,5530,857],{},[69,5532,5533],{"class":71,"line":174},[69,5534,862],{},[69,5536,5537],{"class":71,"line":180},[69,5538,833],{},[69,5540,5541],{"class":71,"line":186},[69,5542,871],{},[69,5544,5545],{"class":71,"line":191},[69,5546,876],{},[69,5548,5549],{"class":71,"line":197},[69,5550,881],{},[69,5552,5553],{"class":71,"line":203},[69,5554,886],{},[69,5556,5557],{"class":71,"line":209},[69,5558,891],{},[69,5560,5561],{"class":71,"line":214},[69,5562,896],{},[69,5564,5565],{"class":71,"line":220},[69,5566,901],{},[69,5568,5569],{"class":71,"line":226},[69,5570,906],{},[69,5572,5573],{"class":71,"line":232},[69,5574,911],{},[69,5576,5577],{"class":71,"line":662},[69,5578,916],{},[69,5580,5581],{"class":71,"line":668},[69,5582,921],{},[69,5584,5585],{"class":71,"line":674},[69,5586,926],{},[69,5588,5589],{"class":71,"line":679},[69,5590,931],{},[69,5592,5593],{"class":71,"line":684},[69,5594,936],{},[69,5596,5597],{"class":71,"line":690},[69,5598,941],{},[69,5600,5601],{"class":71,"line":696},[69,5602,130],{"emptyLinePlaceholder":129},[69,5604,5605],{"class":71,"line":702},[69,5606,950],{},[69,5608,5609],{"class":71,"line":708},[69,5610,955],{},[69,5612,5613],{"class":71,"line":713},[69,5614,130],{"emptyLinePlaceholder":129},[69,5616,5617],{"class":71,"line":719},[69,5618,964],{},[69,5620,5621],{"class":71,"line":725},[69,5622,969],{},[16,5624,972],{},[47,5626,976],{"id":975},[16,5628,5629,981,5631,984,5633,988,5635,992,5637,26,5639,999,5641,1003],{},[23,5630,36],{},[23,5632,36],{},[23,5634,987],{},[23,5636,991],{},[23,5638,995],{},[23,5640,998],{},[23,5642,1002],{},[16,5644,1006,5645,1009,5647,1012],{},[23,5646,25],{},[23,5648,36],{},[16,5650,5651,1018,5653,1021],{},[298,5652,1017],{},[23,5654,36],{},[39,5656,1025],{"id":1024},[16,5658,1028],{},[55,5660],{":config":57,"code":1031},[16,5662,1034],{},[60,5664,5665],{"className":1037,"code":1038,"language":1039,"meta":65,"style":65},[23,5666,5667,5671,5675,5679,5691,5703,5715,5727,5745,5761,5765,5769,5773,5777,5789,5801,5813,5831,5849,5861,5889,5901,5919,5935,5939,5943,5947,5991,6019,6047,6075,6103,6107,6111,6123,6135,6147,6159,6177,6213,6217,6221,6225,6229],{"__ignoreMap":65},[69,5668,5669],{"class":71,"line":72},[69,5670,1047],{"class":1046},[69,5672,5673],{"class":71,"line":78},[69,5674,1053],{"class":1052},[69,5676,5677],{"class":71,"line":84},[69,5678,1059],{"class":1058},[69,5680,5681,5683,5685,5687,5689],{"class":71,"line":90},[69,5682,1064],{"class":1058},[69,5684,1068],{"class":1067},[69,5686,1071],{"class":1058},[69,5688,1074],{"class":1058},[69,5690,1077],{"class":1058},[69,5692,5693,5695,5697,5699,5701],{"class":71,"line":96},[69,5694,1082],{"class":1058},[69,5696,1086],{"class":1085},[69,5698,1071],{"class":1058},[69,5700,1074],{"class":1058},[69,5702,1077],{"class":1058},[69,5704,5705,5707,5709,5711,5713],{"class":71,"line":102},[69,5706,1097],{"class":1058},[69,5708,1101],{"class":1100},[69,5710,1071],{"class":1058},[69,5712,1074],{"class":1058},[69,5714,1077],{"class":1058},[69,5716,5717,5719,5721,5723,5725],{"class":71,"line":108},[69,5718,1112],{"class":1058},[69,5720,1116],{"class":1115},[69,5722,1071],{"class":1058},[69,5724,1074],{"class":1058},[69,5726,1077],{"class":1058},[69,5728,5729,5731,5733,5735,5737,5739,5741,5743],{"class":71,"line":114},[69,5730,1127],{"class":1058},[69,5732,1131],{"class":1130},[69,5734,1071],{"class":1058},[69,5736,1074],{"class":1058},[69,5738,1138],{"class":1058},[69,5740,1142],{"class":1141},[69,5742,1071],{"class":1058},[69,5744,1147],{"class":1058},[69,5746,5747,5749,5751,5753,5755,5757,5759],{"class":71,"line":120},[69,5748,1127],{"class":1058},[69,5750,1154],{"class":1130},[69,5752,1071],{"class":1058},[69,5754,1074],{"class":1058},[69,5756,1138],{"class":1058},[69,5758,1163],{"class":1141},[69,5760,1166],{"class":1058},[69,5762,5763],{"class":71,"line":126},[69,5764,1171],{"class":1058},[69,5766,5767],{"class":71,"line":133},[69,5768,1176],{"class":1058},[69,5770,5771],{"class":71,"line":139},[69,5772,1181],{"class":1058},[69,5774,5775],{"class":71,"line":144},[69,5776,1186],{"class":1058},[69,5778,5779,5781,5783,5785,5787],{"class":71,"line":150},[69,5780,1064],{"class":1058},[69,5782,1193],{"class":1067},[69,5784,1071],{"class":1058},[69,5786,1074],{"class":1058},[69,5788,1077],{"class":1058},[69,5790,5791,5793,5795,5797,5799],{"class":71,"line":156},[69,5792,1082],{"class":1058},[69,5794,1206],{"class":1085},[69,5796,1071],{"class":1058},[69,5798,1074],{"class":1058},[69,5800,1077],{"class":1058},[69,5802,5803,5805,5807,5809,5811],{"class":71,"line":162},[69,5804,1097],{"class":1058},[69,5806,1219],{"class":1100},[69,5808,1071],{"class":1058},[69,5810,1074],{"class":1058},[69,5812,1077],{"class":1058},[69,5814,5815,5817,5819,5821,5823,5825,5827,5829],{"class":71,"line":168},[69,5816,1112],{"class":1058},[69,5818,1131],{"class":1115},[69,5820,1071],{"class":1058},[69,5822,1074],{"class":1058},[69,5824,1138],{"class":1058},[69,5826,1240],{"class":1141},[69,5828,1071],{"class":1058},[69,5830,1147],{"class":1058},[69,5832,5833,5835,5837,5839,5841,5843,5845,5847],{"class":71,"line":174},[69,5834,1112],{"class":1058},[69,5836,1101],{"class":1115},[69,5838,1071],{"class":1058},[69,5840,1074],{"class":1058},[69,5842,1138],{"class":1058},[69,5844,1116],{"class":1141},[69,5846,1071],{"class":1058},[69,5848,1147],{"class":1058},[69,5850,5851,5853,5855,5857,5859],{"class":71,"line":180},[69,5852,1112],{"class":1058},[69,5854,1269],{"class":1115},[69,5856,1071],{"class":1058},[69,5858,1074],{"class":1058},[69,5860,1077],{"class":1058},[69,5862,5863,5865,5867,5869,5871,5873,5875,5877,5879,5881,5883,5885,5887],{"class":71,"line":186},[69,5864,1127],{"class":1058},[69,5866,1282],{"class":1130},[69,5868,1071],{"class":1058},[69,5870,1074],{"class":1058},[69,5872,1289],{"class":1058},[69,5874,1138],{"class":1058},[69,5876,1131],{"class":1294},[69,5878,1071],{"class":1058},[69,5880,1074],{"class":1058},[69,5882,1138],{"class":1058},[69,5884,1282],{"class":1141},[69,5886,1071],{"class":1058},[69,5888,1307],{"class":1058},[69,5890,5891,5893,5895,5897,5899],{"class":71,"line":191},[69,5892,1127],{"class":1058},[69,5894,1314],{"class":1130},[69,5896,1071],{"class":1058},[69,5898,1074],{"class":1058},[69,5900,1077],{"class":1058},[69,5902,5903,5905,5907,5909,5911,5913,5915,5917],{"class":71,"line":197},[69,5904,1325],{"class":1058},[69,5906,1131],{"class":1294},[69,5908,1071],{"class":1058},[69,5910,1074],{"class":1058},[69,5912,1138],{"class":1058},[69,5914,1240],{"class":1141},[69,5916,1071],{"class":1058},[69,5918,1147],{"class":1058},[69,5920,5921,5923,5925,5927,5929,5931,5933],{"class":71,"line":203},[69,5922,1325],{"class":1058},[69,5924,1101],{"class":1294},[69,5926,1071],{"class":1058},[69,5928,1074],{"class":1058},[69,5930,1138],{"class":1058},[69,5932,1314],{"class":1141},[69,5934,1166],{"class":1058},[69,5936,5937],{"class":71,"line":209},[69,5938,1360],{"class":1058},[69,5940,5941],{"class":71,"line":214},[69,5942,1171],{"class":1058},[69,5944,5945],{"class":71,"line":220},[69,5946,1369],{"class":1058},[69,5948,5949,5951,5953,5955,5957,5959,5961,5963,5965,5967,5969,5971,5973,5975,5977,5979,5981,5983,5985,5987,5989],{"class":71,"line":226},[69,5950,1097],{"class":1058},[69,5952,1376],{"class":1100},[69,5954,1071],{"class":1058},[69,5956,1074],{"class":1058},[69,5958,1383],{"class":1058},[69,5960,1138],{"class":1058},[69,5962,1131],{"class":1115},[69,5964,1071],{"class":1058},[69,5966,1074],{"class":1058},[69,5968,1138],{"class":1058},[69,5970,1240],{"class":1141},[69,5972,1071],{"class":1058},[69,5974,1400],{"class":1058},[69,5976,1138],{"class":1058},[69,5978,1101],{"class":1115},[69,5980,1071],{"class":1058},[69,5982,1074],{"class":1058},[69,5984,1138],{"class":1058},[69,5986,1116],{"class":1141},[69,5988,1071],{"class":1058},[69,5990,1307],{"class":1058},[69,5992,5993,5995,5997,5999,6001,6003,6005,6007,6009,6011,6013,6015,6017],{"class":71,"line":232},[69,5994,1097],{"class":1058},[69,5996,1423],{"class":1100},[69,5998,1071],{"class":1058},[69,6000,1074],{"class":1058},[69,6002,1383],{"class":1058},[69,6004,1138],{"class":1058},[69,6006,1131],{"class":1115},[69,6008,1071],{"class":1058},[69,6010,1074],{"class":1058},[69,6012,1138],{"class":1058},[69,6014,1282],{"class":1141},[69,6016,1071],{"class":1058},[69,6018,1307],{"class":1058},[69,6020,6021,6023,6025,6027,6029,6031,6033,6035,6037,6039,6041,6043,6045],{"class":71,"line":662},[69,6022,1097],{"class":1058},[69,6024,1452],{"class":1100},[69,6026,1071],{"class":1058},[69,6028,1074],{"class":1058},[69,6030,1459],{"class":1058},[69,6032,1138],{"class":1058},[69,6034,1131],{"class":1115},[69,6036,1071],{"class":1058},[69,6038,1074],{"class":1058},[69,6040,1138],{"class":1058},[69,6042,1472],{"class":1141},[69,6044,1071],{"class":1058},[69,6046,1307],{"class":1058},[69,6048,6049,6051,6053,6055,6057,6059,6061,6063,6065,6067,6069,6071,6073],{"class":71,"line":668},[69,6050,1097],{"class":1058},[69,6052,1483],{"class":1100},[69,6054,1071],{"class":1058},[69,6056,1074],{"class":1058},[69,6058,1490],{"class":1058},[69,6060,1138],{"class":1058},[69,6062,1131],{"class":1115},[69,6064,1071],{"class":1058},[69,6066,1074],{"class":1058},[69,6068,1138],{"class":1058},[69,6070,1282],{"class":1141},[69,6072,1071],{"class":1058},[69,6074,1307],{"class":1058},[69,6076,6077,6079,6081,6083,6085,6087,6089,6091,6093,6095,6097,6099,6101],{"class":71,"line":674},[69,6078,1097],{"class":1058},[69,6080,1513],{"class":1100},[69,6082,1071],{"class":1058},[69,6084,1074],{"class":1058},[69,6086,1289],{"class":1058},[69,6088,1138],{"class":1058},[69,6090,1131],{"class":1115},[69,6092,1071],{"class":1058},[69,6094,1074],{"class":1058},[69,6096,1138],{"class":1058},[69,6098,1532],{"class":1141},[69,6100,1071],{"class":1058},[69,6102,1537],{"class":1058},[69,6104,6105],{"class":71,"line":679},[69,6106,1181],{"class":1058},[69,6108,6109],{"class":71,"line":684},[69,6110,1186],{"class":1058},[69,6112,6113,6115,6117,6119,6121],{"class":71,"line":690},[69,6114,1064],{"class":1058},[69,6116,1068],{"class":1067},[69,6118,1071],{"class":1058},[69,6120,1074],{"class":1058},[69,6122,1077],{"class":1058},[69,6124,6125,6127,6129,6131,6133],{"class":71,"line":696},[69,6126,1082],{"class":1058},[69,6128,1086],{"class":1085},[69,6130,1071],{"class":1058},[69,6132,1074],{"class":1058},[69,6134,1077],{"class":1058},[69,6136,6137,6139,6141,6143,6145],{"class":71,"line":702},[69,6138,1097],{"class":1058},[69,6140,1101],{"class":1100},[69,6142,1071],{"class":1058},[69,6144,1074],{"class":1058},[69,6146,1077],{"class":1058},[69,6148,6149,6151,6153,6155,6157],{"class":71,"line":708},[69,6150,1112],{"class":1058},[69,6152,1314],{"class":1115},[69,6154,1071],{"class":1058},[69,6156,1074],{"class":1058},[69,6158,1077],{"class":1058},[69,6160,6161,6163,6165,6167,6169,6171,6173,6175],{"class":71,"line":713},[69,6162,1127],{"class":1058},[69,6164,1600],{"class":1130},[69,6166,1071],{"class":1058},[69,6168,1074],{"class":1058},[69,6170,1138],{"class":1058},[69,6172,1609],{"class":1141},[69,6174,1071],{"class":1058},[69,6176,1147],{"class":1058},[69,6178,6179,6181,6183,6185,6187,6189,6191,6193,6195,6197,6199,6201,6203,6205,6207,6209,6211],{"class":71,"line":719},[69,6180,1127],{"class":1058},[69,6182,1609],{"class":1130},[69,6184,1071],{"class":1058},[69,6186,1074],{"class":1058},[69,6188,1289],{"class":1058},[69,6190,1138],{"class":1058},[69,6192,1630],{"class":1294},[69,6194,1071],{"class":1058},[69,6196,1074],{"class":1058},[69,6198,1637],{"class":1100},[69,6200,1400],{"class":1058},[69,6202,1138],{"class":1058},[69,6204,1644],{"class":1294},[69,6206,1071],{"class":1058},[69,6208,1074],{"class":1058},[69,6210,1637],{"class":1100},[69,6212,1537],{"class":1058},[69,6214,6215],{"class":71,"line":725},[69,6216,1171],{"class":1058},[69,6218,6219],{"class":71,"line":731},[69,6220,1176],{"class":1058},[69,6222,6223],{"class":71,"line":737},[69,6224,1181],{"class":1058},[69,6226,6227],{"class":71,"line":743},[69,6228,1669],{"class":1058},[69,6230,6231],{"class":71,"line":749},[69,6232,1674],{"class":1058},[60,6234,6235],{"className":1037,"code":1677,"language":1039,"meta":65,"style":65},[23,6236,6237,6241,6245,6249,6261,6273,6285,6289,6301,6313,6331,6349,6367,6379,6383,6387,6391,6395,6407,6439,6479,6483,6495,6527,6531,6535,6539,6551,6563,6575,6593,6605,6621,6649,6665,6669,6673,6677,6689,6729,6733,6737,6749,6761,6785,6809,6813,6817,6829,6841,6859,6887,6891,6895],{"__ignoreMap":65},[69,6238,6239],{"class":71,"line":72},[69,6240,1684],{"class":1046},[69,6242,6243],{"class":71,"line":78},[69,6244,1689],{"class":1052},[69,6246,6247],{"class":71,"line":84},[69,6248,1059],{"class":1058},[69,6250,6251,6253,6255,6257,6259],{"class":71,"line":90},[69,6252,1064],{"class":1058},[69,6254,1700],{"class":1067},[69,6256,1071],{"class":1058},[69,6258,1074],{"class":1058},[69,6260,1077],{"class":1058},[69,6262,6263,6265,6267,6269,6271],{"class":71,"line":96},[69,6264,1082],{"class":1058},[69,6266,1713],{"class":1085},[69,6268,1071],{"class":1058},[69,6270,1074],{"class":1058},[69,6272,1077],{"class":1058},[69,6274,6275,6277,6279,6281,6283],{"class":71,"line":102},[69,6276,1097],{"class":1058},[69,6278,1726],{"class":1100},[69,6280,1071],{"class":1058},[69,6282,1074],{"class":1058},[69,6284,1733],{"class":1058},[69,6286,6287],{"class":71,"line":108},[69,6288,1738],{"class":1058},[69,6290,6291,6293,6295,6297,6299],{"class":71,"line":114},[69,6292,1127],{"class":1058},[69,6294,1745],{"class":1115},[69,6296,1071],{"class":1058},[69,6298,1074],{"class":1058},[69,6300,1077],{"class":1058},[69,6302,6303,6305,6307,6309,6311],{"class":71,"line":120},[69,6304,1325],{"class":1058},[69,6306,1219],{"class":1130},[69,6308,1071],{"class":1058},[69,6310,1074],{"class":1058},[69,6312,1077],{"class":1058},[69,6314,6315,6317,6319,6321,6323,6325,6327,6329],{"class":71,"line":126},[69,6316,1768],{"class":1058},[69,6318,1700],{"class":1294},[69,6320,1071],{"class":1058},[69,6322,1074],{"class":1058},[69,6324,1138],{"class":1058},[69,6326,1779],{"class":1141},[69,6328,1071],{"class":1058},[69,6330,1147],{"class":1058},[69,6332,6333,6335,6337,6339,6341,6343,6345,6347],{"class":71,"line":133},[69,6334,1768],{"class":1058},[69,6336,1790],{"class":1294},[69,6338,1071],{"class":1058},[69,6340,1074],{"class":1058},[69,6342,1138],{"class":1058},[69,6344,1799],{"class":1141},[69,6346,1071],{"class":1058},[69,6348,1147],{"class":1058},[69,6350,6351,6353,6355,6357,6359,6361,6363,6365],{"class":71,"line":139},[69,6352,1768],{"class":1058},[69,6354,1810],{"class":1294},[69,6356,1071],{"class":1058},[69,6358,1074],{"class":1058},[69,6360,1138],{"class":1058},[69,6362,1819],{"class":1141},[69,6364,1071],{"class":1058},[69,6366,1147],{"class":1058},[69,6368,6369,6371,6373,6375,6377],{"class":71,"line":144},[69,6370,1768],{"class":1058},[69,6372,1830],{"class":1294},[69,6374,1071],{"class":1058},[69,6376,1074],{"class":1058},[69,6378,1837],{"class":1100},[69,6380,6381],{"class":71,"line":150},[69,6382,1842],{"class":1058},[69,6384,6385],{"class":71,"line":156},[69,6386,1360],{"class":1058},[69,6388,6389],{"class":71,"line":162},[69,6390,1171],{"class":1058},[69,6392,6393],{"class":71,"line":168},[69,6394,1855],{"class":1058},[69,6396,6397,6399,6401,6403,6405],{"class":71,"line":174},[69,6398,1097],{"class":1058},[69,6400,1862],{"class":1100},[69,6402,1071],{"class":1058},[69,6404,1074],{"class":1058},[69,6406,1733],{"class":1058},[69,6408,6409,6411,6413,6415,6417,6419,6421,6423,6425,6427,6429,6431,6433,6435,6437],{"class":71,"line":180},[69,6410,1873],{"class":1058},[69,6412,1138],{"class":1058},[69,6414,1878],{"class":1115},[69,6416,1071],{"class":1058},[69,6418,1074],{"class":1058},[69,6420,1289],{"class":1058},[69,6422,1138],{"class":1058},[69,6424,1423],{"class":1130},[69,6426,1071],{"class":1058},[69,6428,1074],{"class":1058},[69,6430,1138],{"class":1058},[69,6432,1897],{"class":1141},[69,6434,1071],{"class":1058},[69,6436,1902],{"class":1058},[69,6438,1307],{"class":1058},[69,6440,6441,6443,6445,6447,6449,6451,6453,6455,6457,6459,6461,6463,6465,6467,6469,6471,6473,6475,6477],{"class":71,"line":186},[69,6442,1873],{"class":1058},[69,6444,1138],{"class":1058},[69,6446,1913],{"class":1115},[69,6448,1071],{"class":1058},[69,6450,1074],{"class":1058},[69,6452,1289],{"class":1058},[69,6454,1138],{"class":1058},[69,6456,1452],{"class":1130},[69,6458,1071],{"class":1058},[69,6460,1074],{"class":1058},[69,6462,1289],{"class":1058},[69,6464,1138],{"class":1058},[69,6466,1934],{"class":1294},[69,6468,1071],{"class":1058},[69,6470,1074],{"class":1058},[69,6472,1941],{"class":1100},[69,6474,1902],{"class":1058},[69,6476,1902],{"class":1058},[69,6478,1537],{"class":1058},[69,6480,6481],{"class":71,"line":191},[69,6482,1855],{"class":1058},[69,6484,6485,6487,6489,6491,6493],{"class":71,"line":197},[69,6486,1097],{"class":1058},[69,6488,1958],{"class":1100},[69,6490,1071],{"class":1058},[69,6492,1074],{"class":1058},[69,6494,1733],{"class":1058},[69,6496,6497,6499,6501,6503,6505,6507,6509,6511,6513,6515,6517,6519,6521,6523,6525],{"class":71,"line":203},[69,6498,1873],{"class":1058},[69,6500,1138],{"class":1058},[69,6502,1745],{"class":1115},[69,6504,1071],{"class":1058},[69,6506,1074],{"class":1058},[69,6508,1289],{"class":1058},[69,6510,1138],{"class":1058},[69,6512,1483],{"class":1130},[69,6514,1071],{"class":1058},[69,6516,1074],{"class":1058},[69,6518,1138],{"class":1058},[69,6520,1991],{"class":1141},[69,6522,1071],{"class":1058},[69,6524,1902],{"class":1058},[69,6526,1537],{"class":1058},[69,6528,6529],{"class":71,"line":209},[69,6530,2002],{"class":1058},[69,6532,6533],{"class":71,"line":214},[69,6534,1181],{"class":1058},[69,6536,6537],{"class":71,"line":220},[69,6538,1186],{"class":1058},[69,6540,6541,6543,6545,6547,6549],{"class":71,"line":226},[69,6542,1064],{"class":1058},[69,6544,2017],{"class":1067},[69,6546,1071],{"class":1058},[69,6548,1074],{"class":1058},[69,6550,1077],{"class":1058},[69,6552,6553,6555,6557,6559,6561],{"class":71,"line":232},[69,6554,1082],{"class":1058},[69,6556,2030],{"class":1085},[69,6558,1071],{"class":1058},[69,6560,1074],{"class":1058},[69,6562,1077],{"class":1058},[69,6564,6565,6567,6569,6571,6573],{"class":71,"line":662},[69,6566,1097],{"class":1058},[69,6568,1913],{"class":1100},[69,6570,1071],{"class":1058},[69,6572,1074],{"class":1058},[69,6574,1077],{"class":1058},[69,6576,6577,6579,6581,6583,6585,6587,6589,6591],{"class":71,"line":668},[69,6578,1112],{"class":1058},[69,6580,2055],{"class":1115},[69,6582,1071],{"class":1058},[69,6584,1074],{"class":1058},[69,6586,1138],{"class":1058},[69,6588,1452],{"class":1141},[69,6590,1071],{"class":1058},[69,6592,1147],{"class":1058},[69,6594,6595,6597,6599,6601,6603],{"class":71,"line":674},[69,6596,1112],{"class":1058},[69,6598,2074],{"class":1115},[69,6600,1071],{"class":1058},[69,6602,1074],{"class":1058},[69,6604,1733],{"class":1058},[69,6606,6607,6609,6611,6613,6615,6617,6619],{"class":71,"line":679},[69,6608,2085],{"class":1058},[69,6610,1138],{"class":1058},[69,6612,2090],{"class":1130},[69,6614,1071],{"class":1058},[69,6616,1074],{"class":1058},[69,6618,2097],{"class":1100},[69,6620,1307],{"class":1058},[69,6622,6623,6625,6627,6629,6631,6633,6635,6637,6639,6641,6643,6645,6647],{"class":71,"line":684},[69,6624,2085],{"class":1058},[69,6626,1138],{"class":1058},[69,6628,2108],{"class":1130},[69,6630,1071],{"class":1058},[69,6632,1074],{"class":1058},[69,6634,2097],{"class":1100},[69,6636,1400],{"class":1058},[69,6638,1138],{"class":1058},[69,6640,2090],{"class":1130},[69,6642,1071],{"class":1058},[69,6644,1074],{"class":1058},[69,6646,2127],{"class":1100},[69,6648,1307],{"class":1058},[69,6650,6651,6653,6655,6657,6659,6661,6663],{"class":71,"line":690},[69,6652,2085],{"class":1058},[69,6654,1138],{"class":1058},[69,6656,2108],{"class":1130},[69,6658,1071],{"class":1058},[69,6660,1074],{"class":1058},[69,6662,2127],{"class":1100},[69,6664,1537],{"class":1058},[69,6666,6667],{"class":71,"line":696},[69,6668,2150],{"class":1058},[69,6670,6671],{"class":71,"line":702},[69,6672,1176],{"class":1058},[69,6674,6675],{"class":71,"line":708},[69,6676,2159],{"class":1058},[69,6678,6679,6681,6683,6685,6687],{"class":71,"line":713},[69,6680,1082],{"class":1058},[69,6682,1483],{"class":1085},[69,6684,1071],{"class":1058},[69,6686,1074],{"class":1058},[69,6688,1077],{"class":1058},[69,6690,6691,6693,6695,6697,6699,6701,6703,6705,6707,6709,6711,6713,6715,6717,6719,6721,6723,6725,6727],{"class":71,"line":719},[69,6692,1097],{"class":1058},[69,6694,2178],{"class":1100},[69,6696,1071],{"class":1058},[69,6698,1074],{"class":1058},[69,6700,1289],{"class":1058},[69,6702,1138],{"class":1058},[69,6704,2055],{"class":1115},[69,6706,1071],{"class":1058},[69,6708,1074],{"class":1058},[69,6710,1138],{"class":1058},[69,6712,1483],{"class":1141},[69,6714,1071],{"class":1058},[69,6716,1400],{"class":1058},[69,6718,1138],{"class":1058},[69,6720,2205],{"class":1115},[69,6722,1071],{"class":1058},[69,6724,1074],{"class":1058},[69,6726,2212],{"class":1100},[69,6728,1537],{"class":1058},[69,6730,6731],{"class":71,"line":725},[69,6732,1181],{"class":1058},[69,6734,6735],{"class":71,"line":731},[69,6736,1186],{"class":1058},[69,6738,6739,6741,6743,6745,6747],{"class":71,"line":737},[69,6740,1064],{"class":1058},[69,6742,2229],{"class":1067},[69,6744,1071],{"class":1058},[69,6746,1074],{"class":1058},[69,6748,1077],{"class":1058},[69,6750,6751,6753,6755,6757,6759],{"class":71,"line":743},[69,6752,1082],{"class":1058},[69,6754,1269],{"class":1085},[69,6756,1071],{"class":1058},[69,6758,1074],{"class":1058},[69,6760,1077],{"class":1058},[69,6762,6763,6765,6767,6769,6771,6773,6775,6777,6779,6781,6783],{"class":71,"line":749},[69,6764,1097],{"class":1058},[69,6766,1219],{"class":1100},[69,6768,1071],{"class":1058},[69,6770,1074],{"class":1058},[69,6772,1289],{"class":1058},[69,6774,1138],{"class":1058},[69,6776,2264],{"class":1115},[69,6778,1071],{"class":1058},[69,6780,1074],{"class":1058},[69,6782,2271],{"class":1100},[69,6784,1307],{"class":1058},[69,6786,6787,6789,6791,6793,6795,6797,6799,6801,6803,6805,6807],{"class":71,"line":755},[69,6788,1097],{"class":1058},[69,6790,1376],{"class":1100},[69,6792,1071],{"class":1058},[69,6794,1074],{"class":1058},[69,6796,1289],{"class":1058},[69,6798,1138],{"class":1058},[69,6800,2290],{"class":1115},[69,6802,1071],{"class":1058},[69,6804,1074],{"class":1058},[69,6806,2297],{"class":1100},[69,6808,1537],{"class":1058},[69,6810,6811],{"class":71,"line":2302},[69,6812,1181],{"class":1058},[69,6814,6815],{"class":71,"line":2307},[69,6816,1186],{"class":1058},[69,6818,6819,6821,6823,6825,6827],{"class":71,"line":2312},[69,6820,1064],{"class":1058},[69,6822,2317],{"class":1067},[69,6824,1071],{"class":1058},[69,6826,1074],{"class":1058},[69,6828,1077],{"class":1058},[69,6830,6831,6833,6835,6837,6839],{"class":71,"line":2326},[69,6832,1082],{"class":1058},[69,6834,2331],{"class":1085},[69,6836,1071],{"class":1058},[69,6838,1074],{"class":1058},[69,6840,1077],{"class":1058},[69,6842,6843,6845,6847,6849,6851,6853,6855,6857],{"class":71,"line":2340},[69,6844,1097],{"class":1058},[69,6846,1240],{"class":1100},[69,6848,1071],{"class":1058},[69,6850,1074],{"class":1058},[69,6852,1138],{"class":1058},[69,6854,2353],{"class":1141},[69,6856,1071],{"class":1058},[69,6858,1147],{"class":1058},[69,6860,6861,6863,6865,6867,6869,6871,6873,6875,6877,6879,6881,6883,6885],{"class":71,"line":2360},[69,6862,1097],{"class":1058},[69,6864,1878],{"class":1100},[69,6866,1071],{"class":1058},[69,6868,1074],{"class":1058},[69,6870,1289],{"class":1058},[69,6872,1138],{"class":1058},[69,6874,2055],{"class":1115},[69,6876,1071],{"class":1058},[69,6878,1074],{"class":1058},[69,6880,1138],{"class":1058},[69,6882,1219],{"class":1141},[69,6884,1071],{"class":1058},[69,6886,1537],{"class":1058},[69,6888,6889],{"class":71,"line":2389},[69,6890,1181],{"class":1058},[69,6892,6893],{"class":71,"line":2394},[69,6894,1669],{"class":1058},[69,6896,6897],{"class":71,"line":2399},[69,6898,1674],{"class":1058},[60,6900,6901],{"className":1037,"code":2404,"language":1039,"meta":65,"style":65},[23,6902,6903,6907,6911,6923,6937,6949,6953,6967,6995,7007,7027,7031,7035,7039,7043,7055,7067,7079,7111,7143,7175,7179,7183,7187,7199,7211,7243,7247,7251],{"__ignoreMap":65},[69,6904,6905],{"class":71,"line":72},[69,6906,2411],{"class":1046},[69,6908,6909],{"class":71,"line":78},[69,6910,1059],{"class":1058},[69,6912,6913,6915,6917,6919,6921],{"class":71,"line":84},[69,6914,1064],{"class":1058},[69,6916,2422],{"class":1067},[69,6918,1071],{"class":1058},[69,6920,1074],{"class":1058},[69,6922,1077],{"class":1058},[69,6924,6925,6927,6929,6931,6933,6935],{"class":71,"line":90},[69,6926,1082],{"class":1058},[69,6928,2435],{"class":1085},[69,6930,1071],{"class":1058},[69,6932,1074],{"class":1058},[69,6934,2442],{"class":1100},[69,6936,1147],{"class":1058},[69,6938,6939,6941,6943,6945,6947],{"class":71,"line":96},[69,6940,1082],{"class":1058},[69,6942,2422],{"class":1085},[69,6944,1071],{"class":1058},[69,6946,1074],{"class":1058},[69,6948,1733],{"class":1058},[69,6950,6951],{"class":71,"line":102},[69,6952,2461],{"class":1058},[69,6954,6955,6957,6959,6961,6963,6965],{"class":71,"line":108},[69,6956,1112],{"class":1058},[69,6958,2468],{"class":1100},[69,6960,1071],{"class":1058},[69,6962,1074],{"class":1058},[69,6964,2475],{"class":1100},[69,6966,1147],{"class":1058},[69,6968,6969,6971,6973,6975,6977,6979,6981,6983,6985,6987,6989,6991,6993],{"class":71,"line":114},[69,6970,1112],{"class":1058},[69,6972,2484],{"class":1100},[69,6974,1071],{"class":1058},[69,6976,1074],{"class":1058},[69,6978,1289],{"class":1058},[69,6980,1138],{"class":1058},[69,6982,1219],{"class":1115},[69,6984,1071],{"class":1058},[69,6986,1074],{"class":1058},[69,6988,1138],{"class":1058},[69,6990,2503],{"class":1141},[69,6992,1071],{"class":1058},[69,6994,1307],{"class":1058},[69,6996,6997,6999,7001,7003,7005],{"class":71,"line":120},[69,6998,1112],{"class":1058},[69,7000,2229],{"class":1100},[69,7002,1071],{"class":1058},[69,7004,1074],{"class":1058},[69,7006,1077],{"class":1058},[69,7008,7009,7011,7013,7015,7017,7019,7021,7023,7025],{"class":71,"line":126},[69,7010,1127],{"class":1058},[69,7012,1219],{"class":1115},[69,7014,1071],{"class":1058},[69,7016,1074],{"class":1058},[69,7018,2532],{"class":1058},[69,7020,1071],{"class":1058},[69,7022,2537],{"class":1141},[69,7024,1071],{"class":1058},[69,7026,2542],{"class":1058},[69,7028,7029],{"class":71,"line":133},[69,7030,1171],{"class":1058},[69,7032,7033],{"class":71,"line":139},[69,7034,1176],{"class":1058},[69,7036,7037],{"class":71,"line":144},[69,7038,2555],{"class":1058},[69,7040,7041],{"class":71,"line":150},[69,7042,1186],{"class":1058},[69,7044,7045,7047,7049,7051,7053],{"class":71,"line":156},[69,7046,1064],{"class":1058},[69,7048,2017],{"class":1067},[69,7050,1071],{"class":1058},[69,7052,1074],{"class":1058},[69,7054,1077],{"class":1058},[69,7056,7057,7059,7061,7063,7065],{"class":71,"line":162},[69,7058,1082],{"class":1058},[69,7060,2030],{"class":1085},[69,7062,1071],{"class":1058},[69,7064,1074],{"class":1058},[69,7066,1077],{"class":1058},[69,7068,7069,7071,7073,7075,7077],{"class":71,"line":168},[69,7070,1097],{"class":1058},[69,7072,2590],{"class":1100},[69,7074,1071],{"class":1058},[69,7076,1074],{"class":1058},[69,7078,1733],{"class":1058},[69,7080,7081,7083,7085,7087,7089,7091,7093,7095,7097,7099,7101,7103,7105,7107,7109],{"class":71,"line":174},[69,7082,1873],{"class":1058},[69,7084,1138],{"class":1058},[69,7086,2605],{"class":1115},[69,7088,1071],{"class":1058},[69,7090,1074],{"class":1058},[69,7092,1138],{"class":1058},[69,7094,2614],{"class":1141},[69,7096,1071],{"class":1058},[69,7098,1400],{"class":1058},[69,7100,2621],{"class":1058},[69,7102,2624],{"class":1115},[69,7104,1071],{"class":1058},[69,7106,1074],{"class":1058},[69,7108,2631],{"class":1100},[69,7110,1307],{"class":1058},[69,7112,7113,7115,7117,7119,7121,7123,7125,7127,7129,7131,7133,7135,7137,7139,7141],{"class":71,"line":180},[69,7114,1873],{"class":1058},[69,7116,1138],{"class":1058},[69,7118,2605],{"class":1115},[69,7120,1071],{"class":1058},[69,7122,1074],{"class":1058},[69,7124,1138],{"class":1058},[69,7126,2650],{"class":1141},[69,7128,1071],{"class":1058},[69,7130,1400],{"class":1058},[69,7132,1071],{"class":1058},[69,7134,2624],{"class":1115},[69,7136,1071],{"class":1058},[69,7138,1074],{"class":1058},[69,7140,2665],{"class":1100},[69,7142,1307],{"class":1058},[69,7144,7145,7147,7149,7151,7153,7155,7157,7159,7161,7163,7165,7167,7169,7171,7173],{"class":71,"line":186},[69,7146,1873],{"class":1058},[69,7148,1138],{"class":1058},[69,7150,2605],{"class":1115},[69,7152,1071],{"class":1058},[69,7154,1074],{"class":1058},[69,7156,1138],{"class":1058},[69,7158,2684],{"class":1141},[69,7160,1071],{"class":1058},[69,7162,1400],{"class":1058},[69,7164,2621],{"class":1058},[69,7166,2624],{"class":1115},[69,7168,1071],{"class":1058},[69,7170,1074],{"class":1058},[69,7172,2699],{"class":1100},[69,7174,1537],{"class":1058},[69,7176,7177],{"class":71,"line":191},[69,7178,2002],{"class":1058},[69,7180,7181],{"class":71,"line":197},[69,7182,1181],{"class":1058},[69,7184,7185],{"class":71,"line":203},[69,7186,1186],{"class":1058},[69,7188,7189,7191,7193,7195,7197],{"class":71,"line":209},[69,7190,1064],{"class":1058},[69,7192,2317],{"class":1067},[69,7194,1071],{"class":1058},[69,7196,1074],{"class":1058},[69,7198,1077],{"class":1058},[69,7200,7201,7203,7205,7207,7209],{"class":71,"line":214},[69,7202,1082],{"class":1058},[69,7204,2331],{"class":1085},[69,7206,1071],{"class":1058},[69,7208,1074],{"class":1058},[69,7210,1733],{"class":1058},[69,7212,7213,7215,7217,7219,7221,7223,7225,7227,7229,7231,7233,7235,7237,7239,7241],{"class":71,"line":220},[69,7214,2742],{"class":1058},[69,7216,1138],{"class":1058},[69,7218,1240],{"class":1100},[69,7220,1071],{"class":1058},[69,7222,1074],{"class":1058},[69,7224,1138],{"class":1058},[69,7226,1779],{"class":1141},[69,7228,1071],{"class":1058},[69,7230,1400],{"class":1058},[69,7232,1138],{"class":1058},[69,7234,2763],{"class":1100},[69,7236,1071],{"class":1058},[69,7238,1074],{"class":1058},[69,7240,2770],{"class":1100},[69,7242,1537],{"class":1058},[69,7244,7245],{"class":71,"line":226},[69,7246,2555],{"class":1058},[69,7248,7249],{"class":71,"line":232},[69,7250,1669],{"class":1058},[69,7252,7253],{"class":71,"line":662},[69,7254,1674],{"class":1058},[16,7256,2787],{},[55,7258],{":config":57,"code":2790},[39,7260,2794],{"id":2793},[55,7262],{":config":57,"code":2797},[2799,7264,7265,7275],{},[2802,7266,7267],{},[2805,7268,7269,7271,7273],{},[2808,7270,2810],{},[2808,7272,2813],{},[2808,7274,1025],{},[2817,7276,7277,7287,7297,7307,7317,7327,7337,7347,7357,7367,7377,7387],{},[2805,7278,7279,7283,7285],{},[2822,7280,7281],{},[298,7282,2826],{},[2822,7284,2829],{},[2822,7286,2832],{},[2805,7288,7289,7293,7295],{},[2822,7290,7291],{},[298,7292,2839],{},[2822,7294,2842],{},[2822,7296,2845],{},[2805,7298,7299,7303,7305],{},[2822,7300,7301],{},[298,7302,2852],{},[2822,7304,2855],{},[2822,7306,2858],{},[2805,7308,7309,7313,7315],{},[2822,7310,7311],{},[298,7312,2865],{},[2822,7314,2868],{},[2822,7316,2871],{},[2805,7318,7319,7323,7325],{},[2822,7320,7321],{},[298,7322,2878],{},[2822,7324,2881],{},[2822,7326,2884],{},[2805,7328,7329,7333,7335],{},[2822,7330,7331],{},[298,7332,2891],{},[2822,7334,2894],{},[2822,7336,2897],{},[2805,7338,7339,7343,7345],{},[2822,7340,7341],{},[298,7342,2904],{},[2822,7344,2907],{},[2822,7346,2910],{},[2805,7348,7349,7353,7355],{},[2822,7350,7351],{},[298,7352,2917],{},[2822,7354,2920],{},[2822,7356,2923],{},[2805,7358,7359,7363,7365],{},[2822,7360,7361],{},[298,7362,2930],{},[2822,7364,2920],{},[2822,7366,2935],{},[2805,7368,7369,7373,7375],{},[2822,7370,7371],{},[298,7372,2942],{},[2822,7374,2945],{},[2822,7376,2948],{},[2805,7378,7379,7383,7385],{},[2822,7380,7381],{},[298,7382,2955],{},[2822,7384,2958],{},[2822,7386,2961],{},[2805,7388,7389,7393,7395],{},[2822,7390,7391],{},[298,7392,2968],{},[2822,7394,2971],{},[2822,7396,2974],{},[39,7398,2978],{"id":2977},[16,7400,2981,7401,26,7403,26,7405,2988,7407,2991],{},[23,7402,25],{},[23,7404,29],{},[23,7406,32],{},[23,7408,36],{},[2993,7410,7411,7413,7415,7417,7419],{},[2996,7412,2998],{},[2996,7414,3001],{},[2996,7416,3004],{},[2996,7418,3007],{},[2996,7420,3010],{},[16,7422,7423,3016],{},[298,7424,3015],{},[39,7426,3020],{"id":3019},[16,7428,3023],{},[2993,7430,7431,7433,7435,7437,7439],{},[2996,7432,3028],{},[2996,7434,3031],{},[2996,7436,3034],{},[2996,7438,3037],{},[2996,7440,3040],{},[16,7442,7443,3045],{},[298,7444,3015],{},[39,7446,3049],{"id":3048},[16,7448,3052,7449,3055,7451,3058,7453,3061,7455,3064],{},[23,7450,25],{},[23,7452,29],{},[23,7454,32],{},[23,7456,36],{},[16,7458,3067,7459,3070],{},[23,7460,36],{},[16,7462,3073],{},[3075,7464],{},[16,7466,7467],{},[3080,7468,3082,7469,33,7471,3087,7473,3091,7475,3095,7477,3098,7479,3101],{},[23,7470,29],{},[23,7472,32],{},[23,7474,3090],{},[23,7476,3094],{},[23,7478,36],{},[23,7480,3090],{},[3103,7482,3105],{},{"title":65,"searchDepth":78,"depth":78,"links":7484},[7485,7492,7493,7494,7495,7496],{"id":41,"depth":78,"text":42,"children":7486},[7487,7488,7489,7490,7491],{"id":49,"depth":84,"text":50},{"id":304,"depth":84,"text":305},{"id":514,"depth":84,"text":515},{"id":764,"depth":84,"text":765},{"id":975,"depth":84,"text":976},{"id":1024,"depth":78,"text":1025},{"id":2793,"depth":78,"text":2794},{"id":2977,"depth":78,"text":2978},{"id":3019,"depth":78,"text":3020},{"id":3048,"depth":78,"text":3049},{},{"title":6,"description":3120},{"loc":3124},1785309668679]