Es gibt einen bestimmten Moment, in dem eine Notizen-App ihren Zweck verfehlt. Nicht dann, wenn der Speicher voll ist. Sondern dann, wenn du zum ersten Mal sicher weißt, dass du etwas aufgeschrieben hast, danach suchst und die App dir sagt, es gebe keine Treffer.
Du hast es aufgeschrieben. Die Notiz ist da. Du hast nur nach „das mit den Preisstufen“ gesucht, und in der Notiz steht „dreiteiliges Paketangebot, verankert an der mittleren SKU“. Kein einziges gemeinsames Wort.
Dieses Problem wird schlimmer, je wertvoller dein Archiv wird. Bei hundert Notizen erinnerst du dich an den Wortlaut. Bei zehntausend erinnerst du dich an die Idee und an sonst nichts. Die Stichwortsuche ist genau dann am schwächsten, wenn du sie am dringendsten brauchst.
Notez startet für jede Anfrage zwei Suchen und legt die Ergebnisse zusammen. Hier steht, wie das genau funktioniert, einschließlich der Teile, die gröber gebaut sind, als du vermutlich annimmst.
Zweig eins: Stichwortsuche
Der Stichwort-Zweig ist ein schlichter SQL-Abgleich auf Teilzeichenketten. Aus deiner Anfrage wird %query%, und sie wird ohne Rücksicht auf Groß- und Kleinschreibung verglichen mit:
dem Titel der Notiz
dem extrahierten Klartext der Notiz (das formatierte Dokument, beim Speichern in reinen Text umgewandelt)
den Werten benutzerdefinierter Eigenschaften: den Beschriftungen der Optionen von Auswahl- und Mehrfachauswahl-Eigenschaften und dem Text textartiger Eigenschaften
Der letzte Punkt ist wichtiger, als er klingt. Hast du eine Eigenschaft Client mit der Option Acme, findet die Suche nach acme jede Notiz, die diesen Wert trägt, auch wenn das Wort nie im Text vorkommt.
Zurück kommen bis zu 50 Stichwort-Treffer, die zuletzt geänderten zuerst.
Worin dieser Zweig gut ist: exaktes Wiederfinden. Kennungen, Fehlercodes, Namen, eine Formulierung, die du wörtlich im Kopf hast. Tippst du NOTE_MODIFIED, willst du die Notiz mit genau dieser Zeichenkette, ganz oben, sofort.
Worin er schlecht ist: in allem anderen. Ein Abgleich auf Teilzeichenketten ist nicht unscharf: Ein Tippfehler in der Anfrage findet nichts. Synonyme finden nichts. Konzepte finden nichts.
Zweig zwei: semantische Suche
Der semantische Zweig wandelt deine Anfrage in einen Vektor um und sucht Notizinhalte, die in diesem Raum in ihrer Nähe liegen.
Konkret: Die Anfrage wird mit OpenAIs Modell text-embedding-3-small in 1.536 Dimensionen eingebettet, und Postgres (mit pgvector) sortiert die gespeicherten Abschnitte der Notizen nach ihrer Kosinus-Distanz dazu. Zurück kommen bis zu 20 Notizen.
Worin dieser Zweig gut ist: in dem Fall, an dem die Stichwortsuche gescheitert ist. „Preisstufen“ und „dreiteiliges Paketangebot“ liegen im Embedding-Raum nah beieinander, weil das Modell mit genug Text trainiert wurde, um zu wissen, dass es um dasselbe Thema geht.
Worin er schlecht ist: Präzision. Vektoren kennen kein „genau diese Zeichenkette“. Suchst du nach einer UUID, liefert dir der semantische Zweig selbstbewusst etwas thematisch Benachbartes und Nutzloses.
Keiner der beiden Zweige reicht allein. Genau deshalb laufen beide.
Was tatsächlich eingebettet wird
Eine ganze Notiz als einen einzigen Vektor einzubetten liefert keine guten Ergebnisse. Eine Besprechungsnotiz mit 4.000 Wörtern, gemittelt zu einem einzigen Punkt im Raum, liegt in der Nähe von nichts Bestimmtem: Sie ist ein verwischter Fleck über alle Themen, die sie berührt.
Deshalb werden Notizen vor dem Einbetten in Abschnitte zerlegt, und die Zerlegung folgt der Struktur des Dokuments:
Der Titel wird dem Inhalt vorangestellt, bevor irgendetwas anderes passiert. So gehört sein Wortlaut zu dem, was indexiert wird, statt in einem eigenen Feld zu liegen, das niemand durchsucht.
An Überschriften teilen. Jede Überschrift beginnt einen neuen Abschnitt. Eine Überschrift ohne Text darunter wird trotzdem für sich indexiert, weil eine Überschrift auch bei leerem Abschnitt etwas bedeutet.
Lange Abschnitte an Absätzen teilen. Alles über 2.000 Zeichen wird an Absatzgrenzen getrennt statt mitten im Satz.
Winzige Abschnitte mit den Nachbarn zusammenlegen. Alles unter 100 Zeichen wird mit dem benachbarten Abschnitt verschmolzen, statt verworfen zu werden.
Die letzte Regel gibt es wegen eines Fehlers. Eine frühere Version hat zu kleine Abschnitte verworfen. Von einer Notiz aus mehreren kurzen Abschnitten – und genau so sieht eine Besprechungsnotiz mit Stichpunkten aus – blieb dadurch fast nichts übrig. Technisch war die Notiz indexiert. Finden ließ sie sich trotzdem nicht.
Jeder gespeicherte Abschnitt behält seine Überschrift und seine Position im Dokument. So kann ein semantischer Treffer zeigen, welcher Teil einer langen Notiz passt, und nicht nur, dass die Notiz irgendwo passt.
Weil eine lange Notiz viele Abschnitte erzeugt, holt die Abfrage dreimal so viele Ergebnisse wie nötig und behält dann pro Notiz nur den Abschnitt mit der besten Bewertung. Ohne das würde eine einzige ausufernde Notiz jeden Platz in deinen Ergebnissen belegen.
Die zwei Schwellenwerte und warum sie verschieden sind
Die Kosinus-Distanz beginnt bei 0 (gleiche Richtung) und steigt von dort an. Ein Ergebnis gilt nur unterhalb einer Distanzgrenze als Treffer, und Notez nutzt zwei verschiedene Grenzen für zwei verschiedene Aufgaben.
Die Suche nutzt 0,62. Streng.
„Ähnliche Notizen“ nutzt 0,8. Großzügig.
Der Unterschied ist kein Versehen. „Ähnliche Notizen“ ist eine Stöberhilfe unter einer Notiz, die du ohnehin gerade liest; ein ungenauer Treffer kostet dich dort nur einen Blick. Suchergebnisse dagegen behaupten, dass diese Notizen deine Anfrage beantworten.
Bei 0,8 wurde die Suche auf eine Weise nutzlos, die eine Weile unbemerkt blieb. Eine beliebige Anfrage passte zu fast jeder kurzen Notiz, denn kurzer Text erzeugt Embeddings, die nahe der Mitte von allem liegen. Ein nicht leerer Workspace konnte deshalb nie „Keine Notizen gefunden“ anzeigen. Jede Suche lieferte etwas. Manches davon war Müll, und nichts unterschied den Müll von echten Treffern.
Eine Suche, die nie „hier ist nichts“ sagen kann, ist keine Suche. Sie ist ein Zufallsgenerator für Notizen, nur umständlicher.
Wie die beiden Zweige zusammengeführt werden
Dieser Teil ist einfacher, als du vermutlich denkst: Zuerst kommen die Stichwort-Treffer in ihrer Reihenfolge. Dann werden alle semantischen Treffer angehängt, die noch nicht in der Liste stehen.
Das ist alles. Kein Reranking mit Cross-Encoder, keine Score-Fusion, kein Reciprocal-Rank-Blending. Beide Zweige laufen parallel, Doppelte werden über die Notiz-ID entfernt, und bei Gleichstand gewinnt der Stichwort-Zweig, weil er zuerst kommt.
Ich sage das so deutlich, weil es eine Folge hat, die dir auffallen wird: Ein perfekter semantischer Treffer kann unter einem mittelmäßigen Stichwort-Treffer landen. Ist deine Anfrage zufällig eine häufige Zeichenfolge, stehen oben in den Ergebnissen die Treffer auf diese Zeichenfolge.
Ein richtiges Fusions-Ranking wäre eine spürbare Verbesserung, aber gebaut ist es nicht. Was gebaut ist, gibt ehrlich zu, was es ist: eine Vereinigung, kein Ranking.
Filter gelten für beide Zweige
Wonach du auch filterst, ob nach Tags, nach Werten benutzerdefinierter Eigenschaften oder nach dem Papierkorb: Der Filter schränkt beide Suchen ein, nicht nur die Stichwortsuche. Der semantische Zweig schiebt diese Bedingungen in dieselbe Abfrage wie die Vektordistanz, sodass beim Filtern nie unbemerkt die semantische Hälfte deiner Ergebnisse verloren geht.
Was passiert, wenn der semantische Zweig ausfällt
Eine Anfrage einzubetten heißt, ein externes Modell über das Netz aufzurufen. Netzwerkaufrufe können fehlschlagen.
Wirft der semantische Zweig einen Fehler, wird er protokolliert, und der Zweig gibt eine leere Liste zurück. Die Suche selbst meldet keinen Fehler. Du bekommst die Stichwort-Treffer, also genau das, was dir jede herkömmliche Notizen-App geliefert hätte, und die Seite wird angezeigt.
Das ist Absicht: Die schicke Hälfte einer Funktion darf nie die langweilige Hälfte mit sich reißen. Auf reine Stichwortsuche zurückzufallen ist ein schlechter Tag. Eine Fehlerseite zu zeigen, weil eine Vektordatenbank langsam war, ist ein schlechterer.
Ähnliche Notizen, kurz erklärt
Jede Notiz hat ein Panel „Ähnliche Notizen“, und es arbeitet etwas anders als die Suche: Statt eine Anfrage einzubetten, nimmt es das Embedding des ersten Abschnitts der Notiz und sucht dessen nächste Nachbarn im selben Workspace, die Notiz selbst ausgenommen. Bis zu fünf Ergebnisse, mit der großzügigeren Grenze von 0,8.
Diese Funktion bringt Dinge zum Vorschein, nach denen du nie gesucht hättest, denn um zu suchen, musst du schon ahnen, dass es den Zusammenhang gibt.
Die Beschränkung auf den Workspace wird hier über einen Join mit der Notiz-Tabelle durchgesetzt, statt den Embedding-Zeilen zu vertrauen, die keine eigene Workspace-Spalte haben. Macht man das falsch, empfiehlt dein Arbeits-Workspace plötzlich deine privaten Notizen.
So suchst du gut
Ausgehend davon, wie sich die beiden Zweige die Arbeit teilen:
Was du genau im Kopf hast, also einen Namen, eine Fehlermeldung oder eine Kennung, tippst du wörtlich ein. Der Stichwort-Zweig trifft es sicher.
Woran du dich nur ungefähr erinnerst, beschreibst du kurz: die Idee, nicht den Wortlaut. „Warum wir den Retry in der Queue gestrichen haben“ funktioniert besser, als das ursprüngliche Vokabular zu erraten.
Schreib keine langen Anfragen. Sehr lange Anfragen werden zu einem Mittelwert aus mehreren Themen eingebettet und passen zu nichts richtig.
Kombiniere Suche und Filter. Grenzt du vor der Suche auf einen Tag ein, wird aus einer breiten Anfrage eine präzise, und das gilt für beide Zweige.
Findest du die Notiz, aber nicht die Stelle, öffne sie und sieh unter „Ähnliche Notizen“ nach. Über dieses Panel findest du oft die anderen drei Notizen zum Thema.
Was es nicht gibt
Damit du es nicht auf die harte Tour herausfinden musst:
Keine unscharfe oder tippfehlertolerante Stichwortsuche. Vertippst du dich, schweigt der Stichwort-Zweig.
Keine Suchoperatoren: keine Phrasen in Anführungszeichen, kein
AND/OR, keine Syntax für einzelne Felder.Kein Relevanz-Ranking über beide Zweige hinweg, wie oben beschrieben.
Keine gespeicherten Suchen. Filter stehen in der URL und lassen sich als Lesezeichen speichern, aber benannte Ansichten gibt es nicht.
Nichts davon ist ein Geheimnis, und nichts davon ist der Grund, warum deine Notiz schwer zu finden ist. Der Grund ist fast immer der vom Anfang: Du hast nach den Wörtern gesucht und die Idee aufgeschrieben.
Zwei Suchen, vereinigt, lösen genau dieses Problem. Das ist keine Magie. Es ist nur die Einsicht, dass sich Menschen an ihre eigenen Texte nach Bedeutung erinnern und eine LIKE-Abfrage nicht.
Weiterlesen
Links, die eine Umbenennung überstehen – warum Notez einen Notiz-Link als ID der Zielnotiz speichert, sodass eine Umbenennung keinen einzigen Link auf die Notiz kaputt macht.
Zwei Assistenten, dieselben Tools – wie der KI-Chat und der MCP-Server auf sechzehn und zehn Tools auseinanderdrifteten und welcher Fehler im Notizbaum beim Angleichen auftauchte.
Notez: eine Notizen-App für Entwickler – was Notez ist, auf welchen Wegen eine Notiz hineinkommt und was jeder Plan enthält.