{"id":6538,"date":"2024-08-14T11:08:50","date_gmt":"2024-08-14T11:08:50","guid":{"rendered":"https:\/\/ultratendencyaca-urouz8wsum.live-website.com\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/"},"modified":"2024-08-14T11:18:20","modified_gmt":"2024-08-14T11:18:20","slug":"vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich","status":"publish","type":"post","link":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/","title":{"rendered":"Vektor-\u00c4hnlichkeitssuche vs. traditionelle Volltextsuche: Ein Vergleich"},"content":{"rendered":"<p><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1216.8px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-1\"><p>Die Suche ist eine wichtige F\u00e4higkeit in der Computerwissenschaft mit zahlreichen praktischen Anwendungen. Menschen nutzen Suchtechnologien jeden Tag, wenn sie beliebte Websites und Suchmaschinen verwenden. Die Volltextsuche gibt es schon seit langem, und mit der zunehmenden Bedeutung der KI-Vektorsuche gewinnt die Volltextsuche nun an Bedeutung. In diesem Artikel vergleichen wir eine traditionelle Volltextsuche mit einer Vektorsuche unter Verwendung einer PostgreSQL-Instanz in einer Cloud-Umgebung.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-2 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1216.8px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-2\"><h1>Einf\u00fchrung<\/h1>\n<p> Die Vektorsuche ist eine Methode zur Suche und Einstufung von Ergebnissen, die auf der Umwandlung einer Suchanfrage in eine Vektordarstellung und dem Vergleich mit Vektordarstellungen von gesuchten Dokumenten basiert. Je n\u00e4her der Vektor eines Dokuments am Vektor der Suchanfrage liegt, desto relevanter ist es. Es gibt mehrere Ma\u00dfst\u00e4be f\u00fcr die N\u00e4he, darunter der euklidische Abstand, das innere Produkt oder der Kosinusabstand. Zur Erzeugung von Vektoren (auch Einbettungen genannt) wird ein neuronales Netzwerkmodell verwendet.<\/p>\n<\/div><div class=\"fusion-image-element \" style=\"text-align:center;--awb-margin-bottom:3%;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-1 hover-type-none\" style=\"border:7px solid #ffffff;\"><a href=\"\/wp-content\/uploads\/2024\/08\/vecotr_similartiy1.jpg\" class=\"fusion-lightbox\" data-rel=\"iLightbox[626efd81249ad211e20]\" data-title=\"vecotr_similartiy1\" title=\"vecotr_similartiy1\"><img decoding=\"async\" width=\"950\" height=\"400\" src=\"https:\/\/ultratendency.academy\/wp-content\/uploads\/2024\/08\/vecotr_similartiy1.jpg\" data-orig-src=\"\/wp-content\/uploads\/2024\/08\/vecotr_similartiy1.jpg\" alt class=\"lazyload img-responsive wp-image-6530\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27950%27%20height%3D%27400%27%20viewBox%3D%270%200%20950%20400%27%3E%3Crect%20width%3D%27950%27%20height%3D%27400%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/ultratendency.academy\/wp-content\/uploads\/2024\/08\/vecotr_similartiy1-200x84.jpg 200w, https:\/\/ultratendency.academy\/wp-content\/uploads\/2024\/08\/vecotr_similartiy1-400x168.jpg 400w, https:\/\/ultratendency.academy\/wp-content\/uploads\/2024\/08\/vecotr_similartiy1-600x253.jpg 600w, https:\/\/ultratendency.academy\/wp-content\/uploads\/2024\/08\/vecotr_similartiy1-800x337.jpg 800w, https:\/\/ultratendency.academy\/wp-content\/uploads\/2024\/08\/vecotr_similartiy1.jpg 950w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 1024px) 100vw, (max-width: 640px) 100vw, 950px\" \/><\/a><\/span><\/div><div class=\"fusion-text fusion-text-3\"><p>Vektoren und entsprechende Dokumente werden in einem Vektorspeicher gespeichert. Da die Anzahl der Dokumente in Vektorspeichern sehr gro\u00df sein kann, sollten Sie Indexierungstechniken einsetzen, um die Suche nach relevanten Ergebnissen zu beschleunigen. Um nur einige zu nennen:   <\/p>\n<ul>\n<li>Lokalit\u00e4tsabh\u00e4ngiges Hashing (LSH)<\/li>\n<li>Invertierter Datei-Index (IVF)<\/li>\n<li>Hierarchical Navigable Small World (HNSW)<\/li>\n<li>Produkt-Quantisierung (PQ), Skalar-Quantisierung (SQ)<\/li>\n<li>Zusammengesetzte Methoden, z.B. HNSW_SQ, IVF_PQ<\/li>\n<\/ul>\n<p><em>Pgvector <\/em>ist eine Erweiterung, die Vektorspeicherfunktionen in PostgreSQL bietet. Pgvector verwendet den HNSW (Hierarchical Navigable Small World) Graph f\u00fcr die Indizierung. <a href=\"https:\/\/arxiv.org\/pdf\/1603.09320\">HNSW<\/a> ist ein mehrschichtiger Graph, der wie eine probabilistische Datenstruktur Skip-List funktioniert. Jeder Knoten im Graphen ist ein Vektor, w\u00e4hrend Kanten die nahe beieinander liegenden Knoten miteinander verbinden. Die Suche wird durchgef\u00fchrt, indem von der h\u00f6heren Schicht bis zur Schicht 0 hinabgestiegen wird und in jeder Schicht eine Breadth-First-Suche durchgef\u00fchrt wird, um die am besten \u00fcbereinstimmenden Vektoren zu finden. Bei der Volltextsuche werden Variationen von TF-IDF (Term Frequency-Inverse Document Frequency), Wortst\u00e4mme, Listen von Stoppw\u00f6rtern, Synonymw\u00f6rterb\u00fccher und eventuell weitere regelbasierte Algorithmen verwendet. Zur Verbesserung der Suchleistung wird der invertierte Index verwendet, d.h. eine Zuordnung vom Wort zur Liste der Dokumente, in denen das Wort vorkommt, zusammen mit einigen zus\u00e4tzlichen Informationen. PostgreSQL bietet die Indextypen GIN (Generalized Inverted Index) und GiST (Generalized Search Tree) sowie verschiedene Operationen f\u00fcr die Volltextsuche. <a href=\"https:\/\/www.postgresql.org\/docs\/current\/textsearch-controls.html#TEXTSEARCH-RANKING\">Eingebaute Ranking-Funktionen<\/a> ber\u00fccksichtigen, wie oft die abgefragten Begriffe im Dokument vorkommen, wie nah die Begriffe im Dokument beieinander liegen und wie wichtig der Teil des Dokuments ist, in dem sie vorkommen.<\/p>\n<\/div><div class=\"fusion-text fusion-text-4\"><h2><span lang=\"EN-US\">Playground Einrichtung<\/span><\/h2>\n<p> In diesem Abschnitt wird kurz eine Einrichtung des PostgreSQL-Playgrounds in der Google Cloud beschrieben, um die Leistung der Indizes zu messen. Der n\u00e4chste Abschnitt liefert die Ergebnisse des Vergleichs. Wir richten die PostgreSQL-Instanz mit Cloud SQL ein. Die PostgreSQL Cloud SQL-Instanz enth\u00e4lt standardm\u00e4\u00dfig die pgvector-Erweiterung. Wir m\u00fcssen sie nur mit einer einfachen SQL-Anweisung aktivieren. F\u00fcr die Erzeugung von Einbettungen sowohl f\u00fcr indizierte Dokumente als auch f\u00fcr Suchanfragen wurde das Modell <em>textembedding-gecko@001<\/em> gem\u00e4\u00df dem <a href=\"https:\/\/github.com\/GoogleCloudPlatform\/vertex-ai-samples\/blob\/main\/notebooks\/official\/vector_search\/sdk_vector_search_create_stack_overflow_embeddings_vertex.ipynb\">Beispiel<\/a> verwendet. Mit diesem Notebook und einer kleinen \u00c4nderung im Schritt &#8222;Speichern der Einbettungen im JSON-Format&#8220;, die den Fragentitel und den Fragenteil in die JSON-Ausgabe einbezieht, k\u00f6nnen wir JSON-Dateien mit der folgenden Struktur erzeugen:       <\/p>\n<hr>\n<p> &#8222;`json [ { { <span style=\"color: #3366ff;\">&#8220;id&#8220;<\/span>: <span style=\"color: #339966;\">1<\/span>, <span style=\"color: #3366ff;\"> &#8222;embedding&#8220;<\/span>: [ <span style=\"color: #339966;\">0.123456789, 0.123456789, &#8230;, 0.123456789]<\/span>, <span style=\"color: #3366ff;\">&#8222;text&#8220;<\/span>: &#8220; <span style=\"color: #993300;\">Frage 1 header\\nFrage 1 Inhalt<\/span>&#8220; }, { <span style=\"color: #3366ff;\">&#8222;id&#8220;<\/span>: 2, <span style=\"color: #3366ff;\"> &#8222;embedding&#8220;<\/span>: [ <span style=\"color: #339966;\">0.234567891, 0.234567891, &#8230;, 0.234567891]<\/span>, <span style=\"color: #3366ff;\">&#8222;text&#8220;<\/span>: &#8220; <span style=\"color: #993300;\">Frage 2 Kopfzeile\\nFrage 2 Inhalt<\/span>&#8220; }, &#8230; ] &#8222;`          <\/p>\n<hr>\n<p> Erstellen Sie eine Cloud SQL-Instanz (ersetzen Sie den Wert von DB_PASS durch ein beliebiges Passwort, wenn Sie es ausf\u00fchren): <\/p>\n<hr>\n<p> &#8222;`shell DB_USER= <span style=\"color: #993300;\">postgres <\/span>DB_PASS=[ <span style=\"color: #993300;\">password<\/span>] MY_PUBLIC_IP= <span style=\"color: #993300;\">$(<\/span>curl ipinfo.io\/ip <span style=\"color: #993300;\">)<\/span> gcloud <span style=\"color: #993300;\">auth login<\/span> gcloud <span style=\"color: #993300;\">sql instances create search-test<\/span>\\   <span style=\"color: #993300;\"> &#8211;authorized-networks=${MY_PUBLIC_IP}<\/span>  \\<br \/>\n<span style=\"color: #993300;\"> &#8211;availability-type=ZONAL<\/span> \\    <span style=\"color: #993300;\"> &#8211;root-password=&#8220;${DB_PASS}&#8220;<\/span>  \\<br \/>\n<span style=\"color: #993300;\"> &#8211;storage-auto-increase<\/span> \\<br \/>\n<span style=\"color: #993300;\"> &#8211;storage-size=10G<\/span> \\ <span style=\"color: #993300;\"> &#8211;region=&#8220;us-central1&#8243;<\/span> \\ <span style=\"color: #993300;\"> &#8211;tier=&#8220;db-custom-2-8192&#8243;<\/span> \\ <span style=\"color: #993300;\">&#8211;database-version=POSTGRES_15 <\/span>&#8222;`      <\/p>\n<hr>\n<p> Beachten Sie, dass die Verbindung zur Instanz nur von der \u00f6ffentlichen IP erlaubt ist, die durch die Variable MY_PUBLIC_IP definiert ist. Nachdem die Instanz verf\u00fcgbar ist, stellen wir mit einem PostgreSQL-Client und der \u00f6ffentlichen IP oder dem Cloud SQL Studio in der Google Cloud-Konsole eine Verbindung zu ihr her. Dort aktivieren wir die Vektorerweiterung und erstellen eine Tabelle und Indizes f\u00fcr den Vektor und f\u00fcr die Volltextsuche: Nachdem die Instanz verf\u00fcgbar ist, verbinden wir uns mit ihr \u00fcber einen PostgreSQL-Client und eine \u00f6ffentliche IP oder Cloud SQL Studio in der Google Cloud-Konsole. Dort aktivieren wir die Vektorerweiterung und erstellen eine Tabelle und Indizes f\u00fcr den Vektor und f\u00fcr die Volltextsuche:    <\/p>\n<hr>\n<p> &#8222;`SQL <span style=\"color: #3366ff;\">CREATE <\/span><span style=\"color: #3366ff;\">IF NOT EXISTS<\/span> vector; <span style=\"color: #3366ff;\">ERZEUGE TABLE<\/span> IF <span style=\"color: #3366ff;\">NOT EXISTS<\/span> question_store ( id <span style=\"color: #3366ff;\"> interger primary key<\/span>, embedding vector( <span style=\"color: #339966;\">768<\/span>), Inhalt <span style=\"color: #3366ff;\">text<\/span> ); <span style=\"color: #3366ff;\">CREATE INDEX<\/span> IF <span style=\"color: #3366ff;\">NOT EXISTS<\/span> hnsw_l2 <span style=\"color: #3366ff;\">ON<\/span> question_store <span style=\"color: #3366ff;\">USING<\/span> HNSW (embedding_vector_l2_ops); <span style=\"color: #3366ff;\">CREATE INDEX<\/span> IF            <span style=\"color: #3366ff;\">NOT EXISTS<\/span> search_idx <span style=\"color: #3366ff;\">ON<\/span> question_store <span style=\"color: #3366ff;\">USING<\/span> GIN (to_tsvector(<span style=\"color: #993300;\">&#8218;english<\/span>&#8218;, content)); &#8222;` <\/p>\n<hr>\n<p> Als n\u00e4chstes laden Sie Daten in PostgreSQL. Installieren Sie gegebenenfalls das Paket <em>psycopg2<\/em> und aktualisieren Sie die Variablen am Anfang des Skripts: Geben Sie die \u00f6ffentliche IP-Adresse der Cloud SQL-Instanz als Wert f\u00fcr die HOST-Variable an (die IP-Adresse finden Sie in den Details der Instanz in der Google Cloud-Konsole), geben Sie das Passwort als Wert f\u00fcr die PASS-Variable an und aktualisieren Sie den Wert f\u00fcr FILE_NAME_PREFIX entsprechend. Um Verbindungsprobleme zu vermeiden, stellen Sie au\u00dferdem sicher, dass Sie das Skript von dem Rechner aus ausf\u00fchren, dessen \u00f6ffentliche IP bei der Erstellung der SQL-Instanz angegeben wurde. Sie k\u00f6nnen in den Einstellungen der Cloud SQL-Instanz in der Google Cloud-Konsole weitere zul\u00e4ssige \u00f6ffentliche IPs hinzuf\u00fcgen:    <\/p>\n<hr>\n<p> &#8222;`python <span style=\"color: #3366ff;\">import<\/span> psycopg2 <span style=\"color: #3366ff;\">import<\/span> json HOST= <span style=\"color: #993300;\">&#8220; 34.67.204.142&#8243;<\/span> DB= <span style=\"color: #993300;\">&#8222;postgres&#8220;<\/span> USER= <span style=\"color: #993300;\">&#8222;postgres&#8220;<\/span> PASS= <span style=\"color: #993300;\">&#8222;&#8220; <\/span>FILE_NAME_PREFIX= <span style=\"color: #993300;\">&#8222;\/tmp\/tmp5o9ucvho\/tmp5o9ucvho_&#8220;<\/span> connection = psycopg2.connect(database=DB, user=USER, password=PASS, host=HOST, port=5432) cursor = connection.cursor() <span style=\"color: #3366ff;\">def<\/span> load_vectors(i: int): result = [] <span style=\"color: #3366ff;\">with<\/span> open(FILE_NAME_PREFIX + str(i) + <span style=\"color: #993300;\">&#8222;.json&#8220;<\/span>, <span style=\"color: #993300;\">&#8222;r&#8220;<\/span>) <span style=\"color: #3366ff;\"> as<\/span> vectors: line = vectors.readline() <span style=\"color: #3366ff;\">while<\/span> len(line)         &gt; 0: result.append(json.loads(line)) line = vectors.readline() <span style=\"color: #3366ff;\">return<\/span> ergebnis <span style=\"color: #3366ff;\">def<\/span> do_upload(i: int): entries = load_vectors(i) print ( <span style=\"color: #993300;\">&#8222;loading &#8222;<\/span> + str(len(entries)) + <span style=\"color: #993300;\">&#8220; entries&#8220;<\/span>) args_str = <span style=\"color: #993300;\">&#8222;&#8220; <\/span> <span style=\"color: #3366ff;\">for<\/span> entry <span style=\"color: #3366ff;\">in<\/span> entries: id = int(entry[ <span style=\"color: #993300;\">&#8222;id&#8220;<\/span>]) content = Eintrag[ <span style=\"color: #993300;\">&#8222;text&#8220;<\/span>] embedding = str(entry[ <span style=\"color: #993300;\">&#8222;embedding&#8220;<\/span>]).replace( <span style=\"color: #993300;\">&#8222;&#8218;&#8220;<\/span>, <span style=\"color: #993300;\">&#8222;&#8220;<\/span>) args_str += cursor.mogrify( <span style=\"color: #993300;\">&#8222;(%s,%s,%s)&#8220;<\/span>, (str(id), einbettung, inhalt)).decode( <span style=\"color: #993300;\">&#8222;utf-8&#8220;<\/span>) args_str += <span style=\"color: #993300;\">&#8222;,&#8220;<\/span> cursor.execute(       <span style=\"color: #993300;\">&#8222;insert into question_store(id, embedding, content) values&#8220;<\/span> + args_str.rstrip( <span style=\"color: #993300;\">&#8218;,&#8216;<\/span>)) connection.commit() print( <span style=\"color: #993300;\">&#8222;done &#8222;<\/span> + str(i)) <span style=\"color: #3366ff;\">for<\/span> i <span style=\"color: #3366ff;\">in<\/span> range<span style=\"color: #339966;\">(0, 10<\/span>): do_upload(i) print(<span style=\"color: #993300;\">&#8222;finished&#8220;<\/span>) connection.close() &#8222;`  <\/p>\n<hr>\n<p> Das Skript wird die Daten in mehreren Batches hochladen. Zu Beginn importiert es die erforderlichen Pakete, definiert Variablen, \u00f6ffnet dann eine Verbindung zu PostgreSQL und startet eine Transaktion. Die Funktion <em>load_vectors()<\/em> liest die zuvor generierten Daten im JSON-Format aus Dateien, deren Speicherort durch die globale Variable FILE_NAME_PREFIX definiert ist, z.B. \/tmp\/tmp5o9ucvho\/tmp5o9ucvho_0.json, \/tmp\/tmp5o9ucvho\/tmp5o9ucvho_1.json, usw. Die Funktion <em>do_upload()<\/em> liest die JSON-Datei und bereitet eine Insert-SQL-Anweisung mit den Einbettungen vor, f\u00fchrt sie aus und \u00fcbertr\u00e4gt die Transaktion. Schlie\u00dflich durchl\u00e4uft das Skript 10 Iterationen (eine Iteration pro Datei), wobei jedes Mal <em>do_upload()<\/em> aufgerufen wird. Um die 5 wichtigsten Stack Overflow-Fragen auszuw\u00e4hlen, die f\u00fcr Ihre Anfrage am relevantesten sind, k\u00f6nnen Sie die SQL-Anweisungen verwenden: &#8222;`SQL <span style=\"color: #3366ff;\">SELECT<\/span> Inhalt, Einbettung       &lt;-&gt; <span style=\"color: #993300;\">&#8218;[1,2,3]&#8216;<\/span> <span style=\"color: #3366ff;\">AS<\/span> disctance <span style=\"color: #3366ff;\">FROM<\/span> question store <span style=\"color: #3366ff;\">WHERE<\/span> embedding   &lt;-&gt; <span style=\"color: #993300;\">&#8218;[1,2,3]&#8216;<\/span> &lt; <span style=\"color: #339966;\"> 1<\/span><span style=\"color: #3366ff;\"> ORDER BY<\/span> Abstand <span style=\"color: #3366ff;\">LIMIT<\/span> <span style=\"color: #339966;\">5<\/span>; <span style=\"color: #3366ff;\">SELECT<\/span> id, Inhalt <span style=\"color: #3366ff;\">FROM<\/span> ( <span style=\"color: #3366ff;\">SELECT<\/span> id, inhalt, ts_rank_cd(to_tsvector(&#8218; <span style=\"color: #993300;\">english<\/span>&#8218;, inhalt), query) <span style=\"color: #3366ff;\">AS<\/span> rang <strong>FROM<\/strong> question_store, to_tsquery(&#8220;) query <span style=\"color: #3366ff;\">WHERE<\/span> query @@ to_tsvector(&#8218; <span style=\"color: #993300;\">englisch<\/span>&#8218;, inhalt) <span style=\"color: #3366ff;\">ORDER<\/span> <span style=\"color: #3366ff;\">BY<\/span> rank        <span style=\"color: #3366ff;\">DESC<\/span> <span style=\"color: #3366ff;\">LIMIT<\/span> <span style=\"color: #339966;\">5<\/span>) <span style=\"color: #3366ff;\">as<\/span> t &#8222;` <\/p>\n<hr>\n<p> Die erste Anweisung verwendet die Vektorsuche und den HNSW-Index. Relevante Vektoren k\u00f6nnen aus dem Text der Suchanfrage mit Hilfe des zuvor erw\u00e4hnten Modells <em>textembedding-gecko@001<\/em> generiert werden, indem Sie die im <a href=\"https:\/\/github.com\/GoogleCloudPlatform\/vertex-ai-samples\/blob\/main\/notebooks\/official\/vector_search\/sdk_vector_search_create_stack_overflow_embeddings_vertex.ipynb\">Notebook<\/a> definierte Funktion <em>encode_texts_to_embeddings()<\/em> aufrufen (was kein Problem sein sollte, wenn Sie es bis hierher geschafft haben). Die zweite Anweisung verwendet die Volltextsuche, wobei der Text der Suchanfrage direkt in der Anweisung als &#8222;&#8220; angegeben wird.  <\/p>\n<\/div><div class=\"fusion-text fusion-text-5\"><h2><span lang=\"EN-US\">Ergebnisse und Schlussfolgerung<\/span><\/h2>\n<p> Verwendung der Systemansicht <em>pg_stat_statements<\/em> und Funktionen <em>pg_relation_size<\/em>, <em>pg_total_relation_size<\/em> k\u00f6nnen wir Informationen \u00fcber die Ausf\u00fchrungsgeschwindigkeit und den Umfang der Volltextsuche und der Vektorsuche gewinnen:<\/p>\n<\/div>\n<div class=\"table-2\">\n<table width=\"100%\">\n<thead>\n<tr>\n<th align=\"left\">Name<\/th>\n<th align=\"left\">Werte<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">Anzahl der Zeilen<\/td>\n<td align=\"left\">50000<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">Tabellengr\u00f6\u00dfe mit Indizes<\/td>\n<td align=\"left\">489 MB<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">Gr\u00f6\u00dfe des HNSW-Index<\/td>\n<td align=\"left\">195 MB<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">Gr\u00f6\u00dfe des GIN-Index<\/td>\n<td align=\"left\">40 MB<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n\n<div class=\"table-2\">\n<table width=\"100%\">\n<thead>\n<tr>\n<th align=\"left\">Typ<\/th>\n<th align=\"left\">min_exec_time (ms)<\/th>\n<th align=\"left\">max_exec_time (ms)<\/th>\n<th align=\"left\">mean_exec_time (ms)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">Vektor (HNSW)<\/td>\n<td align=\"left\">2.4<\/td>\n<td align=\"left\">5.0<\/td>\n<td align=\"left\">3.4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">Volltext (GIN)<\/td>\n<td align=\"left\">1.4<\/td>\n<td align=\"left\">871.9<\/td>\n<td align=\"left\">101.2<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"fusion-text fusion-text-6\"><p>Wie wir sehen k\u00f6nnen, ist der HNSW-Index 2,5 Mal gr\u00f6\u00dfer als der GIN-Index f\u00fcr dieselben Daten. Die Volltextsuche hat eine h\u00f6here Varianz in der Abfragezeit. Sie ist im Durchschnitt langsamer, aber wir m\u00fcssen bedenken, dass wir zur Durchf\u00fchrung von Vektorsuchen auch Einbettungen aus der Textabfrage generieren m\u00fcssen. Es dauert etwa 100 ms, um einen Vektor mit Hilfe eines API-Aufrufs an <em>textembedding-gecko@001<\/em> in derselben Region zu erzeugen, in der das Modell gehostet wird. Aus qualitativer Sicht ist die Volltextsuche starrer und vorteilhafter f\u00fcr die Suche nach exakten \u00dcbereinstimmungen und Begriffen, w\u00e4hrend die Vektorsuche besser f\u00fcr die Suche nach der Bedeutung geeignet ist. Au\u00dferdem kommt die Vektorsuche besser mit grammatikalischen Fehlern in der Suchanfrage zurecht. Wenn man den Ressourcenverbrauch im Verh\u00e4ltnis zur vollen CPU- und Festplattenkapazit\u00e4t betrachtet, belaufen sich die gesch\u00e4tzten Kosten f\u00fcr 10.000 Vektorsuchanfragen pro Tag mit einer durchschnittlichen L\u00e4nge von 100 Zeichen pro Anfrage auf etwa $2,00, einschlie\u00dflich der Kosten f\u00fcr die API-Aufrufe zur Erzeugung der Einbettungen. Bei einer Volltextsuche mit \u00e4hnlichen Merkmalen liegt der Preis bei weniger als $1. Sie k\u00f6nnen den <a href=\"https:\/\/cloud.google.com\/products\/calculator\">Preisrechner<\/a> von Google Cloud verwenden, um die Kosten zu sch\u00e4tzen. Wenn Sie die Schritte zur Erstellung des Spielplatzes befolgt haben, vergessen Sie nicht, die Cloud SQL-Instanz abzubauen und andere Ressourcen zu bereinigen, die Sie m\u00f6glicherweise in GCP zugewiesen haben.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1216.8px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><\/div><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":3,"featured_media":6537,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[42],"tags":[],"class_list":["post-6538","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-coding"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Vektor-\u00c4hnlichkeitssuche vs. traditionelle Volltextsuche: Ein Vergleich - Ultra Tendency Academy<\/title>\n<meta name=\"description\" content=\"In diesem Artikel vergleichen wir eine traditionelle Volltextsuche mit einer Vektorsuche unter Verwendung einer PostgreSQL-Instanz in einer Cloud-Umgebung.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vektor-\u00c4hnlichkeitssuche vs. traditionelle Volltextsuche: Ein Vergleich - Ultra Tendency Academy\" \/>\n<meta property=\"og:description\" content=\"In diesem Artikel vergleichen wir eine traditionelle Volltextsuche mit einer Vektorsuche unter Verwendung einer PostgreSQL-Instanz in einer Cloud-Umgebung.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/\" \/>\n<meta property=\"og:site_name\" content=\"Ultra Tendency Academy\" \/>\n<meta property=\"article:published_time\" content=\"2024-08-14T11:08:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-08-14T11:18:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ultratendency.academy\/wp-content\/uploads\/2024\/08\/vector_similartiy.png\" \/>\n\t<meta property=\"og:image:width\" content=\"750\" \/>\n\t<meta property=\"og:image:height\" content=\"500\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Sally Bo Hatter\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sally Bo Hatter\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"14\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/2024\\\/08\\\/14\\\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/2024\\\/08\\\/14\\\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\\\/\"},\"author\":{\"name\":\"Sally Bo Hatter\",\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/#\\\/schema\\\/person\\\/b417acb6e3e5e24ff1b0c5941e419ea9\"},\"headline\":\"Vektor-\u00c4hnlichkeitssuche vs. traditionelle Volltextsuche: Ein Vergleich\",\"datePublished\":\"2024-08-14T11:08:50+00:00\",\"dateModified\":\"2024-08-14T11:18:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/2024\\\/08\\\/14\\\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\\\/\"},\"wordCount\":2890,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/2024\\\/08\\\/14\\\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ultratendency.academy\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/vector_similartiy.png\",\"articleSection\":[\"Coding\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/ultratendency.academy\\\/de\\\/2024\\\/08\\\/14\\\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/2024\\\/08\\\/14\\\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\\\/\",\"url\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/2024\\\/08\\\/14\\\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\\\/\",\"name\":\"Vektor-\u00c4hnlichkeitssuche vs. traditionelle Volltextsuche: Ein Vergleich - Ultra Tendency Academy\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/2024\\\/08\\\/14\\\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/2024\\\/08\\\/14\\\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ultratendency.academy\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/vector_similartiy.png\",\"datePublished\":\"2024-08-14T11:08:50+00:00\",\"dateModified\":\"2024-08-14T11:18:20+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/#\\\/schema\\\/person\\\/b417acb6e3e5e24ff1b0c5941e419ea9\"},\"description\":\"In diesem Artikel vergleichen wir eine traditionelle Volltextsuche mit einer Vektorsuche unter Verwendung einer PostgreSQL-Instanz in einer Cloud-Umgebung.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/2024\\\/08\\\/14\\\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ultratendency.academy\\\/de\\\/2024\\\/08\\\/14\\\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/2024\\\/08\\\/14\\\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\\\/#primaryimage\",\"url\":\"https:\\\/\\\/ultratendency.academy\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/vector_similartiy.png\",\"contentUrl\":\"https:\\\/\\\/ultratendency.academy\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/vector_similartiy.png\",\"width\":750,\"height\":500},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/2024\\\/08\\\/14\\\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vektor-\u00c4hnlichkeitssuche vs. traditionelle Volltextsuche: Ein Vergleich\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/\",\"name\":\"Ultra Tendency Academy\",\"description\":\"News &amp; Expertentipps aus der IT-Branche\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/#\\\/schema\\\/person\\\/b417acb6e3e5e24ff1b0c5941e419ea9\",\"name\":\"Sally Bo Hatter\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6af8a92f6ae6021d8e0786d04c66cacfb1c012d43877d0715f99e0fb5a379d7a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6af8a92f6ae6021d8e0786d04c66cacfb1c012d43877d0715f99e0fb5a379d7a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6af8a92f6ae6021d8e0786d04c66cacfb1c012d43877d0715f99e0fb5a379d7a?s=96&d=mm&r=g\",\"caption\":\"Sally Bo Hatter\"},\"url\":\"https:\\\/\\\/ultratendency.academy\\\/de\\\/author\\\/sallybohattar\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Vektor-\u00c4hnlichkeitssuche vs. traditionelle Volltextsuche: Ein Vergleich - Ultra Tendency Academy","description":"In diesem Artikel vergleichen wir eine traditionelle Volltextsuche mit einer Vektorsuche unter Verwendung einer PostgreSQL-Instanz in einer Cloud-Umgebung.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/","og_locale":"de_DE","og_type":"article","og_title":"Vektor-\u00c4hnlichkeitssuche vs. traditionelle Volltextsuche: Ein Vergleich - Ultra Tendency Academy","og_description":"In diesem Artikel vergleichen wir eine traditionelle Volltextsuche mit einer Vektorsuche unter Verwendung einer PostgreSQL-Instanz in einer Cloud-Umgebung.","og_url":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/","og_site_name":"Ultra Tendency Academy","article_published_time":"2024-08-14T11:08:50+00:00","article_modified_time":"2024-08-14T11:18:20+00:00","og_image":[{"width":750,"height":500,"url":"https:\/\/ultratendency.academy\/wp-content\/uploads\/2024\/08\/vector_similartiy.png","type":"image\/png"}],"author":"Sally Bo Hatter","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Sally Bo Hatter","Gesch\u00e4tzte Lesezeit":"14\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/#article","isPartOf":{"@id":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/"},"author":{"name":"Sally Bo Hatter","@id":"https:\/\/ultratendency.academy\/de\/#\/schema\/person\/b417acb6e3e5e24ff1b0c5941e419ea9"},"headline":"Vektor-\u00c4hnlichkeitssuche vs. traditionelle Volltextsuche: Ein Vergleich","datePublished":"2024-08-14T11:08:50+00:00","dateModified":"2024-08-14T11:18:20+00:00","mainEntityOfPage":{"@id":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/"},"wordCount":2890,"commentCount":0,"image":{"@id":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/#primaryimage"},"thumbnailUrl":"https:\/\/ultratendency.academy\/wp-content\/uploads\/2024\/08\/vector_similartiy.png","articleSection":["Coding"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/","url":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/","name":"Vektor-\u00c4hnlichkeitssuche vs. traditionelle Volltextsuche: Ein Vergleich - Ultra Tendency Academy","isPartOf":{"@id":"https:\/\/ultratendency.academy\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/#primaryimage"},"image":{"@id":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/#primaryimage"},"thumbnailUrl":"https:\/\/ultratendency.academy\/wp-content\/uploads\/2024\/08\/vector_similartiy.png","datePublished":"2024-08-14T11:08:50+00:00","dateModified":"2024-08-14T11:18:20+00:00","author":{"@id":"https:\/\/ultratendency.academy\/de\/#\/schema\/person\/b417acb6e3e5e24ff1b0c5941e419ea9"},"description":"In diesem Artikel vergleichen wir eine traditionelle Volltextsuche mit einer Vektorsuche unter Verwendung einer PostgreSQL-Instanz in einer Cloud-Umgebung.","breadcrumb":{"@id":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/#primaryimage","url":"https:\/\/ultratendency.academy\/wp-content\/uploads\/2024\/08\/vector_similartiy.png","contentUrl":"https:\/\/ultratendency.academy\/wp-content\/uploads\/2024\/08\/vector_similartiy.png","width":750,"height":500},{"@type":"BreadcrumbList","@id":"https:\/\/ultratendency.academy\/de\/2024\/08\/14\/vektor-aehnlichkeitssuche-vs-traditionelle-volltextsuche-ein-vergleich\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/ultratendency.academy\/de\/"},{"@type":"ListItem","position":2,"name":"Vektor-\u00c4hnlichkeitssuche vs. traditionelle Volltextsuche: Ein Vergleich"}]},{"@type":"WebSite","@id":"https:\/\/ultratendency.academy\/de\/#website","url":"https:\/\/ultratendency.academy\/de\/","name":"Ultra Tendency Academy","description":"News &amp; Expertentipps aus der IT-Branche","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ultratendency.academy\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Person","@id":"https:\/\/ultratendency.academy\/de\/#\/schema\/person\/b417acb6e3e5e24ff1b0c5941e419ea9","name":"Sally Bo Hatter","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/6af8a92f6ae6021d8e0786d04c66cacfb1c012d43877d0715f99e0fb5a379d7a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/6af8a92f6ae6021d8e0786d04c66cacfb1c012d43877d0715f99e0fb5a379d7a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6af8a92f6ae6021d8e0786d04c66cacfb1c012d43877d0715f99e0fb5a379d7a?s=96&d=mm&r=g","caption":"Sally Bo Hatter"},"url":"https:\/\/ultratendency.academy\/de\/author\/sallybohattar\/"}]}},"_links":{"self":[{"href":"https:\/\/ultratendency.academy\/de\/wp-json\/wp\/v2\/posts\/6538","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ultratendency.academy\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ultratendency.academy\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ultratendency.academy\/de\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/ultratendency.academy\/de\/wp-json\/wp\/v2\/comments?post=6538"}],"version-history":[{"count":0,"href":"https:\/\/ultratendency.academy\/de\/wp-json\/wp\/v2\/posts\/6538\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ultratendency.academy\/de\/wp-json\/wp\/v2\/media\/6537"}],"wp:attachment":[{"href":"https:\/\/ultratendency.academy\/de\/wp-json\/wp\/v2\/media?parent=6538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ultratendency.academy\/de\/wp-json\/wp\/v2\/categories?post=6538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ultratendency.academy\/de\/wp-json\/wp\/v2\/tags?post=6538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}