Die Percolator Query: umgekehrte Suche in Elasticsearch implementieren
AI generated
_doc
_index
Elasticsearch · Percolator
Die Percolator Query: umgekehrte Suche implementieren
gespeicherte Suchanfragen gegen neue Dokumente prüfen

Die klassische Suche nimmt eine Suchanfrage entgegen und findet passende Dokumente in einem Index. Manche Anwendungsfälle brauchen jedoch genau die umgekehrte Richtung: Ein neues Dokument trifft ein, und die Anwendung muss herausfinden, welche von vielen gespeicherten Suchanfragen darauf zutreffen würden. Ein typisches Beispiel ist ein Preisalarm, bei dem tausende Kunden individuelle Suchkriterien hinterlegt haben und benachrichtigt werden sollen, sobald ein neues Produkt genau diese Kriterien erfüllt. Elasticsearch bietet dafür die Percolator Query, die gespeicherte Suchanfragen als eigene Dokumente indexiert und bei jedem neuen Produkt effizient prüft, welche davon zutreffen. Wie das funktioniert, wie sich der Anwendungsfall Preisalarm konkret umsetzen lässt und wo bei sehr vielen gespeicherten Queries die Performance-Grenzen liegen, zeigt dieser Artikel.

12 Min. Lesezeit Percolator · Percolate Query Umgekehrte Suche · Alerting

1. Grundprinzip: Suchanfragen als Dokumente, Dokumente als Anfragen

Bei einer klassischen Suche liegt eine feste Menge an Dokumenten im Index, und eine Suchanfrage wird gegen diese Menge ausgewertet, um die relevantesten Treffer zu finden. Der Percolator dreht dieses Verhältnis um: Statt Dokumente gegen eine Anfrage zu prüfen, werden Suchanfragen selbst als Dokumente in einem Index gespeichert, und ein neu eintreffendes Dokument wird gegen alle gespeicherten Anfragen geprüft. Das Ergebnis ist keine sortierte Trefferliste von Produkten, sondern eine Liste von gespeicherten Anfragen, die auf das eine neue Dokument zutreffen würden.

Diese Umkehrung ist immer dann sinnvoll, wenn die Anzahl der Suchkriterien deutlich größer ist als die Anzahl der neu eintreffenden Dokumente pro Zeiteinheit, etwa bei Preisalarmen, Sättigungsbenachrichtigungen für Lagerbestände oder Content-Moderation-Regeln, die auf jeden neuen Beitrag angewendet werden müssen. Eine naive Implementierung würde bei jedem neuen Dokument alle gespeicherten Kriterien einzeln in der Anwendung durchgehen, was bei vielen tausend Kriterien schnell zu einem Flaschenhals wird.

2. Der percolator-Feldtyp und wie gespeicherte Queries indexiert werden

Um Percolate Queries zu nutzen, benötigt der Index ein Feld vom Typ percolator, in dem die eigentliche Query-DSL-Definition als Wert gespeichert wird. Elasticsearch analysiert diese gespeicherte Query beim Indexieren und extrahiert daraus effizient durchsuchbare Merkmale, sodass beim späteren Percolieren nicht jede gespeicherte Query naiv einzeln ausgewertet werden muss, sondern zunächst eine Vorauswahl möglicher Kandidaten über einen internen Index stattfindet.

Neben dem percolator-Feld selbst müssen alle Felder, auf die sich die gespeicherten Queries beziehen könnten, im selben Index oder in einem Index mit kompatiblem Mapping vorhanden sein, damit Elasticsearch die Query-Struktur korrekt gegen ankommende Dokumente auswerten kann. In der Praxis legt man dafür häufig einen dedizierten Index mit zwei logischen Dokumenttypen an: gespeicherte Kundenkriterien einerseits und ein Beispiel-Mapping der Produktfelder andererseits.


PUT /preisalarme
{
  "mappings": {
    "properties": {
      "query": { "type": "percolator" },
      "kategorie": { "type": "keyword" },
      "preis": { "type": "float" },
      "marke": { "type": "keyword" }
    }
  }
}

PUT /preisalarme/_doc/kunde_4711
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "kategorie": "werkzeuge" } },
        { "range": { "preis": { "lte": 49.90 } } }
      ]
    }
  }
}

3. Eine Percolate Query gegen ein neues Dokument ausführen

Trifft ein neues Produkt ein, wird es nicht in den Index für gespeicherte Anfragen geschrieben, sondern als Bestandteil einer percolate-Query an Elasticsearch übergeben. Die Antwort enthält die IDs aller gespeicherten Anfragen, deren Kriterien das übergebene Dokument erfüllen. Diese IDs kann die Anwendung anschließend nutzen, um zum Beispiel die hinterlegte Kunden-ID zu ermitteln und eine Benachrichtigung auszulösen.

Wichtig ist, dass die Percolate Query kein neues Dokument dauerhaft speichert, sondern es nur temporär für die Dauer der Anfrage gegen die gespeicherten Queries hält. Das eigentliche Speichern des neuen Produkts im regulären Produktindex bleibt ein separater, unabhängiger Vorgang.


GET /preisalarme/_search
{
  "query": {
    "percolate": {
      "field": "query",
      "document": {
        "kategorie": "werkzeuge",
        "preis": 39.90,
        "marke": "ProTools"
      }
    }
  }
}
// Antwort liefert kunde_4711 als Treffer, da Kategorie und Preis passen

4. Anwendungsfall: Preisalarme und Sättigungsbenachrichtigungen umsetzen

Für Preisalarme legt jeder Kunde beim Anlegen seiner Benachrichtigung ein Dokument im Percolator-Index an, das seine individuellen Kriterien als Query-DSL abbildet, etwa gewünschte Kategorie, maximaler Preis und optional bevorzugte Marken. Beim Import neuer Produkte oder bei Preisänderungen bestehender Produkte wird jedes betroffene Produktdokument einmal gegen den Percolator-Index geprüft. Jeder Treffer entspricht einem Kunden, der über das neue oder geänderte Angebot informiert werden soll.

Das gleiche Muster funktioniert für Sättigungsbenachrichtigungen bei Lagerbeständen: Ein Vertriebsmitarbeiter hinterlegt eine Regel wie Lagerbestand einer bestimmten Kategorie unterschreitet einen Schwellenwert, und jede eingehende Bestandsänderung wird als Dokument gegen diese gespeicherten Regeln percoliert. So entsteht ein flexibles Alerting-System, ohne dass für jede Regel eigener Anwendungscode geschrieben werden muss, da die gesamte Bedingungslogik in Query-DSL formuliert und zentral verwaltet wird.

5. Mehrere Dokumente gleichzeitig percolieren

Statt für jedes neue Produkt einzeln eine Percolate Query abzusetzen, unterstützt Elasticsearch das Percolieren mehrerer Dokumente in einer einzigen Anfrage über das Array documents. Das reduziert den Netzwerk-Overhead deutlich, wenn zum Beispiel ein Import-Batch mit mehreren hundert neuen Produkten auf einmal gegen alle gespeicherten Preisalarme geprüft werden soll, statt für jedes einzelne Produkt eine eigene Anfrage über das Netzwerk zu schicken.

Die Antwort ordnet jeden Treffer über ein internes Feld dem jeweiligen ursprünglichen Dokument zu, sodass die Anwendung nach einer einzigen Batch-Anfrage genau weiß, welches Produkt welche gespeicherten Kriterien erfüllt hat. Für regelmäßige Batch-Importe, wie sie bei Produktfeeds üblich sind, ist dieser Ansatz einer Schleife mit einzelnen Anfragen praktisch immer vorzuziehen.

6. Performance-Grenzen bei sehr vielen gespeicherten Queries

Der Percolator skaliert gut mit der Anzahl neu eintreffender Dokumente, da die interne Vorauswahl über extrahierte Query-Merkmale die Zahl der tatsächlich vollständig ausgewerteten Kandidaten-Queries deutlich reduziert. Bei einer sehr großen Zahl gespeicherter Queries, etwa mehreren Millionen individueller Kundenkriterien, wächst dennoch der Aufwand für diese Vorauswahl selbst, und die Latenz einer einzelnen Percolate-Anfrage steigt spürbar an.

Besonders kritisch werden sehr generische gespeicherte Queries, die kaum extrahierbare Merkmale liefern, etwa eine Query ohne konkrete Term-Filter, sondern nur mit Bereichsbedingungen auf einem stark schwankenden Feld. Solche Queries lassen sich intern kaum vorfiltern und müssen häufiger vollständig ausgewertet werden. In der Praxis empfiehlt es sich deshalb, den Percolator-Index nach Kategorien oder Regionen zu partitionieren und nur den jeweils relevanten Teilindex zu percolieren, statt bei jedem neuen Dokument grundsätzlich alle gespeicherten Queries zu prüfen.

7. Wartung: Aktualisieren und Bereinigen gespeicherter Suchanfragen

Gespeicherte Percolate Queries verhalten sich wie normale Dokumente und lassen sich entsprechend über die Update-API ändern oder löschen, etwa wenn ein Kunde seinen Preisalarm anpasst oder deaktiviert. Da jede gespeicherte Query im internen Vorauswahl-Index Platz beansprucht, lohnt sich eine regelmäßige Bereinigung abgelaufener oder inaktiver Kriterien, insbesondere bei zeitlich befristeten Aktionen wie einem saisonalen Preisalarm.

Für Alarme mit fester Gültigkeitsdauer bietet sich eine Kombination mit Index-Lifecycle-Management oder einem einfachen TTL-Feld an, das per geplantem Job abgelaufene Dokumente aus dem Percolator-Index entfernt. Ohne diese Pflege wächst der Index dauerhaft, was sich unmittelbar auf die Latenz jeder einzelnen Percolate-Anfrage auswirkt.

8. Abgrenzung zu Alternativen: Watcher und externe Regel-Engines

Der Percolator eignet sich für den konkreten Abgleich eines einzelnen neuen Dokuments gegen viele gespeicherte Kriterien, ist aber kein vollständiges Alerting-Framework mit Zeitplanung, Benachrichtigungskanälen oder Eskalationslogik. Für periodische Prüfungen über einen ganzen Datenbestand hinweg, etwa eine tägliche Zusammenfassung aller Preisänderungen, ist eher Watcher oder eine externe Scheduler-Lösung geeignet, die den Percolator lediglich als einen Baustein innerhalb einer größeren Pipeline nutzt.

Gegenüber einer komplett eigenen Regel-Engine in der Anwendung bietet der Percolator den Vorteil, dass die komplette Match-Logik in der bewährten Elasticsearch-Query-DSL formuliert wird und von derselben Infrastruktur profitiert, die ohnehin für die reguläre Produktsuche betrieben wird. Für sehr komplexe, mehrstufige Regelwerke mit Zustandsverwaltung zwischen mehreren Ereignissen stößt der Percolator dagegen an konzeptionelle Grenzen, da er grundsätzlich zustandslos jeweils ein einzelnes Dokument gegen gespeicherte Queries prüft.

9. Einführung in der Praxis: eine kurze Checkliste

Vor dem produktiven Einsatz lohnt sich ein Testlauf mit realistischer Anzahl gespeicherter Queries und realistischem Dokumentvolumen, um die tatsächliche Latenz unter Last zu messen, statt sich auf Annahmen zu verlassen. Ebenso wichtig ist ein klares Monitoring der Percolator-Indexgröße, damit ein unkontrolliertes Wachstum gespeicherter, aber längst irrelevanter Queries frühzeitig auffällt.

Wer den Percolator gezielt für einen klar abgegrenzten Anwendungsfall wie Preisalarme einsetzt, regelmäßig abgelaufene Queries bereinigt und bei Bedarf nach Kategorie oder Region partitioniert, erhält ein robustes und gut wartbares Alerting-System, das ohne zusätzliche externe Komponenten auskommt und direkt auf der bereits vorhandenen Elasticsearch-Infrastruktur aufsetzt.

Aspekt Klassische Suche Percolator Praxisrelevanz
Richtung Anfrage gegen viele Dokumente Ein Dokument gegen viele Anfragen Percolator für Alerting statt Produktsuche
Speicherort der Kriterien Nicht gespeichert, ad hoc Als percolator-Feld indexiert Gespeicherte Queries wie normale Dokumente pflegbar
Batch-Fähigkeit Eine Anfrage pro Suche documents-Array für mehrere Dokumente Batch reduziert Netzwerk-Overhead bei Importen
Skalierungsgrenze Wächst mit Indexgröße Wächst mit Anzahl gespeicherter Queries Partitionierung bei Millionen Queries sinnvoll
Typischer Anwendungsfall Produktsuche, Filterung Preisalarme, Content-Moderation Umgekehrte Suche nur bei passendem Muster einsetzen

Mironsoft

Suchindex-Setup, Relevanz-Tuning und Magento-Suche

Magento-Suche, die die falschen Produkte zuerst zeigt?

Wir richten Elasticsearch oder OpenSearch für Magento sauber ein, tunen Relevanz und Facetten auf das tatsächliche Sortiment und optimieren Indexierungsprozesse für große Kataloge.

Relevanz-Tuning

Suchergebnisse und Facetten auf die tatsächlichen Kundenbedürfnisse abstimmen.

Such-Migration

Umstieg von Solr oder MySQL-Suche auf Elasticsearch/OpenSearch sauber begleiten.

Index-Performance

Indexierungsprozesse für große Kataloge zuverlässig und performant gestalten.

10. Zusammenfassung

Percolator Query: Das Wichtigste auf einen Blick

Grundprinzip

Der Percolator dreht die Suchlogik um: gespeicherte Suchanfragen werden als Dokumente indexiert und gegen ein neu eintreffendes Dokument geprüft.

Technische Basis

Ein percolator-Feld im Mapping speichert die Query-DSL, Elasticsearch extrahiert daraus Merkmale für eine effiziente interne Vorauswahl.

Anwendungsfall

Preisalarme und Sättigungsbenachrichtigungen lassen sich ohne eigenen Regel-Engine-Code direkt über gespeicherte Percolate Queries abbilden.

Grenzen

Bei sehr vielen gespeicherten Queries steigt die Latenz, weshalb Partitionierung nach Kategorie oder Region und regelmäßige Bereinigung wichtig sind.

11. FAQ: Percolator Query: Das Wichtigste auf einen Blick

1Was macht die Percolator Query in Elasticsearch anders als eine normale Suche?
Sie dreht die Richtung um: statt eine Anfrage gegen viele gespeicherte Dokumente zu prüfen, wird ein einzelnes neues Dokument gegen viele gespeicherte Suchanfragen geprüft.
2Welcher Feldtyp ist für Percolate Queries erforderlich?
Ein Feld vom Typ percolator im Mapping, in dem die eigentliche Query-DSL-Definition als Wert gespeichert wird.
3Wie wird eine Percolate Query gegen ein neues Dokument ausgeführt?
Über eine percolate-Query mit dem betroffenen Feldnamen und dem neuen Dokument als Parameter, die Antwort liefert die IDs aller gespeicherten Anfragen, die zutreffen.
4Für welchen typischen Anwendungsfall eignet sich der Percolator?
Für Preisalarme, Sättigungsbenachrichtigungen bei Lagerbeständen oder Content-Moderation-Regeln, bei denen viele gespeicherte Kriterien gegen jedes neue Dokument geprüft werden müssen.
5Können mehrere Dokumente gleichzeitig percoliert werden?
Ja, über das documents-Array in einer einzigen Anfrage, was den Netzwerk-Overhead bei Batch-Importen deutlich reduziert.
6Was passiert mit dem neuen Dokument bei der Percolate Query selbst?
Es wird nicht dauerhaft gespeichert, sondern nur temporär für die Dauer der Anfrage gegen die gespeicherten Queries gehalten.
7Warum steigt die Latenz bei sehr vielen gespeicherten Queries?
Weil der Aufwand für die interne Vorauswahl über extrahierte Query-Merkmale mit der Anzahl gespeicherter Queries wächst, besonders bei sehr generischen Queries mit wenigen extrahierbaren Merkmalen.
8Wie sollte man den Percolator-Index bei sehr vielen Kunden strukturieren?
Eine Partitionierung nach Kategorie oder Region hilft, nur den jeweils relevanten Teilindex zu percolieren statt grundsätzlich alle gespeicherten Queries zu prüfen.
9Muss man abgelaufene Percolate Queries manuell entfernen?
Ja, regelmäßige Bereinigung ist empfehlenswert, etwa über Index-Lifecycle-Management oder ein TTL-Feld, da sonst der Index unkontrolliert wächst und die Latenz steigt.
10Ersetzt der Percolator ein vollständiges Alerting-Framework wie Watcher?
Nein, der Percolator prüft nur den konkreten Abgleich eines Dokuments gegen gespeicherte Kriterien. Zeitplanung, Benachrichtigungskanäle und Eskalation übernimmt typischerweise Watcher oder eine externe Lösung.