Volltextsuche
Die Docsbook-Suche ist ein Postgres-Volltextindex über Ihre Seiten, der als Suchschaltfläche im Header und als Suchfeld in der Seitenleiste verfügbar ist. Pro Abfrage fallen keine Kosten an – es wird kein Modell aufgerufen – und die Abfragen, die keine Ergebnisse lieferten, sind eines der beiden nützlichsten Signale, die Ihre Dokumentation erzeugt.
Was Sie erhalten#
- Ein Suchfeld im Header, in der Seitenleiste oder in beiden. Beide können gleichzeitig ausgeführt werden; eines reicht normalerweise aus.
- Ergebnisse mit einem hervorgehobenen Ausschnitt — ein Kontextfenster aus dem Seitentext rund um die Übereinstimmung, nicht aus den ersten 200 Zeichen der Seite.
- Direkte Links zur genauen Überschrift. Ein Treffer innerhalb eines Abschnitts enthält den tatsächlichen Anker dieses Abschnitts, sodass der Leser beim Absatz statt am Anfang einer langen Seite landet.
- Übersetzte Seiten zuerst. Befindet sich der Leser in einer übersetzten Spracheinstellung, wird die übersetzte Zeile bevorzugt; nicht übersetzte Seiten werden weiterhin angezeigt, sodass eine teilweise übersetzte Website vollständig durchsucht wird.
- Eine Aufzeichnung jeder Suche, die keine Ergebnisse geliefert hat, in Form eines
search.no_results-Webhooks und eines Berichts zu fehlgeschlagenen Suchen.
Wie wird der Index erstellt?#
Write-through beim Rendern, nicht beim Push. Eine Seite wird in den Index aufgenommen, wenn Docsbook sie rendert — nachdem die Antwort gesendet wurde, sodass die Indizierung die Seite niemals verzögert. Eine übersetzte Seite wird auf dieselbe Weise indiziert, sobald ihre Übersetzung im Cache liegt. Es gibt nichts, was man manuell neu aufbauen müsste, und keinen Button zum erneuten Indizieren.
Die Konsequenz sollte man kennen: Eine Seite, die seit ihrer Veröffentlichung niemand geöffnet hat, befindet sich noch nicht im Index. Eine brandneue Website liefert daher zunächst nur wenige Suchergebnisse, bis ihre Seiten einmal besucht wurden. Solange noch kein einziger Datensatz existiert, greift das Suchfeld auf die Übereinstimmung mit Dateinamen aus der Seitenliste zurück, sodass es niemals ohne Ergebnis bleibt.
Was in einen Datensatz eingeht:
| Feld | Inhalt |
|---|---|
| Titel | Frontmatter title, andernfalls die H1 der Seite, andernfalls der Dateiname |
| Inhalt | Der Klartext der Seite: Frontmatter, Überschriften-Markup, Bilder, Linksyntax, Codeblöcke mit Fence-Syntax und Markdown-Zeichen für Inline-Formatierungen werden entfernt |
| Abschnitte | Ein Eintrag pro h2/h3, der den gerenderten Anker und den Text der Überschrift enthält; <pre>-Blöcke werden entfernt |
| Sprache | Für die Originalseite leer, der Gebietsschema-Code für jede Übersetzung |
Die Suche erfolgt anhand eines generierten tsvector, in dem der Titel das Gewicht A und der Inhalt das Gewicht B erhält — die Gewichtungsbezeichnungen von PostgreSQL existieren, damit „Wörter aus verschiedenen Teilen eines Dokuments von Ranking-Funktionen unterschiedlich gewichtet werden können“ (PostgreSQL: Zusätzliche Textsuchfunktionen). Diese Spalte wird mit GIN indiziert.
Wie wird eine Abfrage beantwortet?#
- Stoppwörter werden entfernt.
websearch_to_tsquery„verknüpft nicht in Anführungszeichen gesetzte Textbegriffe mit dem&-Operator (AND)“ (PostgreSQL: Steuern der Textsuche), sodass ein vollständiger Satz voraussetzt, dass die Seite auch jedes Füllwort enthält. Eine englische Stoppwortliste mit 45 Wörtern wird zuerst entfernt, jedoch nur außerhalb von Anführungszeichen — daher funktionieren"exact phrase",ORund-wordweiterhin. - Englische Abfragen werden stemming-basiert verarbeitet. Für englische und nicht übersetzte Inhalte werden Abfrage und Dokument anhand der Konfiguration
englishabgeglichen, die einen Snowball-Stemmer verwendet, der „gängige Varianten von Wörtern auf eine Grundform oder einen Stamm zurückführt“ (PostgreSQL: Wörterbücher). Ohne diese Funktion stimmt eine Seite mit „served“ nicht mit einer Abfrage überein, die „serve“ enthält. - Andere Sprachen verwenden den gespeicherten Index. Nicht-englische Gebietsschemata werden mit dem gespeicherten
simple-Vektor abgeglichen, der „das Eingabetoken in Kleinbuchstaben umwandelt“ und kein Stemming durchführt. Auf nichtlateinischen Text angewendete englische Stemming-Regeln führen zu unsinnigen Ergebnissen und werden daher bewusst nicht angewendet. - Der englische Pfad normalisiert den Rang nach der Länge. Bei englischen Abfragen wird
ts_rankmit dem Normalisierungsflag 1 ausgeführt, das „den Rang durch 1 plus den Logarithmus der Dokumentlänge teilt“. Ohne diese Funktion würde ein 76 KB großes Änderungsprotokoll, das jeden Abfragebegriff beiläufig erwähnt, die kurze Seite übertreffen, die sich tatsächlich mit der Frage befasst. Der nicht-englische Pfad ruftts_rankohne Normalisierungsflag auf, sodass eine lange Seite in diesen Gebietsschemata nicht wegen ihrer Länge benachteiligt wird — siehe Einschränkungen. - Eine Zeile pro Seite. Original und Übersetzung werden zu einem einzigen Ergebnis zusammengeführt, wobei zunächst die Sprache des Lesers und anschließend der Rang bevorzugt werden. Ein Treffer im Titel wird gegenüber Treffern ausschließlich im Textkörper höher eingestuft.
- Das Snippet wird serverseitig erstellt.
ts_headlinegibt ein Fragment mit 5–18 Wörtern rund um den Treffer zurück; der Client hebt die Begriffe erneut hervor.
Was passiert bei einem Tippfehler?#
Nichts wird gefunden. Die Docsbook-Suche verwendet keine unscharfe Suche, keine Trigrammähnlichkeit und keinen Fallback über die Edit-Distanz. Stemming deckt Flexionen ab — serve findet served —, aber keine Rechtschreibfehler: documnetation findet nichts.
Das ist eine bewusste Abwägung und kein Versehen. Als Ausgleich gibt es einen Mechanismus: Jede Suchanfrage ohne Ergebnis wird Ihnen gemeldet. Der Bericht wird zusammengefasst, sodass eine Suche ein Signal ergibt und nicht eines pro Tastendruck:
- Der Browser wartet 1,5 Sekunden, nachdem der Leser aufgehört hat zu tippen, bevor er einen Fehlschlag meldet, und meldet ihn sofort, wenn der Leser den Dialog mitten in der Suche schließt — gemessen an einem Live-Arbeitsbereich: Ein Leser, der ein Wort eintippte, pausierte zwischen den Zeichen 0,9–1,3 Sekunden, wodurch vor dieser Änderung acht Berichte für ein einziges Wort erzeugt wurden.
- Der Server unterdrückt unabhängig davon einen Fehlschlag, der innerhalb eines kurzen Zeitfensters vom selben Leser eine strikte Präfixerweiterung des vorherigen ist, da der Endpunkt öffentlich ist und nicht davon ausgehen kann, dass irgendein Client eine Entprellung vorgenommen hat.
Dass documnetation in Ihrem Bericht über fehlgeschlagene Suchen auftaucht, ist also kein Fehler der Suche — die Suche teilt Ihnen mit, dass ein Leser die Seite nicht finden konnte; genau darauf können Sie reagieren. Wiederkehrende Tippfehler beheben Sie am besten in Ihren Inhalten, indem Sie den Begriff aufnehmen, den der Leser tatsächlich eingibt.
Wo das Suchfeld platziert wird#
| Platzierung | Am besten für | Kompromiss |
|---|---|---|
| Schaltfläche im Header | Erstbesucher, die zuerst auf die obere Leiste schauen | Beansprucht Platz neben Ihren Header-Links |
| Feld in der Seitenleiste | Leser, die bereits über die Baumstruktur navigieren | Auf schmalen Bildschirmen ausgeblendet, wenn die Seitenleiste eingeklappt wird |
Aktivieren Sie die Schaltfläche im Header unter Float Widget → Design → Header → Suchschaltfläche. Aktivieren Sie das Feld in der Seitenleiste unter Float Widget → Design → Linke Seitenleiste → In der Seitenleiste suchen. Beide Optionen sind in jedem Tarif kostenlos.
Warum dies der richtige Weg ist (Belege)#
| Regel | Warum es funktioniert | Quelle |
|---|---|---|
| Behalten Sie einen lexikalischen Index bei, auch wenn eine semantische Suche verfügbar ist | Bei über 18 Retrieval-Datensätzen ist „BM25 eine robuste Baseline“ in Zero-Shot-Szenarien, während dichte Retriever „häufig schlechter abschneiden“ — Ihr Korpus liegt außerhalb des Trainingsbereichs jedes Embedding-Modells, und exakte Begriffe sind das, was technische Leser eingeben | Thakur et al., 2021 — BEIR |
| Entfernen Sie Stoppwörter, bevor die Abfrage PostgreSQL erreicht | websearch_to_tsquery verknüpft nicht in Anführungszeichen gesetzte Begriffe mit AND, sodass ein auf der Seite fehlendes Füllwort den gesamten Treffer ungültig macht |
PostgreSQL: Steuern der Textsuche |
| Stammformen Sie englische Texte, aber keine anderen Sprachen | Die Konfiguration simple wandelt nur in Kleinbuchstaben um; Snowball-Stemmer sind sprachspezifisch und reduzieren Varianten auf eine Stammform |
PostgreSQL: Wörterbücher |
| Normalisieren Sie die Rangfolge anhand der Dokumentlänge (englischer Pfad) | Flag 1 „teilt die Rangfolge durch 1 plus den Logarithmus der Dokumentlänge“, sodass eine lange beiläufige Erwähnung keine kurze, dem Thema gewidmete Seite übertreffen kann | PostgreSQL: Steuern der Textsuche |
| Gewichten Sie den Titel höher als den Text | Gewichtungsbezeichnungen ermöglichen es der Rangfolge, Wörter aus verschiedenen Teilen eines Dokuments unterschiedlich zu behandeln | PostgreSQL: Zusätzliche Funktionen der Textsuche |
Der gleiche Index ist einer der beiden Retriever hinter dem KI-Chat — auch dort ist er kein minderwertiger Fallback.
Grenzen#
- Keine Fehlertoleranz bei Tippfehlern. Siehe oben. Wenn eine falsche Schreibweise für Ihre Zielgruppe relevant ist, fügen Sie den Begriff der Seite hinzu.
- Codeblöcke sind nicht durchsuchbar. Eingezäunter Code wird vor der Indexierung entfernt, und
<pre>-Blöcke werden aus dem Abschnittstext entfernt. Leser, die nach einem Funktionsnamen suchen, der nur innerhalb eines Codebeispiels vorkommt, werden ihn nicht finden. Infrage gestellt: In der älteren Dokumentation wurde behauptet, dass Codeblöcke indexiert und „unterhalb von Fließtext eingestuft“ würden; der Indexierer entfernt sie stattdessen vollständig. - Die Abdeckung hängt vom Datenverkehr ab, nicht von Ihrem Repository. Eine Seite wird bei ihrer ersten Darstellung in den Index aufgenommen. Eine veröffentlichte, aber nie geöffnete Seite fehlt in den Suchergebnissen, bis sie jemand öffnet.
- Wir veröffentlichen keine Latenzangabe. Englische Abfragen berechnen ihren
tsvectorzum Abfragezeitpunkt, anstatt den gespeichertensimple-Index zu lesen. Das bedeutet, dass der englische Pfad pro Abfrage mehr Arbeit verrichtet, wenn der Korpus wächst. Wir haben keinen Benchmark veröffentlicht und werden keinen angeben, bevor wir einen haben. - Die Längennormalisierung ist nur für Englisch verfügbar. Der englische Abfragepfad übergibt das Normalisierungsflag 1 an
ts_rank; der für andere Sprachen verwendete Pfad ruftts_rankganz ohne Flag auf, wodurch keine Längennormalisierung erfolgt. Auf einer nicht englischsprachigen Website kann eine sehr lange Seite daher eine kurze Seite übertreffen, die sich präziser auf die Abfrage bezieht. Infrage gestellt, bis die beiden Pfade angeglichen sind. - Die Suche erfolgt pro Projekt. Der Index ist auf einen Arbeitsbereich beschränkt; es gibt keine projektübergreifende Suche.
- Das Signal für eine fehlgeschlagene Suche wird zusammengefasst und ist nicht exakt. Der erste Fehlschlag einer Eingabekette wird an einen aktiven Webhook übermittelt, sodass die übermittelte Abfrage ein kürzeres Präfix der Abfrage sein kann, bei der der Leser letztendlich geblieben ist. Der historische Bericht stellt die endgültige Abfrage wieder her.
Verwandte Inhalte#
- KI-Chat — der Assistent, der diesen Index als einen seiner Retriever verwendet.
- Antwortqualität — wie lexikalische und Vektor-Suche zusammengeführt werden.
- Analysen: wonach Leser gesucht haben — die Suchanfragen, die keine Ergebnisse geliefert haben.
- Seitenfeedback — das andere Signal dafür, dass eine Seite fehlt oder falsch benannt ist.