Engine für strukturierte Ähnlichkeit & Anomalie-Erkennung
Laden Sie Ihren Katalog — Produkte, Transaktionen, Sensordaten — als normale Datensätze. Sie erhalten ähnliche Datensätze und statistische Ausreißer zurück, direkt auf Ihren numerischen Rohfeldern. Keine Vektoren. Keine Modelle. Keine Pipeline.
Was es ist
Pop-Search ist eine Engine für strukturierte Ähnlichkeit & Anomalie-Erkennung. Sie laden Ihre Daten als gewöhnliche Datensätze — und Pop-Search findet Datensätze, die einem gegebenen ähnlich sind, und solche, die statistisch nicht dazu passen. Und das mit den Feldern, die Sie bereits haben.
Die Idee in einem Satz: Suche ohne Vektoren. Eine Vektordatenbank verlangt, dass Sie ein Embedding-Modell trainieren, jeden Datensatz durchtreiben und eine Blackbox akzeptieren. Pop-Search überspringt das alles. Ihre numerischen Felder tragen bereits Bedeutung — Preis, Bewertung, Latenz, Temperatur — also arbeitet Pop-Search direkt darauf.
Jedes Ähnlichkeits-Ergebnis kommt mit einem Score, den Sie lesen können, und einem Grund, den Sie erklären können — wichtig, wenn die Antwort einer Preiskontrolle, einer Fraud-Warteschlange oder einem Wartungsticket standhalten muss.
So funktioniert's
Sie laden Ihre Daten. Pop-Search indiziert Ihre numerischen Felder, sodass Ähnlichkeit, Bereichsfilterung und Anomalie-Erkennung schnell laufen — selbst auf einem kleinen 2-Core-/4 GB-Server.
Datensätze als JSON oder CSV-Batch laden. Definieren Sie, welche Felder numerisch und welche kategorial sind.
Pop-Search indiziert Ihre numerischen Felder für schnelle Ähnlichkeits-, Bereichs- und Anomalie-Abfragen.
Suchen mit Bereichen + Filtern, ähnliche Datensätze finden und Ausreißer erkennen — über HTTP, mit interpretierbaren Ergebnissen.
Die Interna können wir noch nicht teilen. Kurzversion: deterministisch, interpretierbar und ohne Vektoren — und gebaut, um auch auf bescheidener Hardware schnell zu bleiben. Dies ist eine Beta, offen für öffentliche Tests des Algorithmus. Was Sie hier sehen, ist, was wir heute zeigen können; die Details folgen.
Was Sie bekommen
Die nächsten Datensätze nach Feld-Nähe, jeweils mit interpretierbarem 0–1-Score.
Statistische Ausreißer pro numerischem Feld, mit z-Score, den Sie schwellen und erklären können.
Numerische Bereiche + kategoriale Gleichheit, kombiniert mit UND / ODER / muss-nicht.
Gruppieren Sie Ihre Treffer nach beliebigem Feld, um die Form des Ergebnis-Satzes zu sehen.
Menschenlesbare Labels für Ihre numerischen Felder anhängen und danach abfragen.
Isolierte Sammlungen pro API-Key. Ein Server, viele Kunden.
Ein statisches Binary. Lokale Datei-Persistenz. Keine externe Datenbank, kein Cluster.
CSV-Batch (optional gzip) oder Streaming-JSON. Aktualisieren, löschen, kompaktieren.
Warum es anders ist
Die Tools, zu denen man heute greift, wurden für einen anderen Job gebaut.
| Vektordatenbank (Qdrant / Milvus) | Suchmaschine (Elastic / Meili) | Postgres / SQL | Pop-Search | |
|---|---|---|---|---|
| Braucht Embeddings? | Ja | pgvector: ja | pgvector: ja | Nein |
| Braucht Modell / GPU | Ja | Optional | Optional | Nein |
| Ähnlichkeit numerischer Felder | Via Vektoren | Nein | Handgeschriebene SQL | Nativ |
| Anomalie-/Ausreißer-Erkennung | Nein | Nein | Handgemacht | Nativ |
| Interpretierbare Ergebnisse | Blackbox | Text-Relevanz | Sie definieren | Ja |
| Läuft auf 2-Core / 4 GB | Schwer | Ja | Ja | Ja |
Hardware
Die gesamte Engine ist ein statisches Binary mit lokaler Datei-Persistenz. Es läuft bequem auf einem kleinen VPS — der Art Box, die ein Dutzend kleine Services hostet — ohne JVM, ohne Cluster, ohne externe Datenbank und ohne GPU.
Das ist der komplette Footprint — und es ist noch Platz für den Rest des Stacks.
Schnellstart
Die Base-URL ist der Host, der diese Seite ausliefert (die API liefert ihre eigene Doku aus,
daher sind Playground und API derselbe Origin). Bei aktivierter Authentifizierung senden Sie Ihren Key
im X-Pop-Api-Key-Header.
1. Sammlung erstellen — Felder deklarieren.
curl -s $BASE/collections -H 'Content-Type: application/json' -d '{
"name": "products",
"fields": {
"price": { "type": "numeric", "min": 0.99, "max": 10000, "bins": 20, "log": true },
"rating": { "type": "numeric", "min": 0, "max": 5, "bins": 16 },
"category": { "type": "categorical", "levels": ["electronics","furniture","outdoor","kitchen"] }
}
}'
2. Datensätze importieren (JSON-Array, oder POST /collections/products/ingest/csv für Batch).
curl -s $BASE/collections/products/records -H 'Content-Type: application/json' -d '[
{ "id": "e1", "price": 249.99, "rating": 4.6, "category": "electronics" },
{ "id": "e2", "price": 89.99, "rating": 4.2, "category": "electronics" }
]'
3. Suchen — numerischer Bereich + kategorialer Filter, verknüpft mit UND.
curl -s $BASE/collections/products/search -H 'Content-Type: application/json' -d '{
"must": [ { "field": "price", "gte": 50, "lte": 500 }, { "field": "category", "eq": "electronics" } ],
"limit": 20, "with_values": true
}'
4. Ähnliche finden — die nächsten Datensätze zu einem gegebenen.
curl -s $BASE/collections/products/similar -H 'Content-Type: application/json' -d '{
"record": { "price": 249.99, "rating": 4.6, "category": "electronics" },
"k": 10, "with_values": true
}'
5. Anomalien erkennen — statistische Ausreißer auf einem Feld.
curl -s $BASE/collections/products/anomalies -H 'Content-Type: application/json' -d '{
"field": "price", "z": 2.5, "limit": 50
}'
Live-Playground
Kein Konto, kein Setup. Der Button unten lädt einen Katalog mit 45 Produkten in diesen Server
(Sammlung demo), und Sie fragen ihn live ab. Es ist exakt die API aus der Doku — der Playground
ruft sie nur aus Ihrem Browser auf.
Wählen Sie ein Produkt; wir geben seine nächsten Nachbarn nach Feld-Nähe zurück (interpretierbarer Score).
Statistische Anomalien auf dem price-Feld. Drei Produkte sind absichtlich falsch bepreist — können Sie alle drei finden? Senken Sie die z-Schwelle, um das Netz zu verbreitern.
Numerischer Bereich + kategorialer Filter, verknüpft mit UND — die Kern-„Bereich + UND/ODER“-Abfrage.
API-Referenz
JSON rein, JSON raus. Alle Abfrage-Endpunkte nehmen einen JSON-Body. Fehler geben ein JSON
{ "error": "..." } mit passendem HTTP-Status zurück.
| Methode | Endpunkt | Was es macht |
|---|---|---|
| POST | /collections | Sammlung aus einer Feld-Spec erstellen |
| GET | /collections | Sammlungen des Aufrufers auflisten |
| GET | /collections/{name} | Sammlungs-Statistiken (Datensatzanzahl, bins pro Feld) |
| DEL | /collections/{name} | Sammlung löschen |
| POST | /collections/{name}/records | JSON-Array von Datensätzen importieren |
| GET | /collections/{name}/records/{id} | Einen Datensatz per ID abrufen |
| PATCH | /collections/{name}/records/{id} | Felder eines Datensatzes aktualisieren |
| DEL | /collections/{name}/records/{id} | Einen Datensatz löschen |
| POST | /collections/{name}/ingest/csv | CSV-Batch-Import (plain oder gzip) |
| POST | /collections/{name}/search | Bereichs- + UND/ODER/muss-nicht-Abfrage, Facetten, Sortierung |
| POST | /collections/{name}/similar | Nächste Datensätze zu einem gegebenen (mit Score) |
| POST | /collections/{name}/anomalies | Statistische Ausreißer auf einem numerischen Feld |
| PUT | /collections/{name}/labels | Menschenlesbare Labels für die Bereiche eines numerischen Feldes setzen |
| GET | /collections/{name}/labels | Feld-Labels abrufen |
| DEL | /collections/{name}/labels | Feld-Labels entfernen |
| POST | /collections/{name}/relearn | Feld-Statistiken nach Datenverschiebung neu aufbauen |
| POST | /collections/{name}/compact | Platz gelöschter Datensätze zurückgewinnen |
| GET | /health · /status · /metrics | Betriebs-Endpunkte |
Abfrage-Bedingungen unterstützen gte / lte (numerischer Bereich),
eq / neq / in (exakt oder Menge), label (Feld-Label), anomaly
(z-Schwelle) und exists (optionale Felder). Kombinieren mit must (UND), any (ODER),
must_not (ausschließen).