<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Operativer Betrieb - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Operativer Betrieb - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/de/search-labs/blog/category/operations</link>
    </image>
    <link>https://www.elastic.co/de/search-labs/blog/category/operations</link>
    <atom:link href="https://www.elastic.co/de/search-labs/rss/category/operations.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[de]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 17:22:45 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Agentische KI-Suche mit deterministischen Leitplanken in Elasticsearch zur sicheren Ausführung von Abfragen]]></title>
    <description><![CDATA[Agentische KI-Suchsysteme versagen häufig, wenn LLMs Abfragen direkt generieren. Erfahren Sie, wie deterministische Leitplanken und eine Steuerungsebenenarchitektur eine sichere, zuverlässige und kontrollierte Abfrageausführung mit Elasticsearch ermöglichen.]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/search-labs/blog/agentic-ai-search-deterministic-guardrail-query-execution">Teile 1 bis 7</a> dieser Serie beschrieben eine gesteuerte Steuerungsebene für E-Commerce-Suchen. Ein Nutzer tippt eine Abfrage ein. Die Steuerungsebene klassifiziert die Absicht, setzt geschäftliche Einschränkungen durch, löst Vorgabenkonflikte und leitet zur entsprechenden Abrufstrategie weiter, und das alles, bevor der Produktkatalog überhaupt abgefragt wird. Die gesamte Architektur geht davon aus, dass die Eingabe eine von einem menschlichen Käufer eingegebene Suchzeichenfolge ist.</p><p>Dieser letzte Beitrag fragt: Was ändert sich, wenn die Eingabe stattdessen von einem KI-Agenten kommt?</p><p>Die Antwort ist, dass sich die Architektur nicht ändert, aber die Einsätze schon. Jede Eigenschaft der beherrschten Kontrollebene, die für von Menschen verfasste Abfragen von Bedeutung ist, ist <em>umso wichtiger</em>, wenn der vorgelagerte Entscheidungsträger ein großes Sprachmodell (LLM) ist. Determinismus, Überprüfbarkeit, Konfliktlösung und Zwangsdurchsetzung werden zu kritischen Leitplanken anstatt zu betrieblichen Annehmlichkeiten, da das System, das die Eingabe produziert, von Natur aus probabilistisch ist.</p><h2>Das agentische Suchproblem</h2><p>Der gängigste Ansatz für KI-gesteuerte Suche ist unkompliziert: Man gibt dem LLM das Datenbankschema, stellt Geschäftsregeln in der Eingabeaufforderung bereit und lässt den Agenten die Abfrage direkt generieren.</p><p>Für einen E-Commerce-Chatbot bedeutet dies, die Elasticsearch-Index-Mapping, Feldtypen, Kategorietaxonomien, Preislogik und Geschäftsbeschränkungen in das Kontextfenster des Agenten zu injizieren und dann das LLM zu bitten, natürliche Sprache in gültige Elasticsearch Query DSL zu übersetzen. Das LLM wird zum Abfrageautor.</p><p>Dieser Ansatz funktioniert in Demos. Es scheitert aus vier Gründen in der Produktion.</p><h3>Kontextaufblähung</h3><p>Ein Enterprise-E-Commerce-Index-Mapping ist kein triviales Dokument. Felddefinitionen, verschachtelte Objekte, Mehrfeldkonfigurationen und Analysatoreinstellungen können auf Tausende von Token ausgeführt werden, bevor Geschäftslogik hinzugefügt wird. Zusätzlich zum Mapping benötigt der Agent Kategorientaxonomien (die im Enterprise-E-Commerce Zehntausende von Werten enthalten können), Preisregeln, Markenhierarchien, Zulassungsbeschränkungen und Kampagnenlogik.</p><p>Das Ergebnis ist ein Kontextfenster, das von strukturellen Metadaten dominiert wird, anstatt von der eigentlichen Absicht des Nutzers. Dies erhöht die Latenzzeit, steigert die Token-Kosten und verschlechtert die Fähigkeit des LLM, Anweisungen zu befolgen, wenn der Kontext wächst. Dies ist ein gut dokumentiertes Phänomen, das manchmal als <a href="https://www.trychroma.com/research/context-rot"><em>Kontextverfall</em></a> bezeichnet wird: Je länger der Prompt wird, desto schwächer wird die Aufmerksamkeit des Modells für eine bestimmte Anweisung.</p><h3>Probabilistische Halluzination</h3><p>LLMs generieren Abfragen basierend auf Mustern in ihren Trainingsdaten und dem bereitgestellten Kontext. Wenn das Modell aufgefordert wird, Elasticsearch Query DSL zu generieren, kann es Feldnamen erzeugen, die nicht existieren, syntaktisch ungültige Abfrageklauseln erstellen, Filtertypen auf die falschen Feldtypen anwenden oder Abfragen erzeugen, die zwar syntaktisch gültig, aber semantisch falsch sind und Ergebnisse liefern, die nicht der Absicht des Nutzers entsprechen.</p><p>Der <a href="https://cloud.google.com/blog/products/databases/how-to-get-gemini-to-deeply-understand-your-database">BIRD-Benchmark für Text-to-SQL</a> von Google Cloud veranschaulicht die Grenzen dieses Ansatzes. Googles hochmodernes Single-Model-Ergebnis erreichte eine Genauigkeit zwischen 70 % und 80 %, was bedeutet, dass fast jede vierte generierte Abfrage falsch war. Dies gilt für SQL, das weitaus stärker standardisiert ist als die Elasticsearch Query DSL. Die Fehlerquote für LLM-generierte Elasticsearch-Abfragen in einer echten Produktionsumgebung mit komplexen Mappings und geschäftsspezifischer Semantik wäre wahrscheinlich höher.</p><p>Bei einem umsatzkritischen E-Commerce-System ist eine Fehlerrate von einem Viertel der Abfragen kein Optimierungsproblem, das iterativ gelöst werden kann. Es ist eine architektonische Einschränkung des Ansatzes.</p><h3>Die Sicherheitslücke</h3><p>Wenn das LLM Zugriff auf das Datenbankschema hat und als Abfrageautor fungiert, ist das System anfällig für indirekte Prompt-Injektion. Ein Nutzer, der mit einem E-Commerce-Chatbot interagiert, kann Eingaben erstellen, um den Agenten so zu manipulieren, dass er unbeabsichtigte Abfragen generiert.</p><p>Dies ist kein theoretisches Risiko. <a href="https://www.elastic.co/blog/owasp-top-10-for-llms-guide">Prompt-Injektion</a> ist eine der am aktivsten erforschten Angriffsflächen in eingesetzten LLM-Systemen. Das grundlegende Problem ist, dass es beim Erstellen der Abfrage durch den Agent keine strukturelle Grenze zwischen Nutzerintention und Abfrageausführung gibt. Das LLM interpretiert gleichzeitig die Nutzerabfrage und erstellt die Datenbankoperation. Jede Manipulation der ersten wirkt sich direkt auf die zweite aus.</p><h3>Fehler beim Skalieren mit hoher Kardinalität</h3><p>Bestimmte E-Commerce-Felder haben extreme Kardinalität. Ein Produktkatalog kann 17.000 Kategoriewerte, Tausende von Markennamen und Hunderte von Attributkombinationen enthalten. Standardmäßige agentische Workflows erfordern, diese Werte in den Kontext einzufügen, damit das LLM beim Erstellen einer Abfrage den richtigen auswählen kann.</p><p>Dies führt zu einem unmöglichen Kompromiss: Entweder werden alle möglichen Werte eingefügt (was enorm viel Kontext verbraucht und die Leistung mindert), es wird nur eine Teilmenge eingefügt (und man muss in Kauf nehmen, dass der Agent nicht auf Werte außerhalb dieser Teilmenge zugreifen kann), oder es wird auf eine unkontrollierte Suche zurückgegriffen. Dies knüpft direkt an das Kernproblem aus <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-improve-retrieval">Teil 1</a> an: Wenn das LLM nach „Orangen“ sucht und Elasticsearch Orangenlimonade zurückgibt, verschlechtert sich das Chat-Erlebnis auf die gleiche Weise wie das Sucherlebnis. Das Fehlen von Governance bedeutet, dass das System die beabsichtigte Lösung des Käufers nicht durchsetzen kann.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt14a980ba09d88ee8/6a16f34d66c4f98516f8bd97/f11c44feb5291002d4ec4ac79484ea39d4e48a95-642x133.png" alt="Ein Flussdiagramm zeigt eine Nutzerabfrage „Ich möchte ein erfrischendes Getränk zubereiten …“, die zu einem LLM-Ausgang von „Orangen“ führt, woraufhin ein Anwendungsserver eine Textabfrage nach Orangen an einen Produktkatalog sendet, die schließlich Ergebnisse für Marmelade, ganze Orangen und Orangenlimonade liefert." /><p>Das dynamische Abrufen relevanter Werte auf der Grundlage der Abfrage ist eine bekannte Alternative, die jedoch einen zusätzlichen, nicht-deterministischen Schritt einführt, bei dem die Abfrage selbst relevante Werte verfehlen kann. Zusätzlich erhöht dies die Latenz und Komplexität jeder Abfrage.</p><h2>Die architektonische Alternative: Entkopplung von Absicht und Ausführung</h2><p>Die in den Teilen 1 bis 7 beschriebene gesteuerte Kontrollebene bietet einen grundlegend anderen Ansatz. Anstatt dass das LLM die endgültige Abfrage erstellt, wird die Rolle des LLM auf eine einzige, klar abgegrenzte Aufgabe reduziert: das Extrahieren einer Suchabsichts-Zeichenfolge aus der natürlichen Spracheingabe des Nutzers.</p><p>Der Nutzer sagt: „Ich suche günstige braune Schuhe.“ Die Aufgabe des Agenten besteht nicht darin, eine Elasticsearch-Abfrage zu generieren. Er soll die Suchabsicht (in diesem Fall etwa „billige braune Schuhe“) extrahieren und an die Steuerungsebene weiterleiten. Die Steuerebene tut dann das, was sie immer getan hat: Sie perkoliert die Absichtszeichenkette gegen gespeicherte Richtlinien, erstellt passende Richtlinien durch kaskadierende Transformationen, löst Konflikte deterministisch und erzeugt eine gesteuerte Elasticsearch-Abfrage.</p><p>Das LLM sieht das Index-Mapping nie. Es weiß nie etwas über Feldtypen, Kategorientaxonomien oder Preisschwellenwerte. Es konstruiert niemals eine Abfrageklausel. Es läuft auf der natürlichen Sprachseite einer architektonischen Grenze, die wir als <em>Metadaten-Luftlücke</em> bezeichnen, eine strikte Trennung zwischen der probabilistischen Komponente (dem LLM) und der strukturierten Datenschicht (Schema, Richtlinien und Abfragekonstruktion).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb4d701bfa4f2f279/6a16f34e1949f70ddce7a78d/12dacc77f0c481c9ada84725eff370c7e2c4b429-642x143.png" alt="Ein Flussdiagramm zeigt eine Nutzerabfrage „Ich möchte ein erfrischendes Getränk zubereiten …“, die zu einer LLM-Ausgabe von „Orangen“ führt. Daraufhin sendet ein Anwendungsserver die Abfrage an eine Steuerungsebene und empfängt eine umgeschriebene Abfrage, mit der eine Textabfrage nach Orangen in der Kategorie „Früchte“ durchgeführt wird. Abschließend erfolgt eine Produktsuche, die Bilder von Orangen zurückgibt." /><h3>Was der Metadaten-Air-Gap bietet</h3><ul><li><p><strong>Schemablindheit.</strong> Das LLM hat keinen Zugriff auf das Datenbankschema und kann daher weder ungültige Abfragen generieren, Feldnamen erfinden noch so manipuliert werden, dass strukturelle Informationen offengelegt werden. Das Schema existiert nur auf der deterministischen Seite der Luftlücke.</p></li><li><p><strong>Minimaler Kontext.</strong> Anstatt Tausender Token von Mapping-Daten, Geschäftsregeln und Kategorie-Taxonomien enthält der Prompt des LLM nur eine Persona und Anweisungen zur Intent-Extraktion. Dadurch werden die Token-Kosten, die Latenzzeit und der Kontextwechsel drastisch reduziert.</p></li><li><p><strong>Deterministische Ausführung.</strong> Jede Abfrage, die Elasticsearch erreicht, wird von der Kontrollebene mit menschengeprüften Vorgabenvorlagen erstellt und nicht probabilistisch von einem LLM generiert. Syntaktische Gültigkeit ist garantiert. Die semantische Korrektheit wird durch dasselbe Vorgaben-Framework sichergestellt, das in den Teilen 1 bis 6 beschrieben wurde.</p></li><li><p><strong>Sicherheit durch Architektur.</strong> Prompt-Injektion wird strukturell unwirksam. Selbst wenn ein Nutzer den Agenten dazu manipuliert, eine ungewöhnliche Intent-Zeichenfolge zu erzeugen, wird diese Zeichenfolge gegen gespeicherte Richtlinien perkoliert. Wenn keine Vorgabe übereinstimmt, wird keine Abfrage generiert. Der Nutzer kann den Agenten nicht anweisen, eine Abfrage zu erstellen, da der Agent keine Abfragen erstellt. Die Steuerungsebene tut dies, und die Steuerungsebene ist deterministisch.</p></li></ul><h2>Wie die einzelnen Teile zusammenpassen</h2><p>Die folgende exemplarische Vorgehensweise zeigt, wie die kontrollierte Steuerungsebene eine agentenvermittelte Abfrage handhabt.</p><h3>Schritt 1: Der Nutzer spricht mit dem Agenten</h3><p>Ein Kunde, der mit einem E-Commerce-Chatbot interagiert, sagt: „Ich suche günstige Schokolade, aber ohne Erdnüsse.“</p><h3>Schritt 2: Der Agent extrahiert die Absicht</h3><p>Die Rolle des LLM besteht in der Absichtsextraktion, nicht in der Abfragegenerierung. Auf Basis eines minimalen Prompts, der den Agenten anweist, die Produktabsicht zu ermitteln, erzeugt er eine Suchabfrage: „billige Schokolade ohne Erdnüsse“.</p><p>Dies ist eine einfache Klassifizierungsaufgabe. Das LLM braucht nicht das Index-Mapping, die Kategorie-Taxonomie oder die Preisregeln, um es auszuführen. Es muss die natürliche Sprache verstehen, und genau darin sind LLMs gut.</p><h3>Schritt 3: Die Kontrollebene steuert die Abfrage</h3><p>Die Absichtszeichenfolge „billige Schokolade ohne Erdnüsse“ wird an die Steuerungsebene weitergeleitet, die sie mit dem Vorgaben-Index perkolieren. Drei Vorgaben stimmen überein:</p><ul><li><p>Die Vorgabe „billig“ (extrahiert „billig“ und wendet einen Preisfilter basierend auf der Produktkategorie an).</p></li><li><p>Die Vorgabe „Schokolade“ (beschränkt die Ergebnisse auf Schokoladenkategorien).</p></li><li><p>Die Vorgabe „ohne“ (Negation; extrahiert das Ausschlussziel und wendet einen <code>must_not</code>-Filter an)</p></li></ul><p>Die Steuerungsebene wendet diese Vorgaben durch dieselbe kaskadierende Transformation an, die in <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Teil 3</a> und <a href="https://www.elastic.co/search-labs/blog/elasticsearch-percolator-search-governance">Teil 4</a> beschrieben ist: Prioritätsreihenfolge, Konfliktlösung pro Feld, Verfolgung verbrauchter Phrasen. Wenn auch eine „Weihnachtskampagne“-Vorgabe aktiv ist, setzt sie sich mit den Produktvorgaben genau so zusammen, wie in <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Teil 3</a> beschrieben. Die Beteiligung des Agenten ändert das Governance-Modell überhaupt nicht.</p><h3>Schritt 4: Die gesteuerte Abfrage wird ausgeführt</h3><p>Die Steuerungsebene erzeugt eine vollständig gesteuerte Elasticsearch-Abfrage: eine Suche nach „Schokolade“, beschränkt auf die entsprechenden Kategorien, mit einer Preisobergrenze, die sich aus der Vorgabe „billig“ ergibt, einem Ausschlussfilter für erdnusshaltige Produkte und der Anwendung etwaiger aktiver Kampagnen-Boosts. Wenn die Vorgabe „Schokolade“ auch wirtschaftliche Optimierungsgewichte (<a href="https://www.elastic.co/search-labs/blog/ecommerce-search-optimization-query-governed">Teil 7</a>) einschließt, werden diese ebenfalls angewendet. Der Margenaufschlag ist auf 3,0x gesetzt, da „Schokolade“ eine Browsing-Abfrage ist, bei der der Einzelhändler von der Förderung von Produkten mit höherer Marge profitiert. Wenn der Käufer eine Kaufhistorie (<a href="https://www.elastic.co/search-labs/blog/elasticsearch-personalized-search-governed-ecommerce">Teil 6</a>) hat, werden Personalisierungssignale darüber geschichtet. Diese Abfrage ist syntaktisch gültig durch Konstruktion und semantisch korrekt durch Vorgabendesign.</p><h3>Schritt 5: Rückgabe der Ergebnisse durch den Agenten</h3><p>Die Produktergebnisse werden an den Agenten zurückgegeben, der sie dem Nutzer im Dialog präsentiert. Die Rolle des Agenten auf dem Rückgabepfad ist die Präsentation: Formatierung der Ergebnisse, Beantwortung von Folgefragen, Bereitstellung von Produktdetails. Der Abruf selbst war geregelt, deterministisch und erklärbar.</p><h2>Wozu der Agent gut ist (und wozu nicht)</h2><p>Diese Architektur nutzt die Stärken des LLM und schützt das System vor seinen Schwächen.</p><p>LLMs sind hervorragend darin, die Absicht der natürlichen Sprache zu verstehen. „Ich suche nach billiger Schokolade, nichts mit Erdnüssen“ ist eine Aufgabe des natürlichen Sprachverständnisses, bei der die Absicht analysiert, Produktreferenzen identifiziert und Negation erkannt wird. LLMs handhaben dies zuverlässig, da es sich um ein Klassifizierungsproblem handelt, nicht um ein Generierungsproblem. Die Ausgabe ist eine kurze Absichtszeichenfolge, keine komplexe strukturierte Abfrage.</p><p>LLMs haben Schwierigkeiten, unter komplexen Rahmenbedingungen präzise strukturierten Ausgang zu erzielen. Die Erstellung gültiger Elasticsearch-Abfrage-DSL erfordert exakte Feldnamen, korrekte Klauselverschachtelung, geeignete Filtertypen für jedes Feld und eine konsistente Anwendung von Geschäftsregeln über Tausende von Randfällen. Dies sind genau die Eigenschaften, die ein deterministisches System trivialerweise erzwingt und die ein probabilistisches System unzuverlässig erzwingt.</p><p>Die gesteuerte Steuerungsebene platziert jede Komponente an ihrem Platz: das LLM auf der Seite der natürlichen Sprache, die deterministische Vorgaben-Engine auf der Seite der Abfragekonstruktion, und eine architektonische Grenze zwischen ihnen.</p><h2>Die Governance begrenzt den Explosionsradius.</h2><p>Dies ist derselbe Einblick aus <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Teil 3</a>, erweitert auf den agentischen Kontext. In Teil 3 haben wir festgestellt, dass Governance die semantische Suche sicherer macht, indem sie die Kandidatenmenge vor Beginn der Suche eingrenzt. Eine semantische Suche über 500 Produkte in einer regulierten Kategorie ist eine ganz andere Sache als eine semantische Suche über 500.000 SKUs.</p><p>Das gleiche Prinzip gilt für agentenvermittelte Abfragen. Ohne entsprechende Steuerung könnte ein Agent, der „billige Schokolade“ falsch interpretiert, eine Abfrage generieren, die den gesamten Katalog ohne Preisbeschränkung, ohne Kategoriefilter und ohne Ausschlüsse durchsucht. Selbst wenn der Agent eine unvollständige Absichtszeichenfolge abgibt, schränkt die Kontrollebene die Abfrage auf die Richtlinien ein, die übereinstimmen. Im schlimmsten Fall werden weniger Richtlinien ausgelöst, nicht dass eine unbegrenzte Abfrage den Produktkatalog trifft.</p><p>Governance engt den Explosionsradius von probabilistischen Fehlern ein. Dies gilt unabhängig davon, ob es sich bei der probabilistischen Komponente um ein semantisches Retrieval-Modell oder einen LLM-Agenten handelt.</p><h2>LLM-vorgeschlagene Richtlinien: Erweiterung der Abdeckung</h2><p>In <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">Teil 2</a> wurde die Idee eingeführt, dass ein LLM neue Richtlinien vorschlagen kann, die in dieselbe Author → Test → Promote-Pipeline aufgenommen werden wie von Menschen verfasste. Im Agentenkontext wird das zu einer starken Feedback-Schleife.</p><p>Ein LLM kann Abfrageprotokolle analysieren, Muster identifizieren, bei denen die Kontrollebene keine Matching-Vorgabe hat (Abfragen, die nicht zur unveränderten Abruf gelangen), und neue Vorgaben vorschlagen, um diese Lücken zu schließen. Ein Merchandiser prüft jeden Vorschlag, testet ihn und fördert ihn, wenn er das erwartete Verhalten hervorruft. Das Governance-Modell stellt sicher, dass keine von LLM vorgeschlagene Vorgabe ohne menschliche Validierung in die Produktion gelangt.</p><p>Im Laufe der Zeit entsteht dadurch ein positiver Kreislauf: Die Vorgabenabdeckung der Steuerungsebene erweitert sich, der Anteil der Abfragen, die eine unveränderte Abrufung erfordern, schrumpft, und das System wird zunehmend geregelt, wobei jede Vorgabe überprüfbar, versioniert und individuell umkehrbar ist.</p><h2>Das breitere Muster: Deterministische Leitplanken für probabilistische Systeme</h2><p>Die in dieser Serie beschriebene Architektur, eine deterministische Kontrollebene, die zwischen einer probabilistischen Eingangsquelle und einem Datenabrufsystem angesiedelt ist, ist nicht spezifisch für die E-Commerce-Suche. Das gleiche Muster gilt überall dort, wo ein KI-Agent mit strukturierten Daten interagieren muss.</p><p>Ein Agent, der eine SQL-Datenbank abfragt, steht vor denselben Herausforderungen: Kontextaufblähung durch Schema-Injektion, halluzinierte Spaltennamen, Risiken der Prompt-Injektion und Auswahl von Werten mit hoher Kardinalität. Ein Agent, der mit einem Ticketsystem wie Jira, einem Customer-Relationship-Management-System (CRM) wie Salesforce oder einem Code-Repository wie GitHub interagiert, steht vor ähnlichen Problemen. In jedem Fall ist die Kernarchitekturfrage dieselbe: Sollte das LLM die Abfrage erstellen, oder sollte das LLM die Absicht extrahieren und an eine deterministische Schicht weitergeben, die die Abfrage erstellt?</p><p>Die geregelte Kontrollebene bietet eine wiederholbare Antwort auf diese Frage. Richtlinien sind Daten. Die Extraktion von Absichten ist die Aufgabe des LLM. Die Abfragekonstruktion ist die Aufgabe der Steuerungsebene. Die Metadaten-Luftlücke hält sie getrennt. Und das Governance-Framework (Priorisierungsreihenfolge, Konfliktlösung, kaskadierende Transformationen, Überprüfbarkeit) stellt sicher, dass die deterministische Schicht bei wachsender Anzahl von Richtlinien operationell handhabbar bleibt.</p><h2>Fazit</h2><p>Die in dieser Reihe beschriebenen E-Commerce-Suchsteuerungsmuster (Richtlinien als Daten, Autor → Test → Workflow-Förderung, kaskadierende Transformationen, Konfliktlösung pro Feld, Percolator-basiertes Reverse Matching und mehrstufiges Fallback) wurden für eine Welt entwickelt, in der ein Händler Richtlinien erstellt und ein Käufer Abfragen eingibt. Aber die Architektur kann viel mehr ermöglichen als ihr ursprünglicher Anwendungsfall.</p><p>Wenn die Eingabequelle ein KI-Agent anstelle eines menschlichen Käufers ist, wird die gesteuerte Kontrollebene zur kritischen Sicherheitsschicht zwischen einem probabilistischen System und einem Produktionsdatenspeicher. Es bietet die deterministischen Garantien (syntaktische Gültigkeit, semantische Korrektheit, Überprüfbarkeit und Sicherheit), die Unternehmenssysteme benötigen und die LLMs allein nicht bieten können.</p><p>Die deterministische Steuerungsebene ersetzt den KI-Agenten nicht. Dadurch kann der KI-Agent sicher eingesetzt werden.</p><h2>Setzen Sie die reglementierte E-Commerce-Suche in die Praxis um</h2><p>Die in dieser Serie beschriebene Architektur der Steuerebene, vom Paradigma der Vorgaben als Daten über die perkolatorbasierte Suche bis hin zu Personalisierung, wirtschaftlicher Optimierung und dem agentenbasierten Luftraum, wurde von Elastic Services Engineering entwickelt und gebaut. Jedes in dieser Serie beschriebene Muster stammt aus einem funktionierenden System, das anhand von Produktkatalogen auf Unternehmensebene erstellt und validiert wurde.</p><p>Wenn Ihr Team KI-gestützte Sucherlebnisse entwickelt und deterministische Leitplanken für agentenvermittelte Abfragen benötigt, oder wenn Sie eine kontrollierte, vom Unternehmen editierbare Sucharchitektur auf Elasticsearch implementieren möchten, können die Elastic Professional Services Ihre Implementierung beschleunigen. Wenden Sie sich an <a href="https://www.elastic.co/consulting">Elastic Professional Services</a>.</p><h2>Nehmen Sie an der Diskussion teil</h2><p>Haben Sie Fragen zur Suchsteuerung, zu Abrufstrategien oder zur Sucharchitektur im E-Commerce? Nehmen Sie an der <a href="https://discuss.elastic.co/">Diskussion der Elastic-Community</a> teil.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/agentic-ai-search-deterministic-guardrail-query-execution</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/agentic-ai-search-deterministic-guardrail-query-execution</guid>
    <category><![CDATA[Operativer Betrieb]]></category>
    <dc:creator><![CDATA[Alexander Marquardt,Honza Král,Taylor Roy]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5b5aa5493a75281a/6a16f3490811ae71b8e9fe94/769cdc7b53cbb222f52095193cd423277e8017d9-1280x720.png" length="0" type="image/png"/>
    <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Personalisierung der E-Commerce-Suche: Integration von Kaufverlauf und Nutzerkohorten]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie in Elasticsearch ein personalisiertes E-Commerce-Sucherlebnis schaffen, ohne gegen die Governance-Richtlinien zu verstoßen. In diesem Beitrag erfahren Sie, wie Sie Produkte hervorheben können, die ein Kunde bereits gekauft hat, und wie Sie kohortenspezifische Richtlinien auf der Grundlage von Nutzerprofilen aktivieren können.]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/search-labs/blog/series/governed-search-patterns">Die Teile 1 bis 5</a> dieser Serie beschreiben eine gesteuerte Steuerungsebene, die die Absicht klassifiziert, Einschränkungen durchsetzt, Richtlinienkonflikte löst und zur entsprechenden Abrufstrategie weiterleitet, alles bevor der Produktkatalog abgefragt wird. Jeder bisher beschriebene Mechanismus behandelt alle Käufer identisch. Eine Suche nach „Schokolade“ liefert immer das gleiche Ergebnis, egal ob der Käufer Veganer ist, ein Elternteil, der für den Geburtstag eines Kindes einkauft, oder ein Halal-Konsument.</p><p>Dieser Beitrag stellt zwei Personalisierungsmechanismen vor, die die gesteuerte Steuerungsebene erweitern, ohne deren Architektur zu verändern. Beide Mechanismen wirken multiplikativ mit der Governance-Ebene aus den Teilen 1 bis 5 zusammen: Richtlinien werden weiterhin angewendet, Einschränkungen werden weiterhin durchgesetzt, Konflikte werden weiterhin gelöst und Personalisierungssignale werden in dieselbe gesteuerte Abfrage integriert, wodurch sichergestellt wird, dass die von Elasticsearch zurückgegebenen Ergebnisse bereits personalisiert sind.</p><p>Der erste Mechanismus fördert Produkte, die der einzelne Käufer zuvor gekauft hat. Der zweite Mechanismus aktiviert kohortenspezifische Richtlinien, die auf dem Profil des Käufers basieren. Gemeinsam zeigen sie, dass Personalisierung kein separates System ist, das an die Suche angehängt oder als Nachbearbeitung der Suchergebnisse angewendet wird; sie ist vielmehr eine natürliche Erweiterung der richtlinienbasierten Steuerungsebene.</p><p>Einen detaillierten Einblick in die mathematischen Grundlagen der in diesem Beitrag verwendeten Personalisierungstechniken finden Sie unter <a href="https://alexmarquardt.com/elastic/personalizing-search-in-elasticsearch-without-ml-post-processing/">Personalisierung der Suche in Elasticsearch ohne ML-Nachbearbeitung</a> sowie unter <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-relevance-cohort-aware-ranking-elasticsearch">Kohortenorientiertes Ranking in Elasticsearch</a>.</p><p>Um in einer Live-Demonstration zu sehen, wie sich der Kaufverlauf nutzen lässt, um die Suchergebnisse für wiederkehrende Kunden zu verbessern, sehen Sie sich das Video an: <a href="https://www.youtube.com/watch?v=TGf_pOWHA5M">Nachvollziehbare Personalisierung: Verbesserung der Suche anhand des Kaufverlaufs</a>.</p><h2>Optimierung des individuellen Kaufverlaufs</h2><p>Die einfachste Form der Personalisierung ist auch eine der effektivsten: Wenn ein Käufer ein Produkt bereits gekauft hat, sollte es hervorgehoben werden, wenn er nach etwas Ähnlichem sucht. Ein Kunde, der regelmäßig eine bestimmte Marke von Schokoladenkeksen kauft, sollte diese Kekse bei der Suche nach „Keksen“ weiter oben in der Rangliste sehen, nicht, weil ein Modell eine Präferenz vorhergesagt hat, sondern weil es direkte Verhaltenshinweise dafür gibt.</p><h3>So funktionierts</h3><p>Wenn eine Suchanfrage eine Benutzerkennung enthält, wie es beispielsweise bei einem Nutzer mit einer offenen Sitzung der Fall wäre, führt die Steuerungsebene zwei Elasticsearch-Abfragen parallel mithilfe eines Thread-Pools aus:</p><ol><li><p>Die Perkolator-Abfrage gegen den Richtlinienindex (die gleiche Governance-Abfrage, die in den Teilen 3 und 4 beschrieben wurde).</p></li><li><p>Eine Abfrage zum Kaufverlauf anhand eines <code>user_purchases</code>-Index, die nach <code>term(user_id)</code> auf den bestimmten Nutzer gefiltert wurde und dann die aktuelle Suchzeichenfolge mit den Produkttiteln dieses Nutzers abgleicht.</p></li></ol><p>Diese Prozesse laufen parallel (keiner wartet auf den anderen), sodass die Personalisierungsabfrage keine nennenswerte Latenz in der Governance-Pipeline verursacht.</p><p>Die Kaufverlauf-Abfrage verwendet die <a href="https://www.elastic.co/docs/manage-data/data-store/text-analysis">Textanalyse von Elasticsearch</a> (Stemming, Tokenisierung), um die aktuelle Suchzeichenfolge mit gespeicherten Produkttiteln abzugleichen. Das bedeutet, dass eine Suche nach „Cookies“ durch eine Standard-Textanalyse einen früheren Kauf von „Brownie-Cookies“ findet, ohne dass eine exakte Übereinstimmung der Zeichenketten erforderlich ist.</p><h3>Berechnung von Boost-Gewichten</h3><p>Nicht alle früheren Käufe verdienen die gleiche Aufwertung. Das Gewicht berücksichtigt zwei intuitive Faktoren: wie oft der Kunde das Produkt gekauft hat und wie aktuell es ist. Ein Produkt, das letzte Woche 15 Mal gekauft wurde, ist ein viel stärkeres Signal als ein Produkt, das vor sechs Monaten einmal gekauft wurde. Bei der Gewichtung wird die Häufigkeit logarithmisch skaliert (damit ein einzelner Artikel, der besonders häufig gekauft wurde, nicht alle anderen Artikel überlagert) und die Aktualität exponentiell abgewichtet (damit ältere Käufe mit der Zeit auf natürliche Weise an Bedeutung verlieren).</p><p>Die mathematischen Details zur Boost-Formel finden Sie unter <a href="https://alexmarquardt.com/elastic/personalizing-search-in-elasticsearch-without-ml-post-processing/">Personalisierung der Suche in Elasticsearch ohne ML-Nachbearbeitung</a>.</p><h3>Wie es zu einer Abfrage wird</h3><p>Die Kaufverlaufs-Boosts werden als oberste Bewertungsschicht in die Abfrage integriert und umfassen die Filter und Boosts der Governance-Richtlinien aus Teil 3 und 4 sowie alle<a href="https://www.elastic.co/search-labs/blog/function-score-query-boosting-profit-popularity-elasticsearch"> Geschäftssignal-Boosts wie Marge und Beliebtheit</a> (die wir in Teil 7 näher betrachten werden). Das bedeutet, dass ein Produkt, das aufgrund einer Governance-Richtlinie entfernt wurde, nicht aufgrund eines positiven Kaufverlaufs wieder angezeigt wird. <em>Die Governance</em> steuert den Ergebnissatz; die <em>Personalisierung</em> passt die Reihenfolge innerhalb dieses Satzes an. Produkte ohne Kaufverlauf werden nicht benachteiligt. Das durch die Governance festgelegte Ranking bleibt erhalten, allerdings werden Produkte mit relevantem Kaufverlauf – bei sonst gleichen Bedingungen – darüber platziert.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt731e67dfd3bd6ee2/6a17e9523e9e4582bbba14b6/80f0285bd80935703d39b7a4e1fd6094d71af0aa-545x273.jpg" alt="Ein Flussdiagramm zeigt, wie die Suche eines Nutzers nach „Orangen“ einen Anwendungsserver, eine Steuerungsebene, Abfragen des Kaufverlaufs und von Richtlinien sowie anschließend einen Produktkatalogindex durchläuft, um Produktergebnisse zu Orangen zurückzugeben." /><h3>Warum Elasticsearch bei jeder Suche abfragen?</h3><p>Der Kaufverlauf wird bei jeder Suche aus Elasticsearch abgefragt, anstatt in der Anwendungsebene zwischengespeichert zu werden. Dies ist eine bewusste Designentscheidung. Da die Abfrage die aktuelle Suchzeichenfolge mit den Produkttiteln mithilfe der Textanalyse-Pipeline von Elasticsearch abgleicht, profitiert das System von der gleichen Stemming-, Tokenisierungs- und Sprachverarbeitungsfunktion, die auch der Produktsuche selbst zugrunde liegt. Eine zwischengespeicherte In-Memory-Suche würde entweder eine erneute Implementierung dieser Analyse oder die Akzeptanz einer gröberen Übereinstimmung erfordern.</p><p>Um zu verstehen, warum diese Reihenfolge wichtig ist, betrachten wir einen Kunden, der zuvor Orangensaft gekauft hat und nun nach „Orangen“ sucht. Die Kaufverlauf-Abfrage gleicht „Orangensaft“ mit dem Suchbegriff „Orangen“ durch Textanalyse ab und berechnet einen Boost für dieses Produkt. Die Governance-Ebene hat jedoch bereits „Orangen“ auf die Kategorie „Obst und Gemüse“ beschränkt und Orangensaft vollständig herausgefiltert. Der Kaufverlauf-Boost für Orangensaft ist zwar in der Abfrage vorhanden, hat aber keine Auswirkung, da es im gesteuerten Ergebnissatz kein passendes Dokument gibt, auf das er angewendet werden könnte. Dem Kunden werden frische Orangen angezeigt, sortiert nach Relevanz und Personalisierung. Die Governance-Orientierungshilfen greifen.</p><p>Die Leistungskosten sind minimal: Der Kaufverlaufsindex ist klein (der Kaufverlauf eines Nutzers umfasst typischerweise Dutzende bis Hunderte von Dokumenten, nicht Millionen), und die Abfrage wird parallel zur Perkolator-Suche ausgeführt, sodass sie den kritischen Pfad nicht verlängert.</p><h3>Beispielanfrage für „Quellwasser“ ohne Nutzerverlauf</h3><p>Wenn ein nicht angemeldeter Nutzer oder ein Nutzer, der noch nie „Quellwasser“ gekauft hat, eine Suche durchführt, werden ihm möglicherweise Ergebnisse angezeigt, die in etwa wie folgt aussehen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt90249896bcf2b8c2/6a17e954af47b685f5cddfcf/1d03558c8f6492a0999e1ac4f1d22680c8f3a6ce-1130x1028.png" alt="Auf einer Webseite werden Suchergebnisse für „Quellwasser“ angezeigt, darunter eine Suchleiste, Kategorie- und Markenfilter sowie drei Produktlisten mit Details wie Marke, Zusammensetzung und Preis." /><h3>Beispielhafte Kaufhistorie eines Nutzers</h3><p>Eine Nutzerin namens Carol hingegen hat einen Einkaufsverlauf, die folgende Produkte enthält:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3aa784ccb0653a0d/6a17e95563baffd6b7741c8d/31c1fb789efc6cef673984e9711d571efce8ed27-661x523.png" alt="Eine digitale Schnittstelle mit dem Titel „Kaufprofil“ zeigt eine Kundin namens Carol mit zwei Kohorten und einer Liste der kürzlich gekauften Artikel, einschließlich Mengen, der letzten Kaufdaten und der seit dem jeweiligen Kauf vergangenen Zeit." /><h3>Beispielsuche nach „Quellwasser“ mit dem obigen Kaufverlauf</h3><p>Wenn Carol nach „Quellwasser“ sucht, werden ihr personalisierte Ergebnisse angezeigt, die ihre bisherigen Käufe widerspiegeln. Ein Blick auf den Kaufverlauf oben zeigt, dass sie das „kohlensäurehaltige Quellwasser“ (die grüne Flasche) etwa 40 Mal gekauft hat, zuletzt vor zwei Tagen. Wenn sie nach „Quellwasser“ sucht, wird dieses Produkt hervorgehoben, da wir wissen, dass sie es mag. Beachten Sie, dass in den nicht personalisierten Ergebnissen stattdessen das Rubicon-Quellwasser an erster Stelle stand.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf243c5ef1a1808ba/6a17e95763baff5d73741c91/6fce63ff051e345a79fef934cd6e71ba113ae585-1159x1062.png" alt="Eine Webseite zeigt Suchergebnisse für „Quellwasser“ an und listet Produktdetails, Preise und Filterkategorien für Getränke und Marken auf." /><h2>Kohortenorientierte Richtlinienaktivierung</h2><p>Der individuelle Kaufverlauf eignet sich gut für wiederkehrende Kunden mit etabliertem Verhalten. Viele Käufer sind jedoch Neukunden, anonym oder verhalten sich anders als sonst. Für diese Kunden bietet die Zugehörigkeit zu einer Kohorte eine andere Art der Personalisierung, die darauf basiert, wer der Kunde ist, und nicht darauf, wie er sich verhalten hat.</p><p>Ein veganer Kunde, der nach „Schokolade“ sucht, sollte vegane Schokolade weiter oben in den Suchergebnissen sehen. Ein Halal-bewusster Kunde, der nach „Snacks“ sucht, sollte Halal-zertifizierte Produkte gut sichtbar angezeigt bekommen. Ein gesundheitsbewusster Käufer, der nach „Joghurt“ sucht, sollte probiotische Optionen bevorzugt angezeigt bekommen.</p><h3>Kohorten als Richtlinien, nicht als Produkt-Tags</h3><p>Produkte verfügen bereits über ihre normalen Attribute, einschließlich Felder wie <code>dietary_restrictions: ["vegan"]</code> oder <code>dietary_restrictions: ["halal"]</code>. Die Frage ist, wo die Logik liegt, die die Kohorte eines Kunden mit diesen Produktattributen verbindet.</p><p>Der naive Ansatz wäre, diese Zuordnung in der Anwendungsebene oder in der Suchvorlage fest zu programmieren: Wenn der Nutzer Veganer ist, wird ein Boost für <code>dietary_restrictions: "vegan"</code> hinzugefügt. Aber es handelt sich hier um dasselbe „Spaghetti-Code“-Chaos auf Anwendungsebene, das in <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-improve-retrieval">Teil 1</a> beschrieben wurde, und es verursacht dieselben operativen Reibungsverluste: Das Hinzufügen einer neuen Kohorte oder die Änderung der Definition einer Kohorte erfordert eine Codeänderung.</p><p>Die gesteuerte Steuerungsebene behält die Kohortenlogik stattdessen in der Richtlinien-Engine bei. Eine Kohortenrichtlinie verbindet zwei Aspekte miteinander: die Zugehörigkeit eines Kunden zu einer Kohorte (zum Beispiel „vegan“) und ein Produktmerkmal (zum Beispiel <code>dietary_restrictions: “vegan”</code>). Die Richtlinie legt Folgendes fest: Wenn ein Käufer aus der veganen Zielgruppe eine Suche durchführt, sollen Produkte bevorzugt angezeigt werden, bei denen <code>dietary_restrictions</code> den Begriff „vegan“ enthält.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte15937af719dff39/6a17e95925daab370608a274/2b6fe359774bbea059aaf93f3fa4a03eb31233ea-544x290.jpg" alt="" /><p>Da die Kohortenlogik in der Richtlinien-Engine und nicht im Anwendungscode enthalten ist, bedeutet das Folgendes:</p><ul><li><p>Eine neue Kohorte kann durch die Erstellung einer neuen Richtlinie hinzugefügt werden; eine Produkt-Neuindizierung ist nicht erforderlich.</p></li><li><p>Kohorten-Richtlinien verwenden die vollständige Regel-Engine: Sie können Filter hinzufügen, Soft-Boosts anwenden, Synonyme erweitern, Abrufstrategien ändern oder jede andere Aktion einer Richtlinie vornehmen.</p></li><li><p>Das Kohortenverhalten wird über dieselbe Admin-Benutzeroberfläche verwaltet wie alle anderen Richtlinien: Ein Händler kann Kohortenrichtlinien über den unter <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">Teil 2</a> beschriebenen Workflow „Erstellen → Testen → Veröffentlichen“ erstellen, testen und veröffentlichen.</p></li></ul><h3>Beispiel einer veganen Kohortenrichtlinie</h3><p>Ein Händler erstellt eine Kohortenrichtlinie mit folgenden Merkmalen:</p><ul><li><p><strong>Kohorten:</strong> <code>["vegan"]</code>.</p></li><li><p><strong>Matchkriterien:</strong> Entspricht jeder Abfrage (oder einer bestimmten Produktkategorie).</p></li></ul><p><strong>Aktion:</strong> Soft-Boost auf <code>dietary_restrictions: "vegan"</code> mit einem Boost-Gewicht von 2.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt835034b54f6790b8/6a17e95b7b54f980408b391e/fc58bbd97c0dd1fa3ce757394ca117d0789c52f6-1080x1018.png" alt="Eine Webschnittstelle mit dem Titel „Rewrite-Richtlinie bearbeiten“ zeigt Felder für die Richtlinien-ID, den Titel, die Beschreibung, die Kohortenauswahl, die Abfrageoptionen für Regeln, den Regeltyp, die Filtereinstellungen und mehr an, wobei der Fokus auf der Kohorte mit dem Begriff „vegan“ und auf dem Wert „vegan“ liegt." /><h3>So funktioniert die Kohortenaktivierung</h3><p>Jedes Richtliniendokument hat ein <code>cohorts</code>-Feld. Bei allgemeinen Richtlinien, die für alle Käufer unabhängig von der Kohorte gelten, kann dieses Feld leer gelassen werden; diesen wird intern von der Steuerungsebene der Wert <code>"_all"</code> zugewiesen. Kohortenspezifische Richtlinien speichern die Namen ihrer Zielkohorte, wie zum Beispiel <code>["vegan", "kosher", “sweet_tooth”]</code>.</p><p>Wenn eine Suchanfrage ein Nutzerprofil enthält, erstellt die Steuerungsebene einen einfachen <code>terms</code>-Filter für die Perkolator-Abfrage:</p>{ "terms": { "cohorts": ["_all", "vegan", "health_conscious"] } }<p>Dieser einzelne Filter umfasst alle allgemeinen Richtlinien sowie die kohortenspezifischen Richtlinien des Nutzers. Der <code>_all</code>-Sentinel ermöglicht einen übersichtlichen Einbeziehungsfilter: Es sind keine <code>must_not</code>- oder <code>exists</code>-Abfragen erforderlich, um den Fall zu behandeln, in dem eine Richtlinie keine Kohortenbeschränkung enthält.</p><p>Der Perkolator wertet dann wie gewohnt die Richtlinienübereinstimmungen aus. Der einzige Unterschied besteht darin, dass die Auswahl an Richtlinien auf diejenigen beschränkt wurde, die für die Zielgruppe dieses Käufers relevant sind. Alle nachfolgenden Schritte (kaskadierende Transformationen, Konfliktlösung auf Feldebene, Nachverfolgung verwendeter Phrasen) funktionieren genauso wie der in den Teilen 3 und 4 beschriebene nicht personalisierte Ablauf.</p><h3>Ergebnisse für nicht-vegane (standardmäßige) Nutzer bei der Suche nach „Schokolade“</h3><p>Wenn ein nicht-veganer Nutzer nach Schokolade sucht, wird kein veganer Kohorten-Boost auf seine Ergebnisse angewendet. Oft tauchten in den Top-Treffern nicht-vegane Schokoladen wie folgt auf:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc5244b19c2162f5b/6a17e95d3e03d727f74f2cb6/5bade79944ef294e2cb835cfd6e3231392e8fbd0-1159x1104.png" alt="Auf einer Webseite werden Suchergebnisse für „Schokolade“ angezeigt, mit Kategorie- und Markenfiltern auf der linken Seite und drei Produktlisten für Schokolade mit Beschreibungen, Preisen und Spezifikationen." /><h3>Ergebnisse der veganen Kohortenrichtlinie bei der Suche nach „Schokolade“</h3><p>Wenn ein Käufer aus der veganen Kohorte nach „Schokolade“ sucht, wird diese Richtlinie in die Liste der in Frage kommenden Ergebnisse aufgenommen. Die Übereinstimmung ist gegeben, und die Steuerungsebene gewährt vegan-zertifizierten Schokoladenprodukten einen Soft-Boost. Der Boost wirkt sich multiplikativ aus: Vegane Schokoladen erhalten eine höhere Bewertung, doch nicht-vegane Schokoladen werden nicht vollständig ausgeschlossen, da der oben genannte Filter als <em>Soft-Boost</em> festgelegt ist, den wir in Teil 3 dieser Serie ausführlich beschrieben haben.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf73ce626bcd3d66d/6a17e95f2f4a5c5341fa8934/fc6f7ec6a9de30f3a6d8f32bb9ee7ec457dea458-1138x1255.png" alt="Auf einer Webseite werden Suchergebnisse für „Schokolade“ angezeigt, mit Kategorie- und Markenfiltern auf der linken Seite und drei Schokoladenproduktlisten mit Beschreibungen, Preisen und Spezifikationen, wobei der Fokus auf den eingekreisten veganen Kennzeichnungen liegt." /><p>Wenn der Käufer jedoch ausdrücklich nach „Hershey-Milchschokolade“ sucht, greift der Vegan-Boost zwar weiterhin, wird jedoch möglicherweise durch die stärkere Textrelevanz der Hershey-Milchschokoladenprodukte überlagert.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e7487727387e524/6a17e9617b54f965ab8b3922/f47bb8bfa58106f897c4c6c143494f4367355528-1136x1142.png" alt="Auf einer Webseite werden Suchergebnisse für „Hershey-Milchschokolade“ angezeigt, mit Kategorie- und Markenfiltern auf der linken Seite sowie drei Einträgen zu Hershey-Schokoladenprodukten mit detaillierten Beschreibungen, Preisen und Nährwertangaben." /><p>Ein Käufer außerhalb der veganen Zielgruppe, der nach der gleichen Abfrage sucht, sieht die Richtlinie für die „vegane Zielgruppe“ nie; sie ist nicht in seiner Auswahl enthalten. Die Governance-Ebene ist identisch, nur der aktive Richtliniensatz unterscheidet sich.</p><h3>Kohorten mit Kaufhistorie</h3><p>Ein veganer Kunde mit umfangreichem Kaufverlauf erhält sowohl eine speziell auf seine Kohorte zugeschnittene Richtlinienaktivierung als auch Kaufverlauf-Boosts. Bei neuen oder anonymen Kunden ermöglicht bereits die implizite Zugehörigkeit zu einer Kohorte eine aussagekräftige Personalisierung, ohne dass Verhaltensdaten erforderlich sind (wenn ein anonymer Nutzer beispielsweise ausschließlich nach veganen Produkten gesucht hat, stufen wir ihn als Mitglied der veganen Kohorte ein). Ein Kunde, der sich bei der Kontoeröffnung als Halal-bewusst identifiziert, erhält bei seiner ersten Suche sofort auf Halal zugeschnittene Ergebnisse.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt89044f002807c2e4/6a17e962af47b64034cddfd3/81af35a533a567d99324860c8e69cf9752533c8f-545x301.jpg" alt="Ein Flussdiagramm zeigt, wie eine Suche nach „Orangen“ durch einen Anwendungsserver, eine Steuerungsebene, Abfragen des Verlaufs und der Richtlinien und schließlich einen Produktindex verläuft, um Produkte mit Orangen zurückzugeben." /><h2>Wie sich Personalisierungsebenen zusammensetzen</h2><p>Die Verschachtelungsreihenfolge der <code>function_score</code>-Ebenen ist entscheidend. Vom Innersten zum Äußersten:</p><ol><li><p><strong>Basisabfrage:</strong> Das Schlüsselwort oder die semantische Übereinstimmung mit benannten Abfragen (<code>fulltext_match</code>, <code>title_phrase_match</code>).</p></li><li><p><strong>Ebene der Governance-Richtlinie:</strong> Feste Filter als <code>bool.filter</code>-Klauseln, Soft-Boosts als <code>function_score</code>-Funktionen (Teile 3 und 4).</p></li><li><p><strong>Business-Signal-Steigerungen:</strong> Margen- und Popularitätssteigerung (die wir in Teil 7 erkunden werden).</p></li><li><p><strong>Kaufverlauf-Boosts:</strong> Die äußerste <code>function_score</code>-Ebene.</p></li></ol><p>Diese Reihenfolge stellt sicher, dass die Governance die Ergebnisliste (was angezeigt wird) steuert, geschäftliche Signale das Ranking innerhalb dieser Liste anpassen (was aus Sicht des Händlers zuerst angezeigt wird) und den Kaufverlauf das Ranking auf der Grundlage des individuellen Verhaltens weiter anpasst (was aus Sicht des Käufers zuerst angezeigt wird). Jede Ebene überlagert die vorherige auf multiplikative Weise, sodass sich die Effekte verstärken, anstatt sich zu widersprechen.</p><h2>Was das operativ bedeutet</h2><p>Durch die Personalisierung über die geregelte Steuerungsebene bleiben alle in Teil 1 und 2 beschriebenen betrieblichen Eigenschaften erhalten:</p><ul><li><p><strong>Änderungen ohne Bereitstellung.</strong> Kohorten-Richtlinien werden über die Admin-Benutzeroberfläche erstellt, getestet und aktiviert. Das Hinzufügen einer neuen Ernährungkohorte oder das Anpassen einer Gewichtung erfordert weder Codeänderungen noch die Beteiligung der Entwicklungsabteilung.</p></li><li><p><strong>Prüfbarkeit.</strong> Jede Kohortenrichtlinie ist ein eigenständiges, versioniertes Dokument. Wenn ein Händler fragt: „Warum ist das Ranking für vegane Produkte für diesen Nutzer höher?“, ist die Antwort eine spezifische Richtlinie mit einer spezifischen Priorität, die im Fehlerbehebungs-Panel zusammen mit allen anderen Richtlinien angezeigt wird, die für diese Abfrage ausgelöst wurden.</p></li><li><p><strong>Konfliktlösung.</strong> Die Richtlinien für Kohorten unterliegen der gleichen Konfliktlösung pro Feld, die in Teil 3 beschrieben wurde. Wenn die Kategorie-Boost-Funktion einer Kohortenrichtlinie mit der Kategorie-Überschreibung einer Kampagnenrichtlinie in Konflikt gerät, wird der Konflikt deterministisch durch denselben Prioritäts- und Strategie-Framework gelöst; eine Sonderbehandlung ist nicht erforderlich.</p></li><li><p><strong>Messbarkeit.</strong> Da Kohorten-Richtlinien eigenständig und einzeln aktivierbar sind, lassen sich ihre Auswirkungen auf die Konversions-, Klick- und Warenkorb-Raten ebenso wie bei jeder anderen Richtlinie im System unabhängig voneinander messen.</p></li></ul><h2>Wie geht es weiter in dieser Serie?</h2><p>Im nächsten Beitrag wird eine weitere Dimension der gesteuerten Kontrollebene untersucht: wie Margen und Popularitätssteigerungen pro Anfrage durch Richtlinien angepasst werden können, wodurch die ökonomische Optimierung zu einer Governance-Entscheidung und nicht zu einer statischen Konfiguration wird.</p><p>Siehe Teil 7: Abfragegesteuerte wirtschaftliche Optimierung: Margen- und Popularitätssteigerung pro Abfrage</p><h2>Setzen Sie die reglementierte E-Commerce-Suche in die Praxis um</h2><p>Die in diesem Beitrag beschriebenen Personalisierungsmuster (Boosting des individuellen Kaufverlaufs und kohortenbasierte Richtlinienaktivierung) wurden von Elastic Services Engineering als Teil unseres wiederholbaren E-Commerce-Suchbeschleunigers konzipiert und entwickelt. Beide Mechanismen sind in die in der gesamten Reihe beschriebene verwaltete Steuerungsebenen-Architektur integriert. Wenden Sie sich an <a href="https://www.elastic.co/consulting">Elastic Professional Services</a>.</p><h2>Nehmen Sie an der Diskussion teil</h2><p>Haben Sie Fragen zur Suchsteuerung, zu Abrufstrategien oder zur Sucharchitektur im E-Commerce? Nehmen Sie an der <a href="https://discuss.elastic.co/">Diskussion der Elastic-Community</a> teil.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-personalized-search-governed-ecommerce</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-personalized-search-governed-ecommerce</guid>
    <category><![CDATA[Operativer Betrieb]]></category>
    <dc:creator><![CDATA[Alexander Marquardt,Honza Král,Taylor Roy]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte3979255ddfc7f45/6a17e25ffaa913812f93c7cb/92c517a2e7b36122a18feee317a0215981b62b6b-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Elasticsearch-Perkolator zur Steuerung der Suche im E-Commerce: Übersetzung mehrdeutiger Anfragen in kontrollierte Abrufstrategien]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie den Elasticsearch-Perkolator zur Implementierung der Suchsteuerung verwenden. In diesem Blog skizzieren wir die Muster, die erforderlich sind, um eine geregelte Policy-Engine in der Produktion zu erstellen und eine kontrollierte Abrufstrategie zu entwickeln.]]></description>
    <content:encoded><![CDATA[<p>Dieser Beitrag ist ein technischer Einblick in die Elasticsearch-Implementierung der in <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Teil 3</a> beschriebenen Steuerungsebenenarchitektur und zeigt, wie sie mit dem Elasticsearch-Perkolator erstellt wird. Er skizziert die Muster, die zur Implementierung einer deterministischen, gesteuerten Richtlinien-Engine in der Produktion verwendet werden.</p><h2><strong>Von der Architektur bis zur Implementierung</strong></h2><p><a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Teil 3</a> beschrieb die Architektur der Steuerungsebene: Reverse Matching als Suchprimitiv, Richtliniendokumente, die Treffer von Aktion trennen, und kaskadierende Transformationen, die mehrere Richtlinien zu einem einzelnen Ausführungsplan zusammensetzen. Dieser Beitrag befasst sich praktisch mit der Elasticsearch-Funktion, die die Richtlinienabfrage ermöglicht: der <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-percolate-query">Perkolator-Abfrage</a>.</p><p>Der Perkolator eignet sich hervorragend für die Steuerung, da er die Suchrichtung genau so umkehrt, wie es eine Steuerungsebene benötigt. Dieser Beitrag führt Schritt für Schritt durch die Implementierung, beginnend mit einer klaren Erklärung, was der Perkolator tut und warum er wichtig ist, und dann weiter durch Indexdesign, Richtlinien-Speicher, Auswertung zur Abfragezeit und die Kombination mehrerer Richtlinien.</p><h2><strong>Wie normale Suche funktioniert</strong></h2><p>Ein E-Commerce-System kann Hunderttausende oder Millionen von Produktdokumenten enthalten, die Felder wie <code>title</code>, <code>category</code> und <code>price</code> umfassen. Wenn ein Nutzer nach passenden Dokumenten sucht, fordern Sie Elasticsearch auf, die Suchfolge des Nutzers mit einem oder mehreren gespeicherten Feldern in diesen Produktdokumenten zu vergleichen. Der Standardanalysator von Elasticsearch, <a href="https://www.elastic.co/docs/reference/text-analysis/analysis-standard-analyzer">der Standardanalysator</a>, schreibt Text in Kleinbuchstaben und teilt ihn in Token auf. Eine Suche nach „orangen“ entspricht aufgrund der Kleinschreibung „Orangen“. Mit einem sprachbewussten Analysator, der Wortstämme einbezieht, wird auch „Orange“ gefunden, da beide Formen auf den gleichen Stamm zurückgehen. Beispielsweise liefert die folgende <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-match-query">Suchabfrage</a> Dokumente zurück, die im Feld <code>“title”</code> „Orange“ oder „Orangen“ enthalten.</p>POST products/_search
{
  "query": {
    "match": {
      "title": "oranges"
    }
  }
}<p>Für die obige Abfrage gibt Elasticsearch die Produktdokumente an, deren Feld <code>title</code> mit „Orangen“ übereinstimmt. Dazu gehören beispielsweise Ergebnisse wie „Orangenaufstrich“, „Orangensaft“, „Saftige Orangen“, „Orangenmarmelade“ und so weiter. Wichtig ist, dass Elasticsearch üblicherweise dazu verwendet wird, eine Suchzeichenfolge mit Dokumenten zu vergleichen und die Dokumente anzugeben, die mit der Suchzeichenfolge übereinstimmen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt806e1c8c115bc9b6/6a170dba67045b634645c266/ba758f25616f2106d245ce0d47926c174766e028-642x318.png" alt="Ein Diagramm, das eine eingehende Suchzeichenfolge mit gespeicherten Produkttiteln vergleicht und Treffer für drei Titel zeigt, die „Orange“ enthalten, und keine Treffer für zwei Titel, die dies nicht tun." /><h2><strong>Das Governance-Problem: Relevante Richtlinien finden, bevor nach Produkten gesucht wird</strong></h2><p>Wie in <a href="https://www.elastic.co/search-labs/blog/series/governed-search-patterns">Teil 1 bis 3</a> dargelegt, sendet ein gesteuertes Suchsystem die Suchzeichenfolge des Nutzers nicht direkt an den Produktkatalog. Zunächst wird geprüft, ob Richtlinien für diese Suchzeichenfolge gelten.</p><p>Ein Händler hat entschieden, dass, wenn jemand exakt nach „Orangen“ sucht, die Ergebnisse auf die Kategorie „Orangen“ beschränkt werden sollen und Orangensaft, Orangenmarmelade und Orangenlimonade ausgeschlossen werden. Diese Geschäftsentscheidung wird als Richtlinie gespeichert. Wenn ein Nutzer „Orangen“ eingibt, muss die Steuerungsebene diese Richtlinie finden, ihre Anweisungen lesen und die Suche im Produktkatalog entsprechend modifizieren. Um dies zu erreichen, muss die Steuerungsebene herausfinden, welche gespeicherten Richtlinien für diese Suchzeichenfolge relevant sind.</p><p>Ein Unternehmenssystem kann Hunderte oder Tausende solcher Richtlinien umfassen. Deren Einzelüberprüfung per Wenn/Sonst-Logik ist das Antimuster auf Anwendungsebene, das in <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">Teil 2</a> beschrieben wird. Was wir brauchen, ist eine Möglichkeit, all diese Richtlinien in einem Index zu speichern und sofort diejenigen zu finden, die zu einer bestimmten Suchzeichenfolge passen. Hier kommt der Perkolator ins Spiel.</p><h2><strong>Umkehr der Richtung: Der Perkolator</strong></h2><p>Wir haben bereits erwähnt, dass Elasticsearch bei einer normalen Suche üblicherweise verwendet wird, um eine Suchzeichenfolge mit Dokumenten zu vergleichen und die Dokumente zurückzugeben, die diese Suchzeichenfolge enthalten.</p><p>Der Perkolator kehrt diesen Vorgang um. Mit einem Perkolator verfügt man über einen Index, in dem jedes Dokument ein Abfragemuster speichert. Eine eingehende Suchzeichenfolge wird mit diesen gespeicherten Abfragen abgeglichen, um zu bestimmen, welches dieser gespeicherten Abfragemuster ausgelöst wurde.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1e7e2966bf46474d/6a170dbba929cf500aae0a57/1e6348531d1c0be57b385f51d248488cf58489ff-642x279.png" alt="Ein Diagramm, das mehrere gespeicherte Abfragemuster zeigt, die unabhängig von einer eingehenden Suchzeichenfolge getestet werden, wobei „Orangen“ eine Übereinstimmung ergeben und alle anderen Muster keine Übereinstimmung wiedergeben." /><p>Für die Steuerung stellen die „gespeicherten Abfragemuster“ Richtlinien dar. Jede Richtlinie enthält ein Muster, das die Art der Suchzeichenfolge beschreibt, mit der sie übereinstimmen soll. Stimmt zum Beispiel die Suchzeichenfolge genau mit „Orangen“ überein oder enthält sie „Olivenöl“? Die eingehende Zeichenfolge ist der Suchtext des Nutzers, der zum Abfragezeitpunkt eintrifft und mit allen gespeicherten Richtlinienmustern abgeglichen werden muss. Dies wird in einem <a href="https://youtu.be/Ap5K2Y00Xjc?t=246">zugehörigen PRISM-Video bei Minute 4:09</a> behandelt.</p><h2>Schritt für Schritt: Wie eine Suche nach „Orangen“ ihre Richtlinie findet</h2><h3>Die Richtlinie</h3><p>Ein Händler hat eine Richtlinie erstellt, die zutrifft, wenn ein Nutzer exakt nach „Orangen“ sucht, ohne weitere Wörter anzugeben. Sobald der Perkolator übereinstimmt, enthält der Rest des Dokuments die Regeln, die die Steuerungsebene zum Erstellen der Produktabfrage verwendet; in diesem Beispiel besteht eine der Regeln darin, die Ergebnisse auf die Kategorie „Früchte“ zu beschränken (zu filtern).</p>{
  "percolator": {
    "match_phrase": { "query": "START oranges END" }
  },
  "rule_type": "filter",
  "rule_args": {
    "filters": [
      {
        "field": "categories",
        "values": ["Fruits"],
        "mode": "hard_filter",
        "on_conflict": "soft_boost",
        "on_conflict_boost_weight": 1.0
      }
    ]
  },
  "priority": 0,
  "enabled": true
}<p>Das <code>percolator</code> -Feld enthält das Muster, das definiert, wann diese Richtlinie ausgelöst werden soll. In diesem Fall entspricht sie dem Ausdruck <code>"START oranges END"</code>. Die Felder <code>rule_type</code> und <code>rule_args</code> definieren, was die Richtlinie tun soll, wenn sie ausgelöst wird. Die Token <code>START</code> und <code>END</code> sind Grenzmarkierungen, die wir im Weiteren erläutern werden.</p><p>Sie können sehen, wie eine Richtlinie in der PRISM Studio-Benutzeroberfläche bei <a href="https://youtu.be/Ap5K2Y00Xjc?t=172">2:52 des zugehörigen PRISM-Videos</a> erstellt wird.</p><h3>Der Nutzer sucht</h3><p>Ein Käufer gibt „Orangen“ in die Suchleiste ein.</p><h3>Die Steuerungsebene prüft auf übereinstimmende Richtlinien</h3><p>Bevor der Produktkatalog durchsucht wird, fängt die Kontrollebene die Suchzeichenfolge des Nutzers ab, umschließt sie mit Begrenzungsmarkierungen und sendet sie an den Perkolator:</p>POST policies/_search
{
  "query": {
    "percolate": {
      "field": "percolator",
      "document": {
        "query": "START oranges END"
      }
    }
  }
}<p>Die Zeichenfolge <code>"START oranges END"</code> wird gegen alle gespeicherten Richtlinienmuster überprüft. Intern führt Elasticsearch die gespeicherten Richtlinienmuster gegen diese Zeichenfolge aus und gibt die übereinstimmenden wieder. Das ist der Perkolator. Die Suchzeichenfolge des Nutzers wurde mit allen gespeicherten Richtlinienmustern abgeglichen, und die übereinstimmenden Muster wurden angezeigt. Keine Wenn/Sonst-Ketten. Keine sequentielle Auswertung. Der Index übernimmt den Abgleich.</p><h3>Die Steuerungsebene wendet die Richtlinie an</h3><p>Die Steuerungsebene liest die Aktionen der zugeordneten Richtlinien. Die obige Richtlinie weist die Steuerungsebene an, die Ergebnisse auf die Kategorie „Früchte“ zu beschränken. Die Steuerungsebene erstellt die endgültige Elasticsearch-Abfrage für den Produktkatalog wie folgt:</p>POST products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "oranges" } }
      ],
      "filter": [
        { "terms": { "categories": ["Fruits"] } }
      ]
    }
  }
}<p>Der Nutzer suchte nach „Orangen“. Der Produktkatalog erhält eine Anfrage nach „Orangen“, die auf die Kategorie „Früchte“ beschränkt ist. Aufgrund dieser Einschränkung sind Orangensaft, Orangenmarmelade und Orangenlimonade ausgeschlossen.</p><h3>Warum „Orangenmarmelade“ nicht unter die Richtlinie „Orangen“ fällt</h3><p>Angenommen, ein anderer Nutzer sucht nach „Orangenmarmelade“. Die Steuerungsebene umschließt die Zeichenfolge und perkoliert: <code>"START orange marmalade END"</code>. Das Muster der „Orangen“-Richtlinie ist <code>match_phrase: "START oranges END"</code>. Die Richtlinie für Orangen passt nicht. Daher wird sie nicht angewendet und die Ergebnisse sind nicht auf die Kategorie „Früchte“ beschränkt.</p><p>Das ist der Zweck der Grenzmarkierungen <code>START</code> und <code>END</code>. Ohne sie könnte eine Richtlinie, die auf das Wort „Orangen“ abzielt, versehentlich bei einer Anfrage wie „Orangenmarmelade“ auslösen. Indem wir die Suchzeichenfolge des Nutzers mit <code>START</code> und <code>END</code> umschließen und diese Markierungen in das Muster der Richtlinie aufnehmen, stellen wir sicher, dass die Richtlinie nur dann ausgelöst wird, wenn die vollständige Suchzeichenfolge „Orangen“ lautet und keine weiteren Wörter enthält. Dies entspricht sowohl den Wünschen der Käufer als auch den Absichten des Händlers.</p><h2>Eine zweite Richtlinie: „Olivenöl“ in einem Wortstammfeld</h2><p>Nicht jede Richtlinie benötigt eine exakte Zeichenfolgenübereinstimmung. Die „Olivenöl“-Richtlinie findet Übereinstimmungen in einem Wortstammfeld, daher greift sie unabhängig von geringfügigen Wortformvariationen:</p>{
  "percolator": {
    "bool": {
      "should": [
        { "match_phrase": { "query.stemmed": "START olive oil END" } }
      ]
    }
  },
  "rule_type": "filter",
  "rule_args": {
    "filters": [
      {
        "field": "categories",
        "values": ["Olive oils"],
        "mode": "hard_filter",
        "on_conflict": "soft_boost",
        "on_conflict_boost_weight": 1.0
      }
    ]
  },
  "priority": 300,
  "enabled": true
}<p>Das Muster dieser Richtlinie entspricht <code>query.stemmed</code> statt <code>query</code>. Wenn die Suchzeichenfolge des Nutzers eintrifft, wird sie sowohl in einem <code>query</code> -Feld (der exakte Text) als auch in einem <code>query.stemmed</code> -Feld gespeichert (analysiert mit einem Wortstamm-Analysator, der Wörter auf ihren Stamm reduziert, sodass „Oliven“ und „Olive“ beide auf denselben Stamm reduziert werden, ebenso wie „Öle“ und „Öl“). Das Muster der Richtlinie wird mit der Wortstammversion der Zeichenfolge überprüft und die Richtlinie damit unabhängig von geringfügigen Wortformvariationen ausgelöst.</p><p>Die <code>START</code> - und <code>END</code> -Grenzmarkierungen funktionieren auch im Wortstammfeld und stellen sicher, dass diese Richtlinie nur ausgelöst wird, wenn „Olivenöl“ die gesamte Suchzeichenfolge ist und nicht, wenn sie als Teil von etwas Längerem auftritt.</p><p>Der übrige Beitrag behandelt die Implementierungsdetails, die dies produktionsbereit machen: das Index-Mapping, das beide Abgleichmodi unterstützt, die Steuerung der Phrasenentfernung und Verfolgung bereits verarbeiteter Phrasen durch Hervorhebungen und die Kombination mehrerer widersprüchlicher Richtlinien zu einem einzigen Ausführungsplan.</p><h2><strong>Das Richtlinien-Index-Mapping</strong></h2><p>Der Richtlinienindex benötigt ein Perkolator-Feld zur Speicherung von Abfragemustern und ein Textfeld, das die Struktur der eingehenden Suchzeichenfolge widerspiegelt, mit der der Perkolator abgleicht. Das untenstehende Mapping ist aus Gründen der Übersichtlichkeit vereinfacht. Ein Produktions-Deployment ist komplexer und verwendet benutzerdefinierte Analysetools zur Handhabung von Grenzmarkierungen, den Abgleich von Variablenmustern (z. B. zur Erkennung, dass „unter 4 $“ einen Währungswert enthält) und andere Arten von Analysen.</p>PUT policies
{
  "mappings": {
    "properties": {
      "percolator": {
        "type": "percolator"
      },
      "query": {
        "type": "text",
        "fields": {
          "stemmed": {
            "type": "text",
            "analyzer": "stemming"
          }
        }
      },
      "rule_type": { "type": "keyword" },
      "rule_args": { "type": "object", "enabled": false },
      "priority": { "type": "integer" },
      "enabled": { "type": "boolean" }
    }
  }
}<p>Der Index wird <code>policies</code> genannt, weil jedes Dokument eine vollständige verwaltete Richtlinie darstellt, wie sie in <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">Teil 2</a> definiert ist. Dazu gehören Übereinstimmungskriterien, Aktion, Priorität und Metadaten. Die Felder <code>rule_type</code> und <code>rule_args</code> enthalten die Aktionskomponente der Richtlinie, die die Anweisungen enthält, die die Steuerungsebene verwendet, um die Abfrage für die Ausführung im Produktkatalog zu erstellen.</p><p>Das <code>query</code> -Feld ist die Zeichenfolge, gegen die der Perkolator abgeglichen wird. Es gibt zwei Varianten: eine exakte Version und eine Wortstammversion. Wenn die Suchzeichenfolge des Nutzers eintrifft, wird sie in dieses Feld im temporären Speicherindex eingefügt. Richtlinien, die mit <code>query</code> übereinstimmen, sehen die exakte Zeichenfolge; Richtlinien, die mit <code>query.stemmed</code> übereinstimmen, sehen die Wortstammversion.</p><h2><strong>Perkolieren mit Hervorhebungen, Filtern und Sortierungen</strong></h2><p>Die oben genannten, einfachen Beispiele zeigten minimale Perkolationsanfragen. In der Praxis fügt die Steuerungsebene Hervorhebungen hinzu, filtert deaktivierte Richtlinien und sortiert nach Priorität:</p>POST policies/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "percolate": {
            "field": "percolator",
            "document": {
              "query": "START olive oil END"
            }
          }
        },
        {
          "term": { "enabled": true }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "query": {
        "matched_fields": ["query.stemmed"]
      }
    }
  },
  "sort": [
    { "priority": { "order": "desc" } }
  ]
}<p>Die Konfiguration mit Hervorhebung verwendet <code>"query"</code> als Feldschlüssel mit <code>"query.stemmed"</code> in <code>matched_fields</code>. Dies weist den einheitlichen <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/highlighting">Highlighter</a> von Elasticsearch an, Hervorhebungen für das übergeordnete Feld <code>query</code> wiederzugeben, aber auch Übereinstimmungen aus dem Unterfeld <code>query.stemmed</code> zu berücksichtigen, wenn er bestimmt, welche Token hervorgehoben werden sollen. Auf diese Weise kann eine Richtlinie, die auf das Wortstammfeld zutrifft, trotzdem noch genaue Hervorhebungen im Originaltext erzeugen, die die Steuerungsebene für die Entfernung von Phrasen und die Nachverfolgung bereits verarbeiteter Phrasen benötigt.</p><p>Der <code>enabled: true</code> -Filter stellt sicher, dass deaktivierte Richtlinien übersprungen werden. <code>sort</code> bei der Priorität stellt sicher, dass Richtlinien mit höherer Priorität zuerst beachtet werden, sodass die Steuerungsebene sie in der richtigen Reihenfolge für kaskadierende Transformationen verarbeiten kann. Das Feld <code>highlight</code> ist die wichtigste Ergänzung; es sagt uns genau, welche Wörter in der Suchzeichenfolge des Benutzers die einzelnen Treffer ausgelöst haben.</p><p>Die Antwort auf eine Suchanfrage nach „Olivenöl“ könnte wie folgt aussehen:</p>{
  "hits": {
    "hits": [
      {
        "_id": "en_2c3021c8",
        "_source": {
          "rule_type": "filter",
          "rule_args": {
            "filters": [
              {
                "field": "categories",
                "values": ["Olive oils"],
                "mode": "hard_filter",
                "on_conflict": "soft_boost",
                "on_conflict_boost_weight": 1.0
              }
            ]
          },
          "priority": 300
        },
        "highlight": {
          "query": ["&lt;em&gt;START olive oil END&lt;/em&gt;"]
        }
      }
    ]
  }
}<h2><strong>Warum Hervorhebungen wichtig sind</strong></h2><p>Beachten Sie die Hervorhebung in der Antwort: <code>"&lt;em&gt;START olive oil END&lt;/em&gt;"</code>. Elasticsearch teilt uns genau mit, welche Wörter in der Suchzeichenfolge des Nutzers zu einer Übereinstimmung mit der Richtlinie geführt haben. Das ist nicht nur Kosmetik. Die Metadaten zur Hervorhebung steuern zwei entscheidende nachgelagerte Verhaltensweisen:</p><p><strong>Phrasenentfernung.</strong> Einige Richtlinien müssen den übereinstimmenden Text aus der Suchzeichenfolge entfernen, bevor die Produktkatalogabfrage erstellt wird. Eine Richtlinie, die beispielsweise auf das Wort „billig“ abzielt, entfernt dieses Wort und wandelt es stattdessen in einen Preisfilter um. Die Hervorhebung gibt genau an, welcher Teil der Suchzeichenfolge mit der Richtlinie übereinstimmt, so dass das System weiß, was zu entfernen ist.</p><p><strong>Verfolgung bereits verarbeiteter Phrasen.</strong> Wie in <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Teil 3</a> beschrieben, kann eine Richtlinie mit höherer Priorität Wörter entfernen, die auch von einer Richtlinie mit niedrigerer Priorität als übereinstimmend erkannt wurden, wenn mehrere Richtlinien mit derselben Suchzeichenfolge übereinstimmen. Durch den Vergleich der Hervorhebungen jeder Richtlinie mit der aktuellen (sich entwickelnden) Suchzeichenfolge kann das System erkennen, dass eine Phrase bereits verwendet wurde, und die Richtlinie mit der niedrigeren Priorität überspringen. Dies verhindert Doppelverarbeitung und gewährleistet deterministisches Verhalten.</p><p>Sie können mehr darüber erfahren, wie das Hervorheben funktioniert, in <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/how-es-highlighters-work-internally">diesem Artikel</a>.</p><h2><strong>Von der Perkolation zum Ausführungsplan</strong></h2><p>Der Perkolator gibt eine Reihe passender Richtlinien zurück. Aber wie schon in <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Teil 3</a> beschrieben: Die Suche ist nur die halbe Miete. Die andere Hälfte besteht darin, diese Übereinstimmungen zu einem kohärenten Ausführungsplan zusammenzusetzen. Und so sieht das für eine konkrete Abfrage aus.</p><h3><strong>Beispiel: „Billige Schokolade“ während einer Weihnachtskampagne</strong></h3><p>Angenommen, das System hat zwei aktive Richtlinien: die Richtlinie „Billige Schokolade“ (Priorität 210) und die Richtlinie „Weihnachtsschokolade“ (Priorität 300), die beide in <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Teil 3</a> ausführlich beschrieben wurden.</p><p><strong>Schritt 1: Perkolieren.</strong> Der Nutzer sucht nach „billiger Schokolade“. Die Steuerungsebene umschließt die Suchzeichenfolge <code>"START cheap chocolate END"</code> und sendet sie an den Perkolator. Zwei Richtlinien stimmen überein: Das Muster der Richtlinie „Billige Schokolade“ entspricht der Phrase „billige Schokolade“; und das Muster der Richtlinie „Weihnachtsschokolade“ entspricht über das Wortstammfeld der Phrase „Schokolade“.</p><p><strong>Schritt 2: Nach Priorität sortieren.</strong> Der Perkolator gibt beide Richtlinien wieder, sortiert nach Priorität in absteigender Reihenfolge. Zuerst wird die Richtlinie „Weihnachtsschokolade“ (300) bearbeitet, danach die Richtlinie „Billige Schokolade“ (210).</p><p><strong>Schritt 3: Anwenden der kaskadierenden Transformation.</strong> Dies ist das Modell <code>initial state → [Policy A] → state' → [Policy B] → state'' → execution plan</code> aus <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Teil 3</a>.</p><p>Die Richtlinie „Weihnachtsschokolade“ (Priorität 300) gilt zuerst:</p><ul><li><p>Fügt einen strengen Kategorienfilter hinzu: „Weihnachtsspeisen und -getränke“, „Weihnachtssüßigkeiten“.</p></li><li><p>Fügt einen Preisfilter hinzu: weniger als 7 $.</p></li><li><p>Fügt der Kategorie einen Soft-Boost hinzu: „Adventskalender“ (3x).</p></li></ul><p>Die Richtlinie „Billige Schokolade“ (Priorität 210) gilt als Nächstes für den geänderten Zustand:</p><ul><li><p>Versuche, einen strengen Kategoriefilter hinzuzufügen: „Schokolade“, „Milchschokolade“; aber die Weihnachtsrichtlinie hat dieses Feld bereits mit <code>on_conflict: override</code> festgelegt, daher werden die „Billige Schokolade“-Kategorien verworfen.</p></li><li><p>Versuche, einen Preisfilter hinzuzufügen: 2 $, die Weihnachtsrichtlinie legt <code>on_conflict: restrict</code> für den Preis fest, und 2 $ ist restriktiver als 7 $, daher gewinnt 2 $.</p></li><li><p>Entfernt das Wort „billig“ aus der Suchzeichenfolge.</p></li></ul><p><strong>Schritt 4: Erstellen der Elasticsearch-Abfrage.</strong> Die Steuerungsebene fügt den Ausführungsplan zu einer einzigen Elasticsearch-Abfrage des Produktkatalogs zusammen:</p>POST products/_search
{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": [
            { "match": { "title": "chocolate" } }
          ],
          "filter": [
            { "terms": { "categories": ["Christmas foods and drinks", "Christmas sweets"] } },
            { "range": { "price": { "lt": 2 } } }
          ]
        }
      },
      "functions": [
        {
          "weight": 1
        },
        {
          "filter": { "terms": { "categories": ["Advent calendars"] } },
          "weight": 3
        }
      ],
      "score_mode": "sum",
      "boost_mode": "multiply"
    }
  }
}<p>Der ursprüngliche Suchbegriff lautete „billige Schokolade“. Die Abfrage, die den Produktkatalog erreicht, ist ein kontrollierter, zielorientierter Abrufplan: Das Wort „billig“ wurde verarbeitet und in eine Preisbeschränkung umgewandelt, die Ergebnisse sind auf saisonale weihnachtliche Kategorien beschränkt, Adventskalender-Produkte werden im Rang heraufgesetzt und die Preisobergrenze spiegelt den restriktiveren Wert der Richtlinie mit niedrigerer Priorität wider. Jede Transformation ist deterministisch, nachverfolgbar und erklärbar.</p><p>Einen kurzen Überblick darüber, wie diese Multiplikatoren mit dem Basis-BM25-Score interagieren, finden Sie <a href="https://youtu.be/Ap5K2Y00Xjc?t=525">ab Minute 8:45 im zugehörigen PRISM-Video</a> wo wir kurz die multiplikativen Boosts erläutern.</p><h2><strong>Warum das skaliert</strong></h2><p>Der Perkolator ist in diesem Anwendungsfall effizient, weil er asymmetrisch ist: Ein Unternehmens-E-Commerce-System kann Millionen von Produkten enthalten, aber nur Hunderte oder Tausende an Steuerungsrichtlinien. Der Perkolator vergleicht eine eingehende Suchzeichenfolge mit diesen gespeicherten Richtlinienmustern und durchsucht nicht den gesamten Produktkatalog. Die Kosten verhalten sich proportional zur Anzahl der Richtlinien, und Elasticsearch wendet interne Optimierungen an (Indexieren von Begriffen aus gespeicherten Abfragemustern, Kurzschluss von Boolescher Logik), um eine schnelle Übereinstimmung zu gewährleisten.</p><p>Das Hinzufügen einer neuen Richtlinie bedeutet lediglich das Indexieren eines neuen Dokuments. Das Deaktivieren eines Feldes ist eine Feldaktualisierung. Keine Codeänderungen, keine Deployments, keine Neustarts.</p><h2><strong>Von der Suche zur gesteuerten Abfrage</strong></h2><p>Der Perkolator liefert das schnelle Rückwärtsabgleich-Primitiv, das die Architektur der Steuerungsebene aus <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Teil 3</a> im großen Maßstab in die Praxis umsetzt. Richtlinien sind Daten, die gespeichert und indexiert und dann effizient mit eingehenden Suchzeichenfolgen abgeglichen werden. Die Steuerungsebene fügt übereinstimmende Richtlinien durch die in Teil 3 beschriebene kaskadierende Transformation und Konfliktlösung pro Feld zu einem geregelten Ausführungsplan zusammen. Und die Abruf-Engine führt den festgelegten Ausführungsplan für den Produktkatalog aus.</p><p>Das Ergebnis ist ein System, bei dem ein Händler eine neue Richtlinie erstellen kann, ohne den Anwendungscode anzurühren, sie anhand repräsentativer Abfragen testen, in die Produktion übernehmen und sofort ihre Wirkung sehen kann. Der Perkolator beschleunigt die Richtliniensuche, die Steuerungsebene sorgt für eine deterministische Richtlinienkomposition, und der geregelte Workflow gewährleistet die Sicherheit des gesamten Prozesses.</p><h2><strong>Wie geht es weiter in dieser Serie?</strong></h2><p>Der nächste Beitrag in dieser Serie erweitert die kontrollierte Steuerungsebene um ein neues Gebiet. Er führt eine <strong>mehrstufige Sucharchitektur</strong> ein, die erklärt, wie man strenge, lockere und semantische Abrufe orchestrieren kann, während stabile Paginierung und Facetten erhalten bleiben.</p><h2><strong>Setzen Sie die reglementierte E-Commerce-Suche in die Praxis um</strong></h2><p>Die in diesem Beitrag beschriebene, auf dem Perkolator basierende Steuerungsebene – von Index-Mappings und Grenzmarkierungen bis hin zur durch Hervorhebungen gesteuerten Phrasenverfolgung und kaskadierender Richtlinienkomposition – wurde von Elastic Services Engineering als Teil unserer wiederholbaren E-Commerce-Suchbeschleuniger entwickelt. Jedes hier gezeigte Abfragebeispiel und jede Richtlinienstruktur stammt aus einem funktionierenden System, das gegen Unternehmensproduktkataloge validiert ist.</p><p>Wenn Sie eine kontrollierte, richtlinienbasierte Steuerungsebene auf Elasticsearch implementieren möchten, kommen Sie mit Elastic Services vielleicht schneller zum Ziel. Wenden Sie sich an <a href="https://www.elastic.co/consulting">Elastic Professional Services</a>.</p><h2>Nehmen Sie an der Diskussion teil</h2><p>Haben Sie Fragen zur Suchsteuerung, zu Abrufstrategien oder zur Sucharchitektur im E-Commerce? Nehmen Sie an der <a href="https://discuss.elastic.co/">Diskussion der Elastic-Community</a> teil.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-percolator-search-governance</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-percolator-search-governance</guid>
    <category><![CDATA[Operativer Betrieb]]></category>
    <dc:creator><![CDATA[Alexander Marquardt,Honza Král,Taylor Roy]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt19fcc31ad093ad30/6a170dbd7d8d67301070e799/5e485cdd52d78419ff0ac30a4192b953f6d70c61-1280x720.png" length="0" type="image/png"/>
    <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Aufbau einer Steuerungsebene zur Kontrolle der E-Commerce-Suche]]></title>
    <description><![CDATA[Wie Sie eine kontrollierte Steuerungsebene für den elektronischen Handel aufbauen, die widersprüchliche Suchrichtlinien in einem einzigen Ausführungsplan zusammenfasst (ohne Codeänderungen).]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-improve-retrieval">In Teil 1</a> und <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">Teil 2</a> dieser Serie wurde dargelegt, warum die E-Commerce-Suche eine <em>Steuerungsebene</em> benötigt, eine Entscheidungsebene zwischen der Abfrage des Benutzers und der Suchmaschine, die die Absicht klassifiziert, Einschränkungen durchsetzt und zur richtigen Suchstrategie weiterleitet (z. B. BM25, semantisch, hybrid). In diesem Beitrag wird gezeigt, wie diese Ebene mit Hilfe eines einfachen architektonischen Primitivs aufgebaut werden kann, bei dem die Richtlinien für die Abfrageinterpretation als Dokumente gespeichert und zur Abfragezeit über ein schnelles Reverse Matching abgerufen werden. Da neue Abrufrichtlinien (z. B. „Marke X fördern“ oder „nur Kategorie Y anzeigen“) keine Codeänderungen erfordern, ist das Ergebnis eine Routing-Schicht, die stabil bleibt, während sich die Richtlinien weiterentwickeln, und die die Abrufmaschinen in Umgebungen mit hohem Risiko sicher macht. Wenn Sie das Endergebnis dieser Architektur sehen möchten, bevor Sie weiterlesen, sehen Sie sich dieses Video an: <a href="https://www.youtube.com/watch?v=e1GuL9CYWAk">Fixing Search Relevance in Seconds: Introducing PRISM</a>.</p><h2>Warum die Interpretation von Abfragen oft zur Herausforderung wird</h2><p>Die Speicherung von Richtlinien als Code (if/else-Blöcke in der Anwendungsschicht) erzeugt zehntausende Zeilen fehleranfälliger Logik, die kein Indexieren für einen effizienten Richtlinienabruf zur Abfragezeit bietet. Die Iteration ist langsam (eine einzelne Änderung des Verhaltens von Abfragen kann einen sechswöchigen Deployment-Zyklus erfordern), die Verantwortlichkeit ist unklar (warum haben sich die Ergebnisse geändert?), und Geschäftsnutzer können das Suchverhalten ohne technische Einbindung nicht ändern. Dies wird auf der linken Seite des folgenden Bildes gezeigt::</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb84f89f4d9029df7/6a170f806234e077cddb1ab6/4e2cd5244ef8b9a05af6337a4825252f321a9a43-1377x768.png" alt="Bild mit zwei Überschriften, „Richtlinien als Code“ auf der linken Seite und „Richtlinien als Daten“ auf der rechten Seite. Die linke Seite zeigt bedingte Codeblöcke, die Regeln für die Abfrageverarbeitung definieren, mit Hinweisen zum Deployment, zu Änderungszyklen und zur sequentiellen Auswertung. Die rechte Seite zeigt JSON-Richtlinienobjekte mit Titeln, Match-Begriffen, Aktionen, Filtern und Prioritäten sowie Hinweise zur Speicherung in einem Elasticsearch-Index, Aktualisierungsverhalten und indexiertem Matching." /><p>Das Speichern von Richtlinien als Daten in einem Elasticsearch-Index ist auf der rechten Seite des obigen Bildes dargestellt. Dieser Ansatz löst alle Probleme, die mit der fest codierten Abfrage-Auflösungslogik verbunden sind. Allerdings benötigen Sie dafür eine Möglichkeit, schnell zu ermitteln, welche Richtlinien mit der Nutzerabfrage übereinstimmen und wie Konflikte gelöst werden sollten. Hier kommt die kontrollierte Steuerungsebene ins Spiel.</p><h2>Muster der Steuerungsebene</h2><p>Eine kontrollierte Steuerungsebene befindet sich zwischen der rohen Nutzerabfrage und dem Elasticsearch-Abruf. Sie empfängt den Nutzertext als Eingabe und gibt einen Ausführungsplan aus, der Filter, Boosts und Entscheidungen zur Weiterleitung der Suchergebnisse enthält.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0585c90830d63d02/6a170f82964cea7a5908bc8b/5562da5de521f3c83ed55a13e9be87ca7fa70109-546x489.png" alt="Diagramm zur Veranschaulichung zweier Suchabläufe durch eine gesteuerte Kontrollebene: einer, bei dem eine Textabfrage für „Orangen“ vor der Produktsuche mit einer Kategoriebeschränkung umgeschrieben wird, und ein anderer, bei dem eine semantische Abfrage für „Geschenk für Großvater“ umgeschrieben und weitergeleitet wird, um passende Produkte aus einem Produktkatalog abzurufen." /><p>Eine Pipeline für die Steuerungsebene besteht aus:</p><ol><li><p><strong>Nutzerabfrage: </strong>Ein Nutzer gibt eine Zeichenfolge ein, wonach er sucht, zum Beispiel „Orangen“ oder „Geschenk für Opa“.</p></li><li><p><strong>Richtliniensuche: </strong>Ordnen Sie die Nutzerabfrage dem Richtlinienindex zu.</p></li><li><p><strong>Übereinstimmende Richtlinien zurückgeben:</strong> Richtlinien, die der Nutzerabfrage entsprechen, werden aus dem Richtlinienindex zurückgegeben.</p></li><li><p><strong>Richtlinienanwendung: </strong>Die Steuerungsebene analysiert diese zurückgegebenen Richtlinien und fügt übereinstimmende Richtlinien zu einem einzigen kohärenten Ausführungsplan zusammen, der Filter, Boosts, Überschreibungen und Leitplanken umfasst und die geeignete Abrufmethode anwendet (z. B. lexikalisches Abrufen, semantisches Abrufen oder einen hybriden Ansatz).</p></li><li><p><strong>Ausführung:</strong> Die modifizierte <em>intent-bewusste</em> Elasticsearch-Abfrage wird an die Anwendung weitergegeben, um sie gegen einen Produktkatalogindex auszuführen.</p></li><li><p><strong>Erklärung (optional):</strong> Zusätzlich zur Erstellung einer Abfrage, die geschäfts- und absichtsorientierte Ergebnisse liefert, bietet die Steuerungsebene eine optionale Nutzlast zur Erklärbarkeit, um zu zeigen, welche Richtlinien ausgelöst und wie sie kombiniert wurden.</p></li></ol><p>Um herauszufinden, welche Richtlinien für die Suchzeichenkette eines Nutzers angewendet werden sollten, ist ein schnelles, rückwärts abgestimmtes Primitiv erforderlich, das wir mit der <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-percolate-query">Perkolator-Abfrage</a> lösen. Nach dem Abrufen relevanter Richtlinien erfordert die Kombination mehrerer übereinstimmender Richtlinien zu einem einheitlichen Ausführungsplan ein Framework zur Beurteilung: Prioritäten, Konfliktstrategien, die Verfolgung verbrauchter Phrasen und kaskadierende Transformationen, die Richtlinien in einer Sequenz anstatt unabhängig voneinander anwenden. Darüber hinaus muss die am besten geeignete Abruftechnologie ausgewählt werden (zum Beispiel <a href="https://www.elastic.co/elasticon/conf/2016/sf/improved-text-scoring-with-bm25">BM25</a> für „Orangen“ versus <a href="https://www.elastic.co/docs/solutions/search/semantic-search">semantische Suche</a> für „Geschenk für Opa“).</p><h2>Richtliniensuche: Überprüfung der Abfrage vor der Produktsuche</h2><p>Wenn ein Kunde eine Abfrage eingibt, sendet ein Suchsystem mit einer kontrollierten Steuerungsebene diese Abfrage nicht direkt, um sie gegen den Produktkatalog auszuführen. Zunächst wird die Abfrage gegen eine Reihe gespeicherter Richtlinien geprüft und modifiziert, um die Absicht der Abfrage und die Geschäftsprioritäten widerzuspiegeln.</p><h3>Richtlinienstruktur</h3><p>Jede Richtlinie ist ein einfaches Dokument, das zwei Dinge definiert:</p><ul><li><p><strong>Übereinstimmungskriterien:</strong> Welcher Abfragetext dazu führen sollte, dass diese Richtlinie ausgelöst wird. Dies kann eine exakte Phrase, ein einzelnes Wort, ein Muster oder eine Kombination sein.</p></li><li><p><strong>Aktion:</strong> Was tun, wenn die Richtlinie ausgelöst wird. Dies könnte das Anwenden eines Kategorienfilters, das Ausschließen von Produkten, das Extrahieren einer Preisbeschränkung oder die Änderung der Abrufstrategie sein.</p></li></ul><p>Das System findet alle passenden Richtlinien, setzt sie zu einem Ausführungsplan zusammen und führt erst dann die Produktsuche durch. Zusammengenommen wirken die Richtlinien wie ein sachkundiger Verkäufer, der versteht, was Sie suchen, und Sie zum richtigen Regal führt.</p><h3>Das Richtlinienmuster</h3><p>In den ersten Artikeln dieser Reihe wurden Beispiele für Richtlinien in Aktion vorgestellt: „Orangen" werden auf die Kategorie Obst und Gemüse beschränkt, „ohne Erdnüsse" als Ausschluss behandelt und „Geschenk für Opa" an die semantische Suche weitergeleitet. Der architektonische Kernpunkt ist, dass in jedem Fall die Abfrage anhand gespeicherter Richtlinien überprüft wird, bevor die Produktsuche beginnt. Die Richtlinien bestimmen, welche Einschränkungen angewendet werden, welcher Text geändert und welche Abrufstrategie verwendet werden soll. Die Abfrage gegen den Produktkatalog erfolgt, nachdem die Richtlinien angewendet wurden und eine neu geschriebene Abfrage erstellt wurde.</p><h3>Warum dies schnell ist</h3><p>Ein E-Commerce-System für Unternehmen kann Millionen von Produkten enthalten, aber nur Hunderte oder Tausende von Richtlinien. Der Suchschritt nach Richtlinien durchsucht einen kleinen kuratierten Index, nicht den vollständigen Produktkatalog, und erfolgt daher schnell. Da Richtlinien als Daten in einem eigenen Index gespeichert werden, müssen Händler, die eine neue Richtlinie hinzufügen, gar nicht erst den Anwendungscode berühren, und Techniker, die für die Optimierung der Produktsuche zuständig sind, kommen nicht mit dem Richtlinienindex in Berührung. Beide Probleme entwickeln sich unabhängig voneinander.</p><p>Die obigen Beispiele beschreiben, was konzeptionell geschieht. Unter der Haube wird die Richtliniensuche mit dem <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-percolate-query">Elasticsearch-Perkolator-Abfragetyp</a> implementiert, der speziell für dieses Muster entwickelt wurde: das Abgleichen eingehender Texte mit einer Reihe gespeicherter Abfragen. <a href="https://www.elastic.co/search-labs/blog/elasticsearch-percolator-search-governance">Teil 4</a> dieser Reihe bietet einen praktischen eingehenden Einblick in die Perkolator-Implementierung, einschließlich Index-Mappings, Grenzmarkern und von Highlights gesteuerter Phrasenverfolgung. Nachdem wir uns in Teil 4 eingehend mit dem Lookup-Mechanismus befasst haben, wollen wir uns nun der Frage zuwenden, was ein Richtliniendokument eigentlich enthält und wie die Steuerungsebene mehrere Richtlinien zu einem einzigen Ausführungsplan zusammensetzt.</p><h2>Beispielrichtlinien</h2><p>Nachdem wir nun erfahren haben, was Richtlinien konzeptionell bewirken, schauen wir uns an, was sie tatsächlich enthalten. Die beiden nachfolgenden Richtlinien wurden so gestaltet, dass sie absichtlich in Konflikt zueinander stehen. Dies soll das in den darauffolgenden Abschnitten beschriebene Konfliktlösungssystem veranschaulichen.</p><h3>Günstige Schokolade</h3><p>Die unten dargestellte Richtlinie erkennt, ob ein Nutzer eine Suchabfrage mit dem Begriff „günstige Schokolade“ gestellt hat. In diesem Fall beschränken sich die Ergebnisse auf die Kategorien „Schokolade“ und „Vollmilchschokolade“. Diese Richtlinie wendet auch einen Preisfilter von 2 $ an. Beachten Sie außerdem, dass diese Richtlinie eine Priorität von 210 hat. Darauf werden wir zurückkommen, wenn wir die Konfliktlösung genauer besprechen.</p><p>Die hier gezeigten Einstellungen für den Filtermodus und die Konfliktstrategie (hard_filter, soft_boost, restrict, override) werden im Abschnitt zur Konfliktlösung weiter unten ausführlich erläutert.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltada4d46e2ab26208/6a170f836f7f04f91f914924/bbcd66b20fc3aa861b5880ca67daf8e809698717-1002x890.png" alt="Eine Schnittstelle, die eine Regelkonfiguration mit einer Übereinstimmungsphrase für „günstige Schokolade“, Kategorie- und Preisfiltern, einem Feld zur Phrasenentfernung und Prioritätseinstellungen zeigt." /><p>Wenn die obige Richtlinie aktiviert ist, berücksichtigt eine Suche nach „günstige Schokolade“ den Preisfilter von 2 $ und beschränkt die Ergebnisse auf die Kategorien „Schokolade“ und „Milchschokolade“. Ein Beispiel für die Ergebnisse finden Sie weiter unten:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt368bdfbb9a6e5a5e/6a170f8566c4f975a1f8c10f/3f373af9a985864315d7639440a416e45a882a1b-1133x1146.png" alt="Eine Schnittstelle, die eine Regelkonfiguration mit einer Übereinstimmungsphrase für „günstige Schokolade“, Kategorie- und Preisfiltern, einem Feld zur Phrasenentfernung und Prioritätseinstellungen zeigt." /><h3>Weihnachtsschokolade</h3><p>Die unten gezeigte Richtlinie ist ein Beispiel für eine Richtlinie, die zur Weihnachtszeit angewendet werden könnte. Dieses Beispiel beschränkt die Ergebnisse auf „Weihnachtslebensmittel und -getränke“ und „Weihnachtssüßigkeiten“, hebt Produkte hervor, die auch in der Kategorie „Adventskalender“ enthalten sind, und wendet einen Preisfilter von weniger als 7 $ an, um sich auf erschwingliche saisonale Artikel zu konzentrieren. Beachten Sie außerdem, dass diese Richtlinie eine Priorität von 300 hat. Wir werden darauf zurückkommen, wenn wir die Konfliktlösung detaillierter besprechen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta3428d211f2d8304/6a170f86839dfa0049dcffb3/8f1179342d0e05cf78266d142b046021a3694368-1007x941.png" alt="Screenshot einer Elasticsearch-Regelabfrageschnittstelle, die eine match_phrase-Abfrage für „Schokolade“ zeigt, Filterregeln basierend auf Kategorien und Preis, Optionen zur Konfliktbehandlung und Einstellungen zur Regelpriorität." /><p>Wenn die oben genannte Richtlinie ohne widersprüchliche Richtlinien aktiviert ist, berücksichtigt eine Suche nach „Schokolade“ den Preisfilter von 7 $, beschränkt die Ergebnisse auf die Kategorien „Weihnachtslebensmittel und -getränke“ und „Weihnachtssüßigkeiten“ und hebt alle Produkte hervor, die mit „Adventskalender“ gekennzeichnet sind. Ein Beispiel für die Ergebnisse finden Sie weiter unten:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e7f1fe91b2cadcd/6a170f8866c4f90b0af8c113/662b0e40cb3a9291c17816c33169e9ff5b68f98d-1129x1085.png" alt="Suchergebnisseite mit einer Suchabfrage nach „Schokolade“ mit Kategorie- und Markenfiltern auf der linken Seite und einer Liste von Schokoladen-Adventskalenderprodukten mit Bildern, Preisen, Kategorien und Beschreibungen auf der rechten Seite." /><h2>Kombination übereinstimmender Richtlinien</h2><p>Die oben beschriebene Richtliniensuche ist nur die halbe Wahrheit. Die andere Hälfte ist das, was passiert, wenn mehrere Richtlinien derselben Abfrage entsprechen.</p><p>In jeder nichttrivialen Deployment wird eine einzelne Abfrage routinemäßig mehrere Richtlinien gleichzeitig auslösen. „Günstige Schokolade“ passt zu beiden oben dargestellten Richtlinien. Jede Richtlinie ist für sich genommen richtig. Die Herausforderung besteht darin, sie zu einem einzigen, kohärenten Ausführungsplan zusammenzustellen, ohne Widersprüche, ohne Doppelzählungen und ohne dass eine Richtlinie die Arbeit einer anderen stillschweigend rückgängig macht.</p><p>Dies ist kein Nachschlageproblem; es ist ein Beurteilungsproblem. Das System muss entscheiden:</p><ul><li><p><strong>Reihenfolge der Anwendung:</strong> Wenn eine Negationsrichtlinie „ohne Erdnüsse“ aus der Abfrage entfernt, sieht die Preisrichtlinie dann noch den Originaltext oder den geänderten Text?</p></li><li><p><strong>Filterkonflikte:</strong> Wenn zwei Richtlinien unterschiedliche Preisobergrenzen festlegen, welche zählt dann? Wird der Verlierer stillschweigend fallen gelassen oder degradiert er sich sanft zu einem soft Boost?</p></li><li><p><strong>Phrasenbesitz:</strong> Wenn zwei Richtlinien auf dasselbe Wort zutreffen und die erste es bereits belegt hat, sollte die zweite dann trotzdem greifen?</p></li></ul><p>Eine naive Implementierung (Anwendung aller übereinstimmenden Richtlinien unabhängig voneinander und Zusammenführung von Ergebnissen) führt zu Fehlern, sobald Richtlinien interagieren. Die Architektur benötigt ein explizites Modell dafür, wie sich Richtlinien zusammensetzen. In den nächsten beiden Abschnitten wird dieses Modell beschrieben: ein Framework zur Prioritätensetzung und Konfliktlösung sowie ein kaskadierendes Transformationsmodell, das die Interaktion zwischen Richtlinien deterministisch gestaltet.</p><p>Die zentrale Erkenntnis ist, dass die Anwendung von Richtlinien keine Reihe unabhängiger Abläufe darstellt, sondern eine kaskadierende Transformation. Jede Richtlinie erhält den von allen Richtlinien mit höherer Priorität erzeugten Rewrite-Zustand und transformiert ihn weiter:</p><p>Anfangszustand → [Richtlinie A] → Zustand' → [Richtlinie B] → Zustand'' → ... → Ausführungsplan</p><p>Der Zustand enthält den umgeschriebenen Abfragetext, akkumulierte Filter, die aktuelle Absicht und alle Synonym-Erweiterungen. Eine hochprioritäre Richtlinie kann Text aus der Abfrage entfernen, und jede nachfolgende Richtlinie sieht die geänderte Abfrage, nicht die ursprüngliche. Kontext wird akkumuliert. Die Reihenfolge ist wichtig.</p><h2>Priorität und Konfliktlösung: Der Determinismus zählt</h2><p>Die konkreten Konfliktstrategien sind eine bewusste Gestaltungsentscheidung. Einzelne Unternehmen können Konflikte unterschiedlich lösen, abhängig von ihren geschäftlichen Anforderungen. Der folgende Ansatz veranschaulicht die Art des Beurteilungs-Frameworks, die eine Steuerungsebene benötigt. Wichtig sind nicht diese spezifischen Strategien, sondern dass das System explizite, deterministische Strategien enthält, anstatt Konflikte durch unvorhersehbare Interaktionen lösen zu lassen.</p><h3>Prioritätsreihenfolge</h3><p>Die Richtlinien sind nach Priorität sortiert (höchste zuerst). Wenn mehrere Richtlinien mit derselben Abfrage übereinstimmen, werden sie in Prioritätsreihenfolge angewendet. Wenn zwei Richtlinien versuchen, dasselbe Filterfeld festzulegen, hat die deklarierte Strategie der Richtlinie mit höherer Priorität für dieses Feld Vorrang. Wenn mehrere Richtlinien ausgelöst werden, die dieselbe Priorität haben, erhält die Richtlinie mit der höchsten ID Vorrang (als ob ihr eine höhere Priorität zugewiesen wäre); diese Wahl sorgt für deterministisches Verhalten, wenn Konflikte auftreten.</p><h3>Auflösung pro Feld, nicht pro Richtlinie</h3><p>Ein kritisches Designprinzip: Die Konfliktlösung erfolgt pro Feld (zum Beispiel Marke, Kategorie oder Beschreibung), nicht pro Richtlinie. Wenn zwei Richtlinien Filter erzeugen, die sich bei bestimmten Feldern überschneiden, sind nur diese spezifischen Felder von der Konfliktlösungsstrategie betroffen, und die Auflösungsstrategie wird durch die übereinstimmende Richtlinie mit der höchsten Priorität bestimmt. Nicht kollidierende Felder aus beiden Richtlinien bleiben erhalten.</p><p>Dies ist wichtig, weil die Alternative eines richtlinienbasierten Ansatzes das System dazu zwingen würde, eine gesamte Richtlinie entweder zu akzeptieren oder abzulehnen, wenn nur ein Konflikt zwischen den Feldern besteht.</p><p>Bei der Auflösung pro Feld bleibt die maximale Menge an nützlichen Einschränkungsinformationen erhalten.</p><h3>Drei Einstellungen pro Filterfeld</h3><p>Jedes Filterfeld in einer Richtlinie hat drei unabhängige Einstellungen:</p><p><strong>Filtermodus:</strong> Wie der Filter angewendet wird, wenn es keinen Konflikt gibt.</p><ul><li><p><code>hard_filter</code> (Standard): Wird als <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-bool-query#score-bool-filter">Elasticsearch </a><a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-bool-query#score-bool-filter"><code>bool.filter</code></a> Klausel angewendet. Dies ist nützlich, um nicht verwandte Produkte vollständig auszuschließen. Wenn man beispielsweise die Suche nach „Orangen“ auf die Kategorie Obst und Gemüse beschränkt, werden Treffer wie Orangensaft und Orangenmarmelade ausgeschlossen. Nicht übereinstimmende Dokumente werden vollständig aus den Ergebnissen ausgeschlossen.</p></li><li><p><code>soft_boost</code>: Wird als <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-function-score-query">Elasticsearch </a><a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-function-score-query"><code>function_score</code></a>-Gewichtung mit einer konfigurierbaren <code>boost_weight</code> angewendet. Übereinstimmende Dokumente erhalten einen Ranking-Boost, aber nicht übereinstimmende Dokumente werden nicht ausgeschlossen. Das ist nützlich, um zum Beispiel eine Marke zu stärken, ohne andere Marken auszuschließen.</p></li></ul><h3>Konfliktstrategie</h3><p>Was passiert, wenn eine Richtlinie mit niedrigerer Priorität dasselbe Feld festlegt:</p><ul><li><p><code>override</code>: Der Wert dieser Richtlinie mit hoher Priorität gewinnt; der Wert mit niedrigerer Priorität wird vollständig ignoriert. Gültig für alle Feldtypen.</p></li><li><p><code>restrict</code>: Nehmen Sie den restriktiveren numerischen Wert (zum Beispiel die niedrigere Obergrenze für Preis__max, the higher floor for price__min). Gilt nur für numerische Bereichsfelder.</p></li><li><p><code>merge</code>: Kombinieren Sie beide Werte in eine Vereinigung. Gültig nur für nicht-numerische Felder.</p></li><li><p><code>soft_boost</code>: Konvertieren Sie den konfliktierenden Filter in ein <code>function_score</code>-Gewicht mit einer konfigurierbaren <code>boost_weight</code> anstelle eines festen Filters. Weitere Details zum Function_score-Boosting finden Sie unter <a href="https://www.elastic.co/search-labs/blog/bm25-ranking-multiplicative-boosting-elasticsearch">„Beeinflussung des BM25-Rankings mit multiplikativem Boosting in Elasticsearch“</a>. Dies gilt nur für Nicht-Negationsfelder.</p></li></ul><p><strong>Wert:</strong> Der tatsächliche Filterwert (z. B. eine Kategorienliste, ein Preisschwellenwert).</p><p><strong>Strategien nach Feldtyp: </strong>Nicht alle Strategien sind für alle Feldtypen sinnvoll. Zum Beispiel ist eine Ausschlussregel von Natur aus binär, daher kann sie keinen soft Boost erhalten. Die folgende Tabelle zeigt, welche Strategien für einzelne Feldtypen verfügbar sind:</p><p>Feldtyp</p><p>Verfügbare Strategien</p><p>Standard</p><p>Negationsfelder (__not, __match__not)</p><p>überschreiben, zusammenführen</p><p>Überschreiben</p><p>Numerische Bereichsfelder (__max, __min., __gt, __lt.)</p><p>einschränken, überschreiben, Soft-Boost</p><p>einschränken</p><p>Alle anderen Felder (Schlüsselwort, Text)</p><p>soft_boost, override, merge</p><p>soft_boost</p><p>Negationsfelder können nicht soft-geboostet werden, da die Ausschlüsse binär sind. Die Umwandlung von „zeige niemals Konserven“ in „ziehe Nicht-Konserven vor“ ändert die Semantik grundlegend. Ein Produkt aus „Konserven“ würde immer noch erscheinen, nur etwas niedriger eingestuft, was den Zweck des Ausschlusses unterläuft.</p><h2>Ein konkretes Beispiel: Die Suche nach „günstiger Schokolade“ während einer Weihnachtskampagne</h2><p>Angenommen, ein Händler hat die beiden zuvor demonstrierten Richtlinien für Schokolade erstellt, eine mit niedrigerer Priorität für günstige Schokolade und eine andere, höher priorisierte schokoladenbezogene Richtlinie, die während der Weihnachtszeit aktiviert wird. Wenn beide dieser Richtlinien aktiviert sind, hängt ihre Kombination vom Filtermodus und der Konfliktstrategie der Richtlinie mit höherer Priorität ab. Wenn beide zuvor besprochenen Richtlinien aktiviert sind, werden sie wie folgt kombiniert:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf930b42611a6126c/6a170f8aacf088ae28be9c1b/0405e193522172bde283180df96ed3651178fafc-529x447.png" alt="Screenshot, der eine Transformations-Pipeline zeigt, bei der eine anfängliche Abfrage „günstige Schokolade“ durch mehrere Regeln modifiziert wird, einschließlich hinzugefügter Kategorie- und Preisfilter, Konfliktlösungsverhalten, Regelprioritäten und einer endgültigen transformierten Abfrage von „Schokolade“." /><p>Dies zeigt zwei Konflikte, eine bei den Kategorien und eine beim Preis. Es sollte erwähnt werden, dass die Abfrage, die nach dieser Transformation ausgeführt wird, folgende Eigenschaften aufweist:</p><ul><li><p>Es werden nur Produkte aus den Kategorien „Weihnachtslebensmittel und -getränke“ und „Weihnachtssüßigkeiten“ angezeigt.</p></li><li><p>Innerhalb dieser Kategorien werden Produkte, die auch mit der Kategorie „Adventskalender“ gekennzeichnet sind, um das Dreifache aufgewertet.</p></li><li><p>Ein Preisfilter für 2 $ wird angewendet. Er stammt aus der Richtlinie mit niedrigerer Priorität (weil die Richtlinie mit höherer Priorität bei Konflikten „Restrict“ festlegt).</p></li><li><p>Das Wort „günstig“ wird entfernt und es werden nur Produkte zurückgegeben, die „Schokolade“ entsprechen.</p></li></ul><p>Wenn diese beiden Richtlinien aktiviert sind, gibt „billige Schokolade“ Ergebnisse zurück, die der Abbildung unten ähneln:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7e3c2ee36f963e8c/6a170f8ccdacbf5be17d2ac2/01bbab1c5bd3d0fd37e39c25973d60141f9796e9-1126x1123.png" alt="Suchergebnisseite, die eine Suche nach „günstiger Schokolade“ zeigt, mit Kategorie- und Markenfiltern auf der linken Seite und einer Liste von Schokoladen-Adventskalenderprodukten mit Bildern, Preisen und Produktdetails auf der rechten Seite." /><h3>Einschränkungen lockern</h3><p>Vielleicht möchte der Einzelhändler keine Produkte in den Kategorien „Schokolade“ und „Milchschokolade“ während der Weihnachtszeit ausschließen. Die Einstellungen der Weihnachtsrichtlinie könnten zu weit gefasst sein und versehentlich Kategorien entfernt haben, die von der Richtlinie für „günstige Schokolade“ abgedeckt werden. Dies ist ein Beispiel, das zeigt, warum es unter Umständen wünschenswerter sein kann, Richtlinien mit niedrigerer Priorität mit sich widersprechenden Richtlinien mit höherer Priorität zu kombinieren. Wir könnten beispielsweise die Weihnachtsschokoladen-Aktion so modifizieren, dass wir bei Konflikten nicht „Überschreiben“, sondern einen soft Boost durchführen. Die Änderung dieser Richtlinie würde wie folgt aussehen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbb7393566aeab705/6a170f8db0367d5b6472bde2/45e88311014d67933ca8cf8381d8f91de090e2b4-1090x103.png" alt="Benutzeroberfläche, die eine Suchrichtlinienregel anzeigt, wobei das Feld auf Kategorien, der Operator auf Gleich, die Werte „Weihnachtslebensmittel und -getränke“ und „Weihnachtssüßigkeiten“ eingestellt sind, die Konfliktbehandlung auf Soft mit Priorität 1 und der Filtermodus auf Hard-Filter eingestellt ist." /><p>Nach dieser Modifikation sieht die Ausführung der Transformationspipeline zur Abfrageumschreibung für „günstige Schokolade“ wie folgt aus:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6b4453b35b5f8ef0/6a170f8fb339d5ba9b76a09a/396b360e48327421c2c38bcf4a039fb1a6d5a8e0-519x445.png" alt="Screenshot einer Transformationspipeline, die zeigt, wie die Ausgangsabfrage „günstige Schokolade“ durch mehrere Regeln modifiziert wird, darunter Kategoriefilter, Preislimits, Soft-Boost- und Hard-Filter-Modi, Ergebnisse der Konfliktbehandlung, Regelprioritäten und eine endgültige Abfrage von „Schokolade“." /><p>Mit dem soft Boost bei Konflikten werden die miteinander in Konflikt stehenden Filter in softe Boosts umgewandelt, anstatt weggelassen zu werden. Die Abfrage, die nach dieser Umwandlung im Produktkatalog ausgeführt wird, hat die folgenden Eigenschaften:</p><ul><li><p>Weil „Bei Konflikt“ als „soft Boost“ in der höher priorisierten Richtlinie angegeben ist, werden die Konflikte wie folgt in Boosts umgewandelt:</p><ul><li><p>Produkte aus den Kategorien „Weihnachtslebensmittel und -getränke“ und „Weihnachtssüßigkeiten“ erhalten einen einfachen Boost.</p></li><li><p>Produkte aus den Kategorien „Schokolade“ und „Milchschokolade“ erhalten einen dreifachen Boost.</p></li></ul></li><li><p>Wie im vorherigen Beispiel, bei dem die Produkte auch als zur Kategorie „Adventskalender“ gehörig markiert sind, erhalten sie einen dreifachen Boost.</p></li><li><p>Wie im vorherigen Beispiel wird ein Preisfilter für 2 $ angewendet.</p></li><li><p>Das Wort „günstig“ wird entfernt und es werden nur Produkte zurückgegeben, die „Schokolade“ entsprechen.</p></li></ul><p>Bei weniger strenger Filterung sehen die Ergebnisse wie folgt aus:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0288336675c509ef/6a170f917d8d6723bc70e808/7a68c54d878dadfe8b1821dd3860b7b60f9ce45f-1126x1123.png" alt="Suchergebnisseite für die Suchabfrage „günstige Schokolade“, die links Kategorie- und Markenfilter und rechts eine Produktliste anzeigt, mit mehreren Schokoladenartikeln, Preisen, Kategorien und insgesamt 6.895 Ergebnissen oben." /><h3>Preisüberschreibung einer Richtlinie mit hoher Priorität</h3><p>Vielleicht möchte der Händler zu Weihnachten auch etwas teurere Schokoladenprodukte anzeigen, indem der Preis auf 7 $ erhöht wird. Um sicherzustellen, dass der Maximalpreis aus der Weihnachtsschokoladen-Richtlinie nicht überschrieben wird, wenn jemand nach „günstiger Schokolade“ sucht, können wir den Konfliktmodus des Preises folgendermaßen auf „überschreiben“ statt auf „einschränken“ setzen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltae1b40d312cf59e6/6a170f92cdacbfa1277d2ac6/c2621e6513281f545b84eb77362f2b93e1c46a1f-996x70.png" alt="Benutzeroberfläche, die eine Suchrichtlinienregel anzeigt, wobei das Feld auf Preis, der Operator auf Kleiner als, der Wert auf 7, die Konfliktbehandlung auf Überschreiben und der Filtermodus auf Harter Filter eingestellt ist." /><p>Mit dieser Überschreibung ignoriert die Abfrage für „billige Schokolade“ den in der „billigen Schokoladenrichtlinie“ definierten Höchstpreis und wendet nur den in der „Weihnachtsschokoladenrichtlinie“ festgelegten Preis an, wie folgt:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4a47aa71c925b4a3/6a170f94ab7f0863d3db9f6d/d50da7900beb3c08439e9fd79cbe2ddd98196441-511x389.png" alt="Screenshot einer Transformationspipeline, die detailliert zeigt, wie die anfängliche Abfrage „günstige Schokolade“ durch zwei Filterregeln verarbeitet wird, mit hinzugefügten Kategorie- und Preisfiltern, harten Filter- und weichen Boost-Modi, Konfliktlösungsergebnissen, Regelprioritäten und der Entfernung eines Preisfilters aufgrund eines Konflikts." /><p>Dies ähnelt dem vorherigen Beispiel, mit dem Unterschied, dass der Höchstpreis auf den Wert von 7 $ aus der Richtlinie mit höherer Priorität festgelegt ist, weil in dieser Richtlinie „Überschreiben“ bei Konflikt angegeben wurde. Wenn der Weihnachtspreisfilter Vorrang hat, sehen die Ergebnisse wie folgt aus:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2b9ac1a62437c967/6a170f96839dfa3f58dcffb9/635ee6353ba84727486e7e053764788fb26b6f44-1134x1079.png" alt="Suchergebnisseite für die Abfrage „günstige Schokolade“, die links Kategorie- und Markenfilter und rechts eine Liste von Schokoladenprodukten anzeigt, darunter mehrere Adventskalender mit Bildern, Preisen, Kategorien und insgesamt 10.000 angezeigten Ergebnissen." /><p>Diese drei Varianten (override, soft_boost und override on price) zeigen eine zentrale Eigenschaft des Systems: Ein Merchandiser kann die Interaktion zweier Richtlinien ändern, indem er eine Einstellung in einem einzelnen Feld innerhalb einer einzelnen Richtlinie ändert, ohne Code bereitzustellen. Die Konfliktstrategie ist der Hebel, der das Geschäftsverhalten steuert.</p><h2>Verfolgung verwendeter Phrasen</h2><p>Es gibt eine subtilere Form des Konflikts: zwei Richtlinien, die auf dieselbe Phrase zutreffen. Wenn eine Richtlinie mit höherer Priorität „ohne Erdnüsse“ aus der Abfrage entfernt, hat eine Richtlinie mit niedrigerer Priorität, die ebenfalls auf „ohne“ zutrifft, nichts mehr, worauf sie wirken kann. Das System erkennt, ob die übereinstimmende Phrase nicht mehr in der umgeschriebenen Abfrage vorhanden ist, und überspringt die Richtlinie mit niedrigerer Priorität.</p><p>Intent-Richtlinien sind von der Verfolgung verbrauchter Phrasen ausgenommen: Sie legen die Abrufstrategie basierend auf der ursprünglichen Abfrageübereinstimmung fest, unabhängig davon, welcher Text durch Richtlinien mit höherer Priorität entfernt wurde.</p><p>Gemeinsam verleihen Prioritätsordnung, feldbasierte Konfliktlösung und die Verfolgung verbrauchter Phrasen der Steuerungsebene ein deterministisches Kompositionsmodell. Auf dieser Grundlage kann das System eine Routing-Entscheidung treffen, die ohne sie riskant wäre.</p><h2>Governance macht die Abrufstrategie sicher</h2><p>Eine wichtige Erkenntnis bezüglich des Routings zur richtigen Abrufmethode (textuell, semantisch oder hybrid) ist, dass sie nach der Governance ausführen wird. Wenn Ihre Richtlinien bereits die „Produktkategorie“ durchgesetzt haben, ist der semantische Abruf wesentlich weniger riskant, da die Kandidatenmenge eingeschränkt ist. Eine semantische Suche mit über 500 Produktartikeln ist eine ganz andere Sache als eine semantische Suche über 500.000 SKUs. Die Governance schränkt den Explosionsradius ein, bevor der Abruf beginnt.</p><p>Ohne entsprechende Steuerung könnte beispielsweise eine semantische Abfrage nach „Obst mit hohem Vitamin-C-Gehalt unter 4 $“ neben Obst auch Vitaminpräparate, Karotten und grüne Paprika zurückgeben. Die Steuerungsebene stellt sicher, dass diese unerwünschten Ergebnisse nicht einmal als Teil der semantischen Erweiterung in Betracht gezogen werden.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdaa3ff1bb3afaa36/6a170f97acf088954bbe9c1f/6dccd5b8a94bfa81f68e3d1c4ad8929ce8cc4e5e-990x378.png" alt="Diagramm, das den Ablauf einer Suchabfrage vom Nutzer über einen Anwendungsserver und eine Steuerungsebene zeigt, wo Übereinstimmungsregeln nachgeschlagen, die Abfrage mit semantischer Absicht einschließlich Kategorie- und Preisbeschränkungen umgeschrieben und Ergebnisse aus einem Produktkatalog abgerufen werden, wobei nicht übereinstimmende Produkte ausgeschlossen werden." /><p>Mit dieser Einschränkung wendet die Steuerungsebene pragmatische Routing-Logik an:</p><ul><li><p><strong>Lexikalisch</strong> für Navigations- und Hauptabfragen, bei denen deterministische Präzision zählt.</p></li><li><p><strong>Semantisch</strong> für beschreibende Discovery-Abfragen, bei denen ein Konzeptabgleich hilft.</p></li><li><p>Selektiv <strong>hybrid</strong>, wenn Beschränkungen bereits durchgesetzt wurden und das Unternehmen einen umfassenderen Abruf akzeptiert.</p></li></ul><h2>Von der Architektur bis zur Implementierung</h2><p>Die kontrollierte Steuerungsebene übersetzt die Geschäftsabsicht in deterministische, zusammensetzbare Ausführungspläne, ohne diese Logik in den Anwendungscode einzubetten. Richtlinien sind Daten: Sie werden zur Abfragezeit abgeglichen, durch explizite Konfliktstrategien pro Feld aufgelöst und als kaskadierende Transformationen angewendet, die erklärbare Ergebnisse liefern. Elastic Services Engineering hat diese Architektur für E-Commerce-Teams in Unternehmen entwickelt und implementiert, wobei wiederholbare Muster und Beschleuniger verwendet wurden, die den Weg vom Konzept zur Produktion komprimieren. Eine Demo unserer Implementierung einer Steuerungsebene können Sie auf YouTube unter folgendem Link ansehen: <a href="https://www.youtube.com/watch?v=e1GuL9CYWAk">Fixing Search Relevance in Seconds: Introducing PRISM</a>.</p><h3><strong>Wie geht es weiter in dieser Serie?</strong></h3><p>Der nächste Beitrag geht praktisch auf die Implementierung ein: wie der Elasticsearch-Perkolator die Richtliniensuche beschleunigt, einschließlich Index-Mappings, Grenzmarkern, von Highlights gesteuerter Phrasenverfolgung und konkreter Abfragebeispiele.</p><h2>Setzen Sie die reglementierte E-Commerce-Suche in die Praxis um</h2><p>Die in diesem Beitrag beschriebene Architektur der Steuerungsebene (Konfliktlösung pro Feld, kaskadierende Richtlinien-Transformationen und durch Governance beschränktes Retrieval-Routing) wurde von Elastic Services Engineering entworfen und entwickelt. Jedes Muster, jeder Screenshot und jede Transformationspipeline, die in dieser Serie gezeigt wird, stammt aus einem funktionierenden System, das von Elastic Services Engineering entwickelt und anhand von Produktkatalogen im Unternehmensmaßstab validiert wurde.</p><p>Wenn Sie eine kontrollierte, richtliniengesteuerte Steuerungsebene in Elasticsearch implementieren möchten, kann <a href="https://www.elastic.co/consulting">Elastic Services</a> Sie schneller dorthin bringen.</p><h2>Nehmen Sie an der Diskussion teil</h2><p>Haben Sie Fragen zur Suchsteuerung, zu Abrufstrategien oder zur Sucharchitektur im E-Commerce? Nehmen Sie an der <a href="https://discuss.elastic.co/">Diskussion der Elastic-Community</a> teil.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture</guid>
    <category><![CDATA[Operativer Betrieb]]></category>
    <dc:creator><![CDATA[Alexander Marquardt,Honza Král,Taylor Roy]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb84f89f4d9029df7/6a170f806234e077cddb1ab6/4e2cd5244ef8b9a05af6337a4825252f321a9a43-1377x768.png" length="0" type="image/png"/>
    <pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Neuindizierung von Datenströmen aufgrund von Mapping-Konflikten]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie Elasticsearch-Mapping-Konflikte durch Neuindizierung von Datenströmen beheben können. Dieser Blog erklärt den Neuindizierungsprozess und wie Sie sicherstellen, dass neue Daten korrekt zugeordnet werden.]]></description>
    <content:encoded><![CDATA[<p>Wenn es zu Mapping-Konflikten in Feldern kommt, egal ob diese dem Elastic Common Schema-Standard (ECS-Standard) entsprechen oder spezifisch für die Datenquelle sind, ist eine Neuindizierung Ihrer Daten mithilfe der Entwickler-Tools erforderlich. Diese Konflikte können jede nachgelagerte Funktion nach der Ingestion negativ beeinflussen, was möglicherweise zu ungenauen Ergebnissen führt oder die Nutzung des vollständigen Datensatzes in Funktionen wie Visualisierungen, Dashboards, der Security App und Aggregationen verhindert. Dieser Blogbeitrag beschreibt die Schritte dieses Neuindizierungsprozesses.</p><p>Der Inhalt dieses Blogbeitrags wurde mit den Elastic-Versionen 9.2.8 und 8.19.14 sowie den Filestream Integration Versionen 2.3.0 und 1.2.0 entwickelt und verifiziert.</p><p><strong>Wichtiger Hinweis:</strong> Je nach Umgebung sind für einige Schritte spezielle Anpassungen erforderlich. Beachten Sie außerdem, dass dynamische Vorlagen ab Filestream Integration Version 2.3.3 aus der <code>@package</code>-Komponentenvorlage entfernt wurden.</p><p>Bevor Sie mit dem Reindexierungsprozess beginnen, ist es wichtig, die aktuelle Speicherzuweisung in Ihrer Umgebung zu berücksichtigen. Die unten beschriebenen Schritte beinhalten das Erstellen einer Kopie des bestehenden Backing-Index, der vorübergehend im <a href="https://www.elastic.co/docs/manage-data/lifecycle/data-tiers">hot Tier</a> liegt.</p><p><u><strong>Elasticsearch-Datenebenen</strong></u></p><ul><li><p><strong>Heiß: </strong>Die heiße Ebene ist der Einstiegspunkt von Elasticsearch für Zeitreihendaten, in der die aktuellsten und am häufigsten durchsuchten Daten gespeichert werden. Nodes der heißen Ebene erfordern schnelle Lese- und Schreibvorgänge, also mehr Ressourcen und schnelleren Speicher (SSDs). Diese Ebene ist obligatorisch und neue Datenstromindizes werden ihr automatisch zugeordnet.</p></li><li><p><strong>Warm: </strong>Zeitreihendaten können in die warme Ebene verschoben werden, sobald sie seltener abgefragt werden als die kürzlich indizierten Daten in der heißen Ebene. Die warme Ebene enthält in der Regel Daten der letzten Wochen. Aktualisierungen sind weiterhin erlaubt, aber wahrscheinlich selten. Die Nodes in der warmen Ebene müssen im Allgemeinen nicht so schnell sein wie die in der heißen Ebene. Für die Ausfallsicherheit sollten Indizes in der warmen Ebene so konfiguriert werden, dass sie eine oder mehrere Replikate verwenden.</p></li><li><p><strong>Kalt: </strong>Daten, die nur selten durchsucht werden, können von der warmen in die kalte Ebene verschoben werden. Die kalte Ebene ist zwar immer noch durchsuchbar, aber die geringeren Speicherkosten haben Vorrang vor der Suchgeschwindigkeit. Alternativ kann die kalte Ebene reguläre Indizes mit Replikaten anstelle von durchsuchbaren Snapshots speichern, wodurch für ältere Daten kostengünstigere Hardware verwendet werden kann, ohne dass der Festplattenspeicherbedarf im Vergleich zur warmen Ebene reduziert wird.</p></li><li><p><strong>Eingefroren: </strong>Daten, die nur selten oder gar nicht mehr abgefragt werden, werden für den Rest ihres Lebenszyklus von der Kategorie „Kalt“ in die Kategorie „Eingefroren“ verschoben. Diese Ebene nutzt ein Snapshot-Repository und teilweise eingebundene Indizes zum Speichern und Laden von Daten, wodurch der lokale Speicherplatz und die Kosten reduziert werden, während die Suche weiterhin möglich ist. Suchvorgänge auf der eingefrorenen Ebene sind im Allgemeinen langsamer als auf der kalten Ebene, da Elasticsearch möglicherweise eingefrorene Daten aus dem Snapshot-Repository abrufen muss. Wir empfehlen dedizierte Nodes für die eingefrorene Ebene.</p></li></ul><h2>Voraussetzungen: Ermitteln Sie, welche Felder Konflikte aufweisen</h2><p>Um festzustellen, welche Felder Mapping-Konflikte aufweisen, navigieren Sie zu <strong>Stack Management –&gt; Data Views –&gt; Logs-*</strong> (die Verwendung der Data View Logs- ist die höchste Hierarchie der vorhandenen Daten mit dem Präfix <em>Logs-</em>.) Sollten Konflikte auftreten, wird dies in einem gelben Feld vermerkt. Sie können entweder auf <strong>Konflikte anzeigen</strong> klicken, oder unter dem Feld <strong>Feldtyp</strong> neben dem <strong>Suchfeld </strong>die Option <strong>Konflikt</strong> auswählen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7aa17311023e1ae3/6a170feaa929cf24fbae0aa9/7d41594682b601a30a9544b8db678f118b0146ab-2048x720.png" alt="Oberfläche, die ein Logs-Indexmuster mit einer Warnung vor Mapping-Konflikten und einer Liste von Feldtypen anzeigt. Der Schwerpunkt liegt auf „Konflikte anzeigen“ und dem Feldtypkonflikt." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb4106cf39e1be69b/6a170feb6f7f047b74914932/41ad800daa6fc244a1123ba7538820bff5de6788-747x182.png" alt="Tabellenzeile, in der der Feldname log.offset mit den Typen keyword und long als Konflikt markiert ist." /><p>Wenn Sie auf die gelbe Schaltfläche <strong>Konflikt</strong> klicken, wird angezeigt, welche Indizes mit welchen Mapping-Typen verknüpft sind.</p><p>Diese Situation (in der das Feld sowohl als <code>keyword</code> als auch als <code>long</code> zugeordnet ist) tritt normalerweise auf, weil Daten ingestiert wurden, bevor ein spezifischer Mapping-Typ im <a href="https://www.elastic.co/docs/manage-data/data-store/templates#component-templates">Komponenten-Template</a> für den relevanten <a href="https://www.elastic.co/docs/manage-data/data-store/data-streams">Datenstrom</a> definiert wurde. In solchen Fällen versucht Elasticsearch, das Mapping auf Basis seiner dynamischen Vorlagen festzulegen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdcec2cd42e2e858a/6a170feda929cff2e4ae0aad/9973c1935aa52292c1ace09a8e9c0b31ad99e7a2-2048x1085.png" alt="Bildschirm mit Anzeige des Feldes log.offset, einem Warnhinweis zu unterschiedlichen Datentypen und einer Tabelle mit den Indizes für jeden Datentyp." /><p>Um festzustellen, welches Mapping für das Feld geeignet ist und ob es sich um ein ECS-Feld handelt, ist eine Verifizierung mit <a href="https://www.elastic.co/docs/reference/ecs/ecs-field-reference">ECS-Feldreferenz</a> erforderlich. Wenn das betreffende Feld kein ECS-Feld ist, muss sein Wert überprüft werden, um das korrekte Mapping zu bestimmen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc22eb597f97cbb24/6a170feed7c02291c5de657c/3c77d0a1520bd1ad17e7ffa1480ecf5e224953e1-418x360.png" alt="" /><p>Wenn ein Feld, wie <code>log.offset</code> in diesem Beispiel, im ECS nicht dokumentiert ist, bestehen die nächsten Schritte darin, den Feldwert zu untersuchen, den widersprüchlichen Mapping-Typ mit den meisten Backing-Indizes zu bestimmen und die Komponentenvorlagen der anderen Indizes zu prüfen.</p><p>In der Regel ist der Mapping-Typ mit der höchsten Anzahl an Indizes der richtige. Wir empfehlen Ihnen jedoch, den Wert des betreffenden Feldes zu überprüfen, um dies zu bestätigen. Um die Gültigkeit eines Mapping-Typs (zum Beispiel <code>long</code>) zu bestätigen, müssen Sie außerdem überprüfen, ob der Wert des Feldes für diesen Typ angemessen ist. Diese Verifizierung kann erfolgen, indem Sie <strong>Discover </strong>verwenden, um nach dem betreffenden Feld zu suchen. Die Überprüfung anderer Datenströme, die dasselbe Feld enthalten, kann ebenfalls zusätzliche Bestätigungen liefern.</p><p>Um die Werte für das Feld mit dem Mapping-Konflikt zu überprüfen, navigieren Sie zurück zu der bereits erwähnten gelben Schaltfläche <strong>Konflikt</strong>, klicken auf die Schaltfläche <strong>Konflikt</strong>, markieren einen der Backing-Indizes und fügen ihn in eine <strong>Discover-Sitzung </strong>ein. Die Anweisung Ihrer Kibana-Abfragesprache (KQL) sollte wie der folgende Screenshot aussehen, um den Feldbegrenzer <strong><code>_index</code></strong><strong>:</strong> einzuschließen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4b1966dbd35b7264/6a170ff00c4857919a01ab52/781f63b34a9abd427ceb896484da29af446e3326-2048x1063.png" alt="Bildschirm mit Anzeige des Feldes log.offset und einer Warnung bezüglich eines Typkonflikts, sowie einer Tabelle mit den Indizes für jeden Typ." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdf3bb65faeb1e94b/6a170ff214b2701bfbe3c6c3/b7b0cb847c1694ab605c61a538722f5be004ec86-2048x909.png" alt="Bildschirm mit Anzeige eins zeitbasierten Histogramms und einer Tabelle mit Log-Einträgen, die Zeitstempel und Log-Offset-Werte enthalten." /><h2>Bereiten Sie die neue benutzerdefinierte Komponentenvorlage für den Backing-Index vor</h2><p>Um den Mapping-Konflikt im Datenstrom zu beheben, untersuchen Sie zuerst die relevante <code>@package</code>-Komponentenvorlage. Sie finden diese unter <strong>Stack Management -&gt; Index Management -&gt; Component Template</strong>. Suchen Sie nach dem Datenstrom und wählen Sie den entsprechenden <code>@package</code> Link aus. Diese Vorlage enthält grundlegend Mappings für die Felder, denn selbst wenn ein Mapping-Konflikt nicht häufig vorkommt, kann der passendere Typ leicht übersehen werden.</p><p>Überprüfen Sie die Vorlage, um sicherzustellen, dass sie die notwendige Feldverschachtelung und das Mapping für das betreffende Feld enthält. Wenn zum Beispiel die Vorlage <code>log.offset</code> fälschlicherweise als <code>keyword</code> angibt, ist dies die Ursache des Problems.</p><p><strong>Wichtig:</strong> Da das Ändern von <code>@package</code>/Managed-Vorlagen nicht empfohlen wird, müssen Sie eine <code>@custom</code>-Komponentenvorlage verwenden oder erstellen, um den Mapping-Typ (zum Beispiel <code>log.offset</code>) für alle zukünftigen Daten zu korrigieren.</p><ul><li><p>Wir empfehlen nicht, die <code>@package</code>/Managed-Vorlagen zu ändern, da beim Aktualisieren der Integration auf eine neuere Version alle Änderungen, die Sie an der <code>@package</code>-Vorlage vornehmen, überschrieben werden. Deshalb empfehlen wir die Verwendung der <code>@custom</code>-Vorlagen.</p></li><li><p>Wenn ein Datenstrom Mapping-Konflikte aufweist, müssen Sie alle fehlenden Feld-Nestings (ECS und Nicht-ECS) oder Mappings zur <code>@custom</code> Komponentenvorlage des Datenstroms hinzufügen. Erstellen Sie diese Vorlage, falls sie noch nicht existiert, und stellen Sie sicher, dass Sie den korrekten Mapping-Typ für das Feld angeben.</p></li><li><p>Wenn mehrere Konflikte in Ihrer Datenquelle vorliegen, wenden Sie alle erforderlichen fehlenden Mappings für den Datenstrom gleichzeitig an, damit die Neuindizierung einmal statt mehrmals durchgeführt wird. Einträge für die korrekte Datentypisierung in der <code>@custom</code>-Komponentenvorlage stellen sicher, dass jede zukünftige Daten-Ingestion der gleichen Mapping-Richtlinie folgt.</p></li></ul><p>Um die <code>@custom</code>-Komponentenvorlage zu erstellen (oder zu überprüfen, ob sie verwendet und ausgefüllt ist), navigieren Sie zu <strong>Index Templates</strong>, geben den Namen des betreffenden Datenstroms ein und klicken auf die entsprechende <code>@custom</code>-Vorlage, die vom Datenstrom verwendet wird. Falls die Vorlage noch nicht erstellt wurde, erscheint ein gelbes Feld, über das Sie die Vorlage mithilfe der Benutzeroberfläche erstellen können.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt17b6cb8aa8f905c2/6a170ff4964cea702708bc97/bea7cb172227bebc28146e3f2f016e112f34cba5-2048x720.png" alt=" Bildschirm mit einer Indexvorlage inklusive Zusammenfassung, Indexmuster, Prioritätswert, Datenstromeinstellung und einer Liste der Komponentenvorlagen, wobei der Fokus auf dem Eintrag logs‐filestream.generic@custom liegt." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf5b67199089093f4/6a170ff5d7c0220575de6580/e8f63a2e396efbe7f1e62dc08a137a22700be484-2048x296.png" alt=" Screenshot der Indexverwaltungsoberfläche mit ausgewähltem Tab „Komponentenvorlagen“ und dem Hinweis, dass die benutzerdefinierte Vorlage nicht existiert. Der Fokus liegt auf „Komponentenvorlage erstellen“." /><p>Der untenstehende Screenshot zeigt die nächste Seite, sobald die <strong>Create Component Vorlage</strong> ausgewählt ist. Lassen Sie die Standardwerte auf der ersten Seite unverändert und klicken Sie auf <strong>Mappings</strong> oder <strong>Weiter</strong>, bis Sie die <strong>Mappings-Seite</strong> erreichen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltca2924bc41cac541/6a170ff7dc55decfd6e00ec5/822f1d864302aa4be438c13756b8372f43fa1b0d-2048x1275.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltee1067cb282ae0af/6a170ff82b835f55bff4b2e5/affa2f1214af516a5a6b571ab813628ed7649275-2048x1235.png" alt="Vorlagen-Mappings" /><p>Um das Mapping für ein neu eingehendes Feld explizit festzulegen oder ein Feld zu aktualisieren, bei dem ein Mapping-Konflikt besteht, wenn der Datenstrom aufgrund einer in der Indexlebenszyklusrichtlinie festgelegten Konfiguration überschrieben wird, ist ein Eintrag für das Feld erforderlich, in dem der Konflikt besteht.</p><p>Im Folgenden wird das Mapping für das Feld <code>log.offset</code> in der Komponentenvorlage <code>@custom</code> für den Filestream-Datenstrom festgelegt. Wiederholen Sie die Schritte, um gegebenenfalls benutzerdefinierte Felder hinzuzufügen oder notwendige Felder aus dem <code>@package</code> mit den entsprechenden Mappings für diesen Datensatz zu aktualisieren. In diesem Beispiel ist bei der Einstellung des Offsets auf <code>Long</code> der Feldtyp <code>Numeric</code> und der numerische Typ <code>Long</code>. Klicken Sie auf <strong>Feld hinzufügen</strong> und dann außerhalb des Bereichs, um fortzufahren.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltee1067cb282ae0af/6a170ff82b835f55bff4b2e5/affa2f1214af516a5a6b571ab813628ed7649275-2048x1235.png" alt="Bildschirm mit Anzeige der Schnittstelle zur Erstellung von Komponentenvorlagen, wobei im Workflow der Schritt „Mappings“ ausgewählt ist." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt611a10bd7567d211/6a170ffa964cea257008bc9d/ea2975ee4e40ac0e10c4170d2a23125101f7f8da-2048x1136.png" alt=": Bildschirm, der die Schnittstelle zur Erstellung von Komponentenvorlagen mit dem im Workflow ausgewählten Schritt „Mappings“ zeigt" /><p>Sobald alle benötigten Felder hinzugefügt wurden, gehen Sie sie zum Überprüfen durch und wählen Sie <strong>Komponenten-Vorlage erstellen</strong>, wenn Sie bereit sind. Alle neuen Daten, die ab diesem Schritt importiert werden, haben <code>log.offset</code> auf <code>long</code> gesetzt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3a0c86021cc53e0e/6a170ffcc1e8a57703f8839f/bdf8b8290b0c064c9d88990194b15232ffe85709-2048x1027.png" alt=" Template-Überprüfung Elasticsearch" /><h2>Erstellung der neuen Backing-Index-Struktur</h2><p>Der neue Backing-Index muss die vorhandenen Mappings aus der Komponentenvorlage des Datenstroms sowie der ECS- <code>ecs@mappings</code>-Komponentenvorlage enthalten. Die <code>ecs@mappings</code>-Komponentenvorlage wird nach der Komponente des Datenstroms als Auffangbecken für zusätzliche Mappings angewendet, die möglicherweise in den vorherigen Komponentenvorlagen nicht erfasst wurden.</p><p>Navigieren Sie zum Browser-Tab für die <code>@package</code> Mappings des Datenstreams. (Gehen Sie zu <strong>Stack Management -&gt; Index Management -&gt; Component Template -&gt; </strong><strong><code>logs-filestream.generic@package</code></strong><strong> -&gt; Verwalten -&gt; Bearbeiten</strong>.) Dort klicken Sie dann auf den Abschnitt <strong>Überprüfen</strong> , dann auf <strong>Anfrage</strong> und schließlich auf die Schaltfläche <strong>Kopieren</strong> rechts. Der JSON-Inhalt der kopierten Komponentenvorlage stellt sicher, dass die verbleibenden Feld-Mappings und Einstellungen erhalten bleiben, während wir das <code>log.offset</code> Feld-Mapping aktualisieren. Das JSON bildet die Basisstruktur für den neu indizierten Basisindex.</p><p><strong>Wichtig: </strong>Wenn das JSON der Vorlage nicht kopiert wurde und die Arbeit mit der Neuindizierung fortgesetzt wurde, würde der <code>log.offset</code>-Konflikt gelöst werden, es würden jedoch neue Konflikte mit der Integration entstehen, da die Integrität der aktuellen Mappings nicht aufrechterhalten wurde, was doppelte Arbeit zur Lösung des ursprünglichen Problems nach sich zieht.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1de7b9b0e375867e/6a170ffd8b73cb61f318a0f7/402b0431b0e19374e9b28a4374ed51dfa5fa44ba-2048x897.png" alt="Bildschirm mit Anzeige der Oberfläche zur Erstellung von Komponentenvorlagen mit dem im Workflow ausgewählten Schritt „Überprüfen“. " /><p>Öffnen Sie einen zweiten Tab im Browser, wechseln Sie zu Dev Tools und fügen Sie den kopierten Inhalt ein. Nun muss das Eingefügte entfernt werden:</p><p><strong>Änderungen an der Anfrage</strong></p><p><strong>1. Indexname:</strong> Ersetzen Sie <code>_component_template/logs-filestream.generic@package</code> durch den Namen des Backing-Indexes, den Sie neu indizieren möchten, und fügen Sie <code>-1</code> am Ende an. Verwenden Sie zum Beispiel <code>PUT &lt;backing index to reindex&gt;-1</code>.</p><ul><li><p>Das angehängte <code>-1</code> steht für eine Neuindizierung und steht nicht in Konflikt mit den Standard-ILM-Rollover-Einstellungen, die auf dem Erstellungsdatum des Index basieren.</p></li></ul><p><strong>2. Einstellungen:</strong> Entfernen Sie die Zeile <code>"template"</code> (Zeile 3) sowie die allerletzte schließende Klammer für die gesamte JSON-Nutzlast. Zeile 3 sollte mit <code>"settings": {</code> beginnen.</p><ul><li><p>Ersetzen Sie den Inhalt des Abschnitts „Einstellungen“ durch <code>"index.codec": "best_compression"</code>. Diese Aktion wendet die beste Kompression von Elastic auf den Index bei der Erstellung an.</p></li><li><p>Fügen Sie <code>"index.lifecycle.name": "logs"</code> sowie eine Zeile für <code>"index.lifecycle.rollover_alias": ""</code> hinzu.</p><ol><li><p>Der Eintrag <code>"index.lifecycle.name": "logs"</code> wendet die ILM-Richtlinie für Logs auf den neuen zugrunde liegenden Index an. Ändern Sie den Namen der ILM-Richtlinie, wenn Sie keine Logs verwenden.</p></li><li><p>Der <code>"index.lifecycle.rollover_alias": ""</code> ist leer, da dieser Backing-Index nicht übertragen wird, aber die Einstellung ist erforderlich, um ILM-Rollover-Fehler in die nächste ILM-Phase nach der heißen Ebene zu vermeiden.</p></li></ol></li></ul><p><strong>3. Struktur:</strong> Die Anfrage sollte nun sowohl einen <code>Settings</code>-Abschnitt als auch einen <code>Mappings</code>-Abschnitt enthalten. Innerhalb von <code>"mappings": {</code> sollten Sie <code>"dynamic_templates"</code> und einen <code>"properties"</code> Abschnitt finden, der fest codierte Felder und deren Mappings enthält.</p><p><strong>4. Änderung dynamischer Vorlagen: </strong>Der aktuelle Abschnitt für dynamische Vorlagen enthält Einträge für Felder, die überschrieben werden können, wenn die nächsten <code>ecs@mappings </code>dynamischen Vorlagen hinzugefügt werden, was Redundanz und zusätzliche Zeilen verursacht, die nicht benötigt werden.</p><ul><li><p>Entfernen Sie alle Abschnitte in <code>"dynamic_templates"</code> außer dem zweiten Abschnitt mit dem Titel <code>"_embedded_ecs-data_stream_to_constant": {</code>.</p></li><li><p>Wiederholen Sie den gleichen Vorgang wie oben beschrieben, indem Sie die dynamischen Mappings für die <code>@package</code>-Komponentenvorlage sammeln, aber diesmal die dynamischen Mappings für die <code>ecs@mappings</code>-Komponentenvorlage.</p><ul><li><p>Es kann einfacher sein, den gesamten Inhalt der Mappings aus der Benutzeroberfläche für die <code>ecs@mappings</code>-Komponentenvorlage zu kopieren, in den Arbeitsbereich des Dev-Tools- <code>dynamic_templates</code>-Abschnitts einzufügen und doppelte und unnötige Zeilen entsprechend zu entfernen. Fügen Sie diese dynamischen Template-Einstellungsinhalte nach dem<code>"_embedded_ecs-data_stream_to_constant": {</code>-Eintrag ein. Der Abschnitt <code>dynamic_templates</code> sollte den untenstehenden Beispielinhalten in den Dev-Tools sehr entsprechen.</p></li></ul></li><li><p><strong>Wenn </strong><strong><code>dynamic_templates</code></strong><strong> nicht einbezogen oder vollständig entfernt werden</strong>, haben andere Felder (siehe untenstehenden Screenshot) doppelte Mappings: <code>text</code> und <code>keyword</code> im Vergleich zu den entsprechenden Mappings, falls der Abschnitt <code>dynamic_templates</code> enthalten geblieben wäre. Was übrig bleibt, sollte der Abschnitt <code>"properties"</code> unter <code>"mappings"</code> sein. Dies wird auch Probleme in der Datenquelle verursachen, da die Felder doppelt zugeordnet werden (falls sie nicht bereits auf diese Weise zugeordnet sind) und zusätzliche Mapping-Konflikte verursachen.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfb7494f882d7e358/6a170fffa6c2b93e46e797d2/24e972cd0fc8eadf943b21cfdd80a5d435e705aa-2048x994.png" alt="Code-Editor mit geteiltem Bildschirm, der Elasticsearch-Befehle auf der linken Seite und Index-Mappings auf der rechten Seite zeigt. Ein Pfeil zeigt auf den Text-Feldtyp in dem Mapping und ein weiterer Pfeil zeigt auf den Unterfeldtyp des Keywords." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcaca899f8d92e72b/6a1710010c485745e901ab5a/aac13fbe882516e5ed5b5b1b5271c0ae34e80b04-1890x2048.png" alt=": Bildschirm mit Anzeige der Indexmusterseite für Logs-* mit einer Warnung vor Mapping-Konflikten, wobei der Schwerpunkt auf den Auflistungen vom Typ „Schlüsselwort, Text“ für agent.ephemeral_id und agent.id in der Feld-Tabelle liegt." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2c692786ab74f1ca/6a171002964ceaa53c08bca1/c43d6f61c8ece4de2d51657f239a0c34ced07cdb-1928x1452.png" alt="Bildschirm, der die Indexmusterseite für logs-* mit einer Warnung über Mapping-Konflikte zeigt. Ein Pfeil zeigt auf die Typenangabe „ip, text“ für das Feld host.ip." /><p><strong>5. Metadaten-Entfernung:</strong> Löschen Sie den letzten Abschnitt mit der Bezeichnung <code>"_meta"</code>, sowie den Abschnitt mit der Bezeichnung <code>"version"</code>, falls vorhanden.</p><p><strong>6. Formatierung:</strong> Die verbleibenden Abschnitte automatisch einrücken und unnötige geschweifte Klammern anpassen oder entfernen, die eine erfolgreiche Ausführung verhindern würden.
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0906ffe338df1a9d/6a1710046f7f042aac914936/ebe1573647500de75315e7655256a0db9604c40d-2048x1402.png" alt="Code-Editor, der Elasticsearch-Indexeinstellungen und -Mappings anzeigt. Ein Dropdown-Menü ist rechts geöffnet, und ein Pfeil zeigt auf die Option „Automatisches Einrücken“ im Menü." /><p><strong>7. Mapping-Änderung:</strong> Navigieren Sie zum Abschnitt <code>"properties"</code>, suchen Sie <code>"log"</code> und dann <code>"offset"</code>, das darunter verschachtelt ist. Ändern Sie den Typ von <code>keyword</code> zu <code>long</code> und entfernen Sie den Zeileneintrag (inklusive Komma) mit der Bezeichnung <code>"ignore_above": 1024,</code>. Wenn mehr als ein Eintrag zur zuvor erstellten <code>@custom</code> Komponentenvorlage hinzugefügt wurde, fügen Sie diesen hier hinzu.</p><p>Ihre Dev Tools-Konsolenansicht sollte jetzt dem unten angegebenen Beispiel entsprechen.</p>PUT .ds-logs-filestream.generic-default-2026.04.14-000001-1
{
  "settings": {
    "index.codec": "best_compression",
    "index.lifecycle.name": "logs",
    "index.lifecycle.rollover_alias": ""
  },
  "mappings": {
    "dynamic_templates": [
      {
        "_embedded_ecs-data_stream_to_constant": {
          "path_match": "data_stream.*",
          "mapping": {
            "type": "constant_keyword"
          }
        }
      },
      {
        "ecs_timestamp": {
          "mapping": {
            "ignore_malformed": false,
            "type": "date"
          },
          "match": "@timestamp"
        }
      },
      {
        "ecs_message_match_only_text": {
          "path_match": [
            "message",
            "*.message"
          ],
          "mapping": {
            "type": "match_only_text"
          },
          "unmatch_mapping_type": "object"
        }
      },
      {
        "ecs_non_indexed_keyword": {
          "path_match": [
            "*event.original"
          ],
          "mapping": {
            "index": false,
            "type": "keyword",
            "doc_values": false
          }
        }
      },
      {
        "ecs_non_indexed_long": {
          "path_match": [
            "*.x509.public_key_exponent"
          ],
          "mapping": {
            "index": false,
            "type": "long",
            "doc_values": false
          }
        }
      },
      {
        "ecs_ip": {
          "path_match": [
            "ip",
            "*.ip",
            "*_ip"
          ],
          "mapping": {
            "type": "ip"
          },
          "match_mapping_type": "string"
        }
      },
      {
        "ecs_wildcard": {
          "path_match": [
            "*.io.text",
            "*.message_id",
            "*registry.data.strings",
            "*url.path"
          ],
          "mapping": {
            "type": "wildcard"
          },
          "unmatch_mapping_type": "object"
        }
      },
      {
        "ecs_path_match_wildcard_and_match_only_text": {
          "path_match": [
            "*.body.content",
            "*url.full",
            "*url.original"
          ],
          "mapping": {
            "fields": {
              "text": {
                "type": "match_only_text"
              }
            },
            "type": "wildcard"
          },
          "unmatch_mapping_type": "object"
        }
      },
      {
        "ecs_match_wildcard_and_match_only_text": {
          "mapping": {
            "fields": {
              "text": {
                "type": "match_only_text"
              }
            },
            "type": "wildcard"
          },
          "unmatch_mapping_type": "object",
          "match": [
            "*command_line",
            "*stack_trace"
          ]
        }
      },
      {
        "ecs_path_match_keyword_and_match_only_text": {
          "path_match": [
            "*.title",
            "*.executable",
            "*.name",
            "*.working_directory",
            "*.full_name",
            "*file.path",
            "*file.target_path",
            "*os.full",
            "*email.subject",
            "*vulnerability.description",
            "*user_agent.original"
          ],
          "mapping": {
            "fields": {
              "text": {
                "type": "match_only_text"
              }
            },
            "type": "keyword"
          },
          "unmatch_mapping_type": "object"
        }
      },
      {
        "ecs_date": {
          "path_match": [
            "*.timestamp",
            "*_timestamp",
            "*.not_after",
            "*.not_before",
            "*.accessed",
            "created",
            "*.created",
            "*.installed",
            "*.creation_date",
            "*.ctime",
            "*.mtime",
            "ingested",
            "*.ingested",
            "*.start",
            "*.end",
            "*.indicator.first_seen",
            "*.indicator.last_seen",
            "*.indicator.modified_at",
            "*threat.enrichments.matched.occurred"
          ],
          "mapping": {
            "type": "date"
          },
          "unmatch_mapping_type": "object"
        }
      },
      {
        "ecs_path_match_float": {
          "path_match": [
            "*.score.*",
            "*_score*"
          ],
          "mapping": {
            "type": "float"
          },
          "path_unmatch": "*.version",
          "unmatch_mapping_type": "object"
        }
      },
      {
        "ecs_usage_double_scaled_float": {
          "path_match": "*.usage",
          "mapping": {
            "scaling_factor": 1000,
            "type": "scaled_float"
          },
          "match_mapping_type": [
            "double",
            "long",
            "string"
          ]
        }
      },
      {
        "ecs_geo_point": {
          "path_match": [
            "*.geo.location"
          ],
          "mapping": {
            "type": "geo_point"
          }
        }
      },
      {
        "ecs_flattened": {
          "path_match": [
            "*structured_data",
            "*exports",
            "*imports"
          ],
          "mapping": {
            "type": "flattened"
          },
          "match_mapping_type": "object"
        }
      },
      {
        "all_strings_to_keywords": {
          "mapping": {
            "ignore_above": 1024,
            "type": "keyword"
          },
          "match_mapping_type": "string"
        }
      }
    ],
    "properties": {
      "input": {
        "properties": {
          "type": {
            "ignore_above": 1024,
            "type": "keyword"
          }
        }
      },
      "@timestamp": {
        "ignore_malformed": false,
        "type": "date"
      },
      "ecs": {
        "properties": {
          "version": {
            "ignore_above": 1024,
            "type": "keyword"
          }
        }
      },
      "log": {
        "properties": {
          "file": {
            "properties": {
              "inode": {
                "ignore_above": 1024,
                "type": "keyword"
              },
              "path": {
                "ignore_above": 1024,
                "type": "keyword"
              },
              "device_id": {
                "ignore_above": 1024,
                "type": "keyword"
              },
              "fingerprint": {
                "index": false,
                "type": "keyword"
              }
            }
          },
          "offset": {
            "type": "long"
          },
          "level": {
            "ignore_above": 1024,
            "type": "keyword"
          }
        }
      },
      "data_stream": {
        "properties": {
          "namespace": {
            "type": "constant_keyword"
          },
          "type": {
            "type": "constant_keyword"
          },
          "dataset": {
            "type": "constant_keyword"
          }
        }
      },
      "event": {
        "properties": {
          "original": {
            "index": false,
            "type": "keyword",
            "doc_values": false
          },
          "module": {
            "type": "constant_keyword",
            "value": "filestream"
          },
          "dataset": {
            "type": "constant_keyword",
            "value": "filestream.generic"
          }
        }
      },
      "message": {
        "type": "match_only_text"
      },
      "tags": {
        "ignore_above": 1024,
        "type": "keyword"
      }
    }
  }
}<p>Wenn Ihre Konsole dem Beispiel entspricht (mit allen zusätzlichen benutzerdefinierten Feldern und benutzerspezifischen Werten für Ihre Umgebung), führen Sie den Befehl aus, um das Gerüst des neuen Backing-Index zu erstellen. Pausieren Sie, wenn auftretende Fehler behoben werden müssen.</p><h2>Neuindizierung beginnen</h2><p>Wenn das Gerüst des neuen Backing-Index erfolgreich erstellt wurde, besteht der nächste Schritt darin, neu zu indizieren und die Mapping-Konflikte zu lösen.</p><p><strong>Wichtig:</strong> Wenn der Backing-Index, der den Mapping-Konflikt aufweist, der aktuellste Index ist und der aktuelle Schreibindex (zum Beispiel ist die Endzahl des Backing-Index -000001), muss der Datenstrom übertragen werden. Das Übertragen des Datenstroms ist erforderlich, da der aktuelle Schreibindex, in den Dokumente eingespeist werden, ein Live-Backing-Index ist und nicht modifiziert werden kann.</p><p>Mit dem korrekten Feld-Mapping, das nun über die zuvor erstellte <code>@custom</code> Komponentenvorlage auf den neueren Schreibindex angewendet wird, spiegeln alle neuen Dokumente diese Änderung wider.</p><p>Dies wird durch Ausführen des Folgenden erreicht: </p>POST &lt;full data stream name&gt;/_rollover<p>Zum Beispiel: </p>POST logs-filestream.generic-default/_rollover<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e0ae084fe6ade43/6a171006a6c2b91078e797d6/22abc1a2f6de0420aa0d56ac498894111df7f4fd-2048x330.png" alt="Rollover-Ergebnis" /><p>Die Neuindizierung beinhaltet das Kopieren der Daten aus einem bestehenden Backing-Index in einen neuen innerhalb derselben Namenskonvention, normalerweise um notwendige Änderungen vorzunehmen. Diese Änderungen könnten Aktualisierungen einer Komponentenvorlage oder das Hinzufügen einer neuen Ingest-Pipeline für die zu verarbeitenden Daten beinhalten.</p><p>Als Nächstes werden die Daten aus dem Backing-Index mit den falschen Mappings in einen neuen Backing-Index kopiert. Der ursprüngliche Backing-Index wird überschrieben, sodass keine neuen Dokumente mehr hinzugefügt werden können. Der neue Backing-Index folgt derselben Namenskonvention, die die Datentransparenz und -integrität bei Anwendung der korrekten ILM-Richtlinie bewahrt, aber ein <code>-1</code>-Suffix enthält, das anzeigt, dass er neu indexiert wurde.</p><p>Passen Sie die Indexnamen nach Bedarf an und fügen Sie den folgenden Code in die Konsole ein. Indem Sie <code>wait_for_completion=false</code> einbeziehen, können Sie den Fortschritt des Dokumentenkopierens verfolgen, was hilft, die verbleibende Reindexierungszeit abzuschätzen. Ohne diese Einstellung können Sie den Status nicht mit dem untenstehenden Befehl <code>GET _tasks</code> verfolgen und nur die Dokumentenanzahl im neueren Backing-Index mit <code>GET &lt;backing index name&gt;-1/_count</code> überprüfen.</p><p><strong>Wichtig: </strong>Wenn während der Neuindizierung Probleme auftreten, führen Sie den Befehl Neuindizierung nicht erneut aus. Dadurch wird der Prozess neu gestartet und doppelte Einträge im Index mit <code>-1</code> erstellt. Wenn ein Neustart notwendig ist, löschen Sie zunächst den Index mit dem nachlaufenden <code>-1</code> und führen Sie dann den vorherigen <code>PUT</code>-Befehl aus, um das neue Backing-Index-Gerüst zu erstellen.</p>POST _reindex?wait_for_completion=false
{
  "source": {
    "index": "&lt;source backing index&gt;"
  },
  "dest": {
    "index": "&lt;new backing index&gt;-1"
  }
}

i.e.
POST _reindex?wait_for_completion=false
{
  "source": {
    "index": ".ds-logs-filestream.generic-default-2026.04.13-000001"
  },
  "dest": {
    "index": ".ds-logs-filestream.generic-default-2026.04.13-000001-1"
  }
}<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb30fd97a045b6008/6a171007cf4f2566d6b2d22b/22f9b1f762802ecd20faa7c7c1f76c9d1444aba5-2048x530.png" alt=" Aufgabenausgabe" /><p>Nach der Ausführung enthält die Reaktion eine Aufgaben-ID. Sie können den Fortschritt der Neuindizierung mit dieser ID mit dem Befehl <code>GET _tasks/&lt;task ID&gt;</code> überwachen.</p><p>Die Dauer der Neuindizierung hängt vom Datenvolumen im ursprünglichen Index ab. Die Verarbeitung verfolgen Sie, indem Sie bei der Ausführung des Befehls <code>GET</code> nach <code>"completed": true</code> suchen, was zu einer ähnlichen Ausgabe führen sollte.</p><p><code>GET _tasks/&lt;task ID&gt;</code></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4d40766e48cc0813/6a17100960084ba9043c4642/dbf0fb0a560a78236440b8c3de68cdf5c83e6d7a-2048x824.png" alt="Aufgabenzusammenfassung" /><p>Die Neuindizierung für die Dokumentenzählung ist nun abgeschlossen. Der nächste Schritt besteht darin, zu überprüfen, ob die Mappings für den neuen Backing-Index und das betreffende Feld korrekt sind.</p>GET &lt;backing index&gt;-1/_mapping<p>Zum Beispiel:</p>GET .ds-logs-filestream.generic-default-2026.04.13-000001-1/_mapping<p>Sie können überprüfen, ob das Mapping für <code>log.offset</code> wie unten dargestellt aussieht. Um zu bestätigen, dass andere Felder nur einen einzigen Mapping-Eintrag haben (nicht sowohl <code>text</code> als auch <code>keyword</code>), vergleichen Sie sie mit einem Feld, das nicht Teil des dynamischen Template-Abschnitts im vorherigen <code>PUT</code>-Befehl war.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc156907e9635e4a9/6a17100b60084b59673c464e/db5c12c0a651e804a916d517e6e260e49a8b835a-2048x1121.png" alt=" Mapping-Fokus" /><p>Wenn der neu indizierte Backing-Index eine große Anzahl von Dokumenten enthält, ist es hilfreich, den Status der Dokumente zu überprüfen, die in den neuen Backing-Index kopiert werden. Dies kann mit den folgenden beiden Dev Tools-Befehlen zum Vergleich der Zählungen erfolgen.</p><p><code>GET .ds-logs-filestream.generic-default-2026.04.14-000001/_count</code></p><p><code>GET .ds-logs-filestream.generic-default-2026.04.14-000001-1/_count</code></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbc27c4da42ddc33d/6a17100c7d8d67e0ad70e816/a0e49ac79edb0abf9fe99d0e6fd35e96d0e3e0e5-2048x880.png" alt="" /><p>Sobald die Zählungen als übereinstimmend verifiziert wurden und die korrekten Mappings vorhanden sind, aktualisieren Sie den Datenstrom, um den neuen zugrunde liegenden Index zu integrieren. Dadurch wird verhindert, dass ein verwaister zugrunde liegender Index in der Indexverwaltung entsteht, bei dem die ILM-Richtlinie niemals auf den zugrunde liegenden Index angewendet wird.</p><ul><li><p>Die Rückgabe sollte im Erfolgsfall eine Bestätigung von true sein.</p></li></ul>POST _data_stream/_modify
{
  "actions": [
    {
      "add_backing_index": {
        "data_stream": "logs-filestream.generic-default",
        "index": ".ds-logs-filestream.generic-default-2026.04.14-000001-1"
      }
    }
  ]
}<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1bb6db6c761628fb/6a17100e7d8d67533770e81a/0aa3233377c0175258d37eaa661d56cf9f310d5e-2048x1288.png" alt="" /><p>Überprüfen Sie mit folgendem Befehl, ob der neue Backing-Index hinzugefügt wurde und ob die <code>ilm_policy</code> korrekt ist:</p>GET _data_stream/logs-filestream.generic-default<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7f4208ae6d7bf331/6a171010961e696241c4cfeb/af8b75cf260f6f088c28a78da86ad31527e0bfd5-2048x839.png" alt="" /><p>Überprüfen Sie als Nächstes den ILM-Status des Backing-Index mit folgendem Befehl:</p><ul><li><p>Es ist normal, dass der Index als heiß angezeigt wird, da er gerade erst erstellt wurde (überprüfen Sie Zeile 8 oder 10).</p></li></ul>GET .ds-logs-filestream.generic-default-2026.04.14-000001-1/_ilm/explain<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt953e1a062a040311/6a171012acf0885905be9c29/cd181a31001c7a3ee2b0599a7388909ce5b50baf-2048x972.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd398451578d070c9/6a1710140e2e492dc041a204/20f6e7632804f173533e655f0292c3c540f26597-2048x894.png" alt="" /><p>Führen Sie Folgendes aus, um den Backing-Index von der heißen Ebene auf die nächste geeignete Ebene zu übertragen, die nach der heißen Ebene für die ILM-Richtlinie für diesen Datenstrom liegt. Die spezifischen Werte für <code>phase</code>, <code>action</code> und <code>name</code> in den folgenden <code>current_step</code> können in den Zeilen 11, 13 und 15 im obigen Screenshot nachgeschlagen werden.</p><p>Der <code>next_step</code>-Wert gibt die anschließende ILM-Phase oder Datenebene an, zu der der Index übergeht.</p><p>Zum Beispiel:</p>POST _ilm/move/.ds-logs-filestream.generic-default-2026.04.14-000001-1
{
  "current_step": {
    "phase": "hot",
    "action": "rollover", 
    "name": "check-rollover-ready"
  },
  "next_step": {
    "phase": "warm" 
  }
}<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt246a6538585234f1/6a1710160c4857ddc001ab60/7ae60b900ce1d0b46ce26ec301901bc8a9ef750c-2048x1249.png" alt="" /><ul><li><p>Es ist nicht zwingend notwendig, aber als Sicherheitsmaßnahme können Sie den Befehl <code>_ilm/explain</code> erneut ausführen, um sicherzustellen, dass sich der Backing-Index in die nächste Phase verschoben hat und sich nicht mehr in der heißen Phase befindet.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf77bba4d9b495048/6a17101867045b3b7d45c2c1/58a460cf2ec443223ea68ba7e7166a7cf9d8c97a-2048x915.png" alt="" /><p>Sobald die folgenden Bedingungen erfüllt sind, können Sie den ursprünglichen Backing-Index, der Mapping-Konflikte aufwies, sicher löschen:</p><ol><li><p>Ein neuer Backing-Index wurde erfolgreich erstellt.</p></li><li><p>Dokumente wurden in den neuen Index verschoben, und die Dokumentanzahlen stimmen überein.</p></li><li><p>Die Mappings wurden korrigiert (sowohl datenstromspezifisch als auch ECS-spezifisch).</p></li><li><p>Der Datenstrom beinhaltet den neuen Backing-Index.</p></li><li><p>Die ILM-Richtlinie wurde angewendet und der Index hat die heiße Phase überwunden.</p></li></ol><p><strong>Wichtig:</strong> Alternativ können Sie vor dem Löschen des ursprünglichen Index die Seite <strong>Data Views</strong> überprüfen. Wählen Sie <code>logs-*</code> aus und überprüfen Sie, dass der neuindizierte Backing-Index (der auf <code>-1</code>endet) nun im Abschnitt <strong><code>long</code></strong> erscheint. Der ursprüngliche Backing-Index sollte unter <strong><code>keyword</code></strong>noch vorhanden sein. Wenn der neuindizierte Backing-Index nicht im <strong><code>long</code></strong>-Abschnitt enthalten ist, gehen Sie zurück, überprüfen die vorherigen Schritte und nehmen gegebenenfalls Korrekturen vor.</p><p>Zum Beispiel:</p>DELETE .ds-logs-filestream.generic-default-2026.04.14-000001<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt835a79be274513a3/6a17101aa929cf43c6ae0ab1/09d661b20a44929b4736a43eaa3df84180b25f30-2048x1295.png" alt="" /><p>Nachdem Sie die Konflikte gelöst haben, kehren Sie zur Seite <strong>Data Views</strong> zurück und wählen Sie <code>logs-*</code> aus. Wenn der Konflikt ausschließlich mit <code>log.offset</code> zusammenhängt, sollten keine Konflikte mehr aufgeführt sein. Wenn es weitere Konflikte gab, sollte der ursprüngliche Backing-Index nicht mehr in der Konfliktliste erscheinen. Stattdessen sollte der neue Backing-Index nun im Abschnitt <code>long</code> aufgeführt werden.</p><p>Sie können auch in <strong>Discover</strong> überprüfen, ob das <code>log.offset</code>-Feld jetzt die entsprechenden Symbole anzeigt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt127cb539b70acada/6a17101ba929cfbc66ae0ab5/1c3bb7029c99aa4bc6b0931f39f5648654b35ccd-2048x1204.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltaa1eb678773c23d9/6a17101d4a531b00a636aa3b/0af1b1aa3a031c207aa5eb083696dd081d941e67-2048x1001.png" alt="" /><p>Führen Sie diesen Prozess fort, indem Sie die obigen Schritte für jeden Backing-Index wiederholen, der einen Mapping-Konflikt aufweist, bis alle erfolgreich gelöst sind.</p><p>Referenzen:</p><ul><li><p><a href="https://www.elastic.co/docs/reference/ecs/ecs-field-reference">Referenz zu den ECS-Feldern</a></p></li><li><p><a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-reindex">Dokumente neu indexieren</a></p></li></ul><h2>Fazit</h2><p>Indem Sie die Schritte in diesem Blog befolgen, lösen Sie Mapping-Konflikte und stellen sicher, dass alle neuen Daten korrekt zugeordnet sind. Dafür verknüpfen Sie die erforderlichen Komponentenvorlagen mit Ihrer Datenquelle. Dieser Workflow behebt nicht nur die unmittelbaren Probleme, sondern etabliert auch einen sicheren und wiederholbaren Prozess zur Verwaltung von Schemaänderungen, während sich Ihre Daten und Anforderungen weiterentwickeln.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-mapping-conflicts-reindex-data-streams</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-mapping-conflicts-reindex-data-streams</guid>
    <category><![CDATA[Operativer Betrieb]]></category>
    <dc:creator><![CDATA[Lisa Larribas]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9654eb32edb4a44a/6a17101fcdacbf0ac17d2ad8/2f2573aa3d29b3a628e4fce606c803add2641501-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Warum die E-Commerce-Suche Governance benötigt]]></title>
    <description><![CDATA[Erfahren Sie, warum E-Commerce-Suche ohne Governance unzureichend ist und wie eine Kontrollschicht vorhersehbare und absichtsgesteuerte Ergebnisse gewährleistet und damit die Suche verbessert.]]></description>
    <content:encoded><![CDATA[<p>E-Commerce-Händler müssen verschiedene grundlegend unterschiedliche Abfragetypen innerhalb desselben Systems handhaben. Ein Kunde, der nach „Orangen“ sucht, erwartet die Frucht selbst, nicht Produkte, die das Wort „Orange“ enthalten, wie Orangensaft oder Orangenmarmelade, und auch nicht semantisch verwandte Zitrusprodukte. Ein Käufer, der nach einem „Geschenk für Opa, der gerne Süßes mag“ sucht, benötigt semantische Erkennung, nicht die wörtliche Übereinstimmung mit Schlüsselwörtern.</p><p>Die <em>lexikalische Suche</em> (Textabgleich), die <em>semantische Suche</em> (Abgleich von Konzepten) und die <em>hybride Suche</em> (Kombination lexikalischer und semantischer Signale) lösen diese Probleme für sich genommen nicht. Bei der lexikalischen Suche werden möglicherweise alle Ergebnisse angezeigt, die das Wort „Orangen“ enthalten, während sich die rein semantische Suche bei einer Suchanfrage mit hoher Intentionsstärke wie „Orangen“ auf verwandte Begriffe wie Zitronen oder Grapefruits ausweiten kann. Die hybride Abfrage kombiniert diese lexikalischen und semantischen Signale, kann jedoch nach wie vor nicht entscheiden, ob diese Abfrage als navigatorisch zu behandeln ist, welche Einschränkungen durchgesetzt werden sollten oder welche geschäftlichen Richtlinien gelten sollten. Das Problem liegt nicht in der Abruftechnologie selbst, sondern im Fehlen einer Steuerungsebene, die erkennt, um welche Art von Abfrage es sich handelt und welche Einschränkungen vor Beginn des Abrufs durchgesetzt werden müssen.</p><p>In diesem Blogbeitrag befassen wir uns mit der Steuerung der E-Commerce-Suche, ihrer Bedeutung und der Frage, wie eine Kontrollschicht für vorhersehbare und präzise Suchergebnisse sorgt.</p><h2>Was Governance in der E-Commerce-Suche bedeutet</h2><p><em>Governance</em> bedeutet in diesem Zusammenhang, eine Entscheidungsebene zwischen der Abfrage des Nutzers und der Abruf-Engine einzuführen. Diese Ebene erfüllt die folgenden Funktionen:</p><ul><li><p>Klassifiziert die Suchabsicht: Handelt es sich um eine Navigation („Orangen“) oder um eine Suche („Geschenk für Opa“)?</p></li><li><p>Wendet geschäftliche Vorgaben an: Welche Kategoriegrenzen, Zulassungsregeln, Verfügbarkeitsbeschränkungen oder Merchandising-Richtlinien gelten?</p></li><li><p>Wege zur geeigneten Strategie: Sollte hierbei lexikalisches Abrufen, semantisches Abrufen oder ein hybrider Ansatz zum Einsatz kommen?</p></li></ul><p>Eine Governance-Ebene legt fest, welcher Abrufansatz für jede Abfrage verwendet werden soll, welche Einschränkungen durchgesetzt werden müssen und welche Geschäftsrichtlinien vor Beginn des Abrufs gelten sollen. Es ist wichtig, Governance nicht mit dem hybriden Abruf zu verwechseln: Der hybride Abruf ist eine Abrufstrategie, die lexikalische und semantische Signale kombiniert, während Governance die vorgelagerte Entscheidungsebene ist, die bestimmt, ob lexikalische, semantische oder hybride Signale verwendet werden sollen.</p><h2>Der Status quo: Die „Spaghetti“-Implementierung auf Anwendungsebene</h2><p>Derzeit versuchen viele Händler, dieses Problem zu lösen, indem sie die Logik direkt in die Anwendungsschicht integrieren. Dies führt oft zu <em>Spaghetti-Code</em>, also zu Tausenden von Zeilen fest codierter if-then-Anweisungen, Regex und komplexen Suchvorlagen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdd7b33454d925cfd/6a1710f1e8fbce25ee39fd4d/f532b099ee103458e15563a711dae92952f8df02-1024x765.png" alt="Vergleich zwischen fest programmierter Anwendungslogik und Elasticsearch, der zeigt, wie Elasticsearch Ranking und Suche ohne komplexe Wenn-dann-Regeln vereinfacht." /><p>Dieser Ansatz kann die oben gezeigten gewünschten Suchergebnisse liefern; jedoch verursacht er erhebliche betriebliche Reibungsverluste:</p><ul><li><p><strong>Abhängigkeit von der Entwicklungsabteilung:</strong> Geschäfts-Nutzer und Merchandiser können das Suchverhalten nicht ohne Entwicklungs-Tickets und lange Deployment-Zyklen ändern, die oft mehrere Wochen dauern.</p></li><li><p><strong>Fragmentierung:</strong> Die Suchlogik verteilt sich auf den Anwendungscode und die Suchvorlagen, ist schwer zu erklären oder zu überprüfen und birgt daher Risiken bei der Weiterentwicklung.</p></li></ul><p>Selbst wenn Teams die Notwendigkeit des Routings erkennen, konzentriert sich die Debatte oft auf die falsche Frage: welche Abrufmethode gewählt werden soll.</p><h2>Die falsche Wahl: Lexikalisch vs. semantisch vs. hybrid</h2><p>Suchteams betrachten diese Herausforderung häufig als eine Frage der Wahl der Abrufstrategie: lexikalisch/BM25 versus semantisch/Vektoren versus hybrid. Diese Sichtweise ist zwar nachvollziehbar (die Abrufmethoden spielen eine Rolle), lässt jedoch die häufigste Fehlerquelle in realen Implementierungen außer Acht: Die Verwendung eines einzigen Abrufansatzes für alle Abfragen führt zu suboptimalen Ergebnissen.</p><p>Commerce Search ist eine Mischung aus grundlegend verschiedenen Absichten:</p><ul><li><p><strong>Deterministische Navigation mit hoher Absicht</strong> („Orangen“, „Milch“, „Schokolade ohne Erdnüsse“, „billiges Olivenöl“).</p></li><li><p><strong>Explorative Suche</strong> („Jacke zum Wandern in den Bergen“, „Geschenk für ein 12‑jähriges Kind, das Robotik mag“).</p></li><li><p><strong>Betriebliche Einschränkungen</strong> (Verfügbarkeit, Größe, Preis, Farbe).</p></li><li><p><strong>Merchandising und Kampagnen</strong> (Boost, Begraben, saisonale Kampagnen).</p></li></ul><p>Wenn das System all diese Vorgänge über dieselbe Abrufstrategie abwickelt, sind die Ergebnisse oft auf vorhersehbare Weise systematisch fehlerhaft, da es dem Betriebsmodell an Governance mangelt. Wenn Teams dies nicht als Lücke in der Unternehmensführung erkennen, reagieren sie mit dem einzigen Mittel, das ihnen zur Verfügung steht: noch mehr Feinabstimmung.</p><h2>Warum „Relevanzoptimierung“ zyklisch werden kann.</h2><p>Ohne eine Routing-Schicht verwandelt sich „Relevanz“ oft in einen nie endenden Rückstand:</p><ul><li><p>Warum zeigt diese Abfrage Zubehör über dem Kernprodukt an?</p></li><li><p>Warum hat diese Kopfabfrage plötzlich verwandte Ergebnisse angezeigt?</p></li><li><p>Warum änderten sich die Ergebnisse, nachdem wir Synonyme hinzugefügt, Analysatoren angepasst oder Hybrid aktiviert hatten?</p></li><li><p>Warum benötigt das Business-Team ein Engineering-Release, um eine einzelne Abfrage zu beheben?</p></li></ul><p>Die Teams reagieren mit weiteren Optimierungen: mehr Synonyme, mehr Boosts, mehr Experimente zur Neugewichtung, mehr Ausnahmen im Anwendungscode. Dies kann eine Zeit lang funktionieren, führt jedoch häufig zu instabilem Verhalten, da dem System nach wie vor eine explizite Entscheidungsebene fehlt, um den Abfragetyp zu bestimmen und die richtigen Einschränkungen vor dem Abruf durchzusetzen.</p><h2>Die Anatomie der E-Commerce-Absicht: „Head“ und „Tail“</h2><p>In diesem Abschnitt verwenden wir „Head“ und „Tail“ als praktische Kurzform für gängige Navigations- und Suchmuster im E-Commerce. In der realen Welt enthalten viele Anfragen Aspekte von beidem:</p><h3>„Head“-Abfragen (deterministische Absicht)</h3><p>Dies sind direkte, navigationsbezogene Abfragen, bei denen der Nutzer genau weiß, was er möchte:</p><ul><li><p>Absicht in Bezug auf einen einzelnen Artikel ("Orangen", "Milch", "Brot").</p></li><li><p>Genaue Marken oder Produktfamilien („iPhone 15 Pro“, „Diet Coke“).</p></li><li><p>Artikelnummern, Modellnummern, Größen ("ABC123", "air max 270").</p></li></ul><p>Für diese Abfragen kann die lexikalische Suche die Token-Korrespondenz (Wortübereinstimmung) abdecken, aber das Unternehmen erwartet außerdem, dass Constraints eingehalten werden, vorhersehbare Rankings zurückgegeben werden und die Ergebnisse steuerbar sind. Ein Merchandiser muss sicherstellen, dass eine Abfrage innerhalb der richtigen Kategoriegrenzen aufgelöst wird, die Eligibility-Kriterien einhält und bestimmte geschäftliche Prioritäten sichtbar macht.</p><p>Governance ist erforderlich, um die beabsichtigte Lösung durchzusetzen. Zum Beispiel sollten „Orangen“ der Kategorie Frischwaren zugeordnet werden, nicht Orangensaft, Orangenmarmelade oder Orangenlimonade.</p><h3>„Tail“-Abfragen (explorative Datensuche)</h3><p>Dies sind beschreibende, absichtsvolle Suchanfragen, mit denen Käufer recherchieren:</p><ul><li><p>„Geschenk für Opa mit einer Vorliebe für Süßes“</p></li><li><p>„Jacke zum Wandern in den Bergen“</p></li><li><p>„Schuhe, um den ganzen Tag zu stehen“</p></li></ul><p>Der lexikalische Abruf hat hier oft Schwierigkeiten. Der semantische Abruf ist überlegen, weil er das Abfragekonzept mit dem Produkt verknüpfen kann, selbst wenn die Formulierungen nicht übereinstimmen. Aber auch der semantische Abruf allein reicht selten aus. Abfragen aus der Praxis erfordern oft, dass Constraints durchgesetzt werden – unabhängig davon, welche Abrufmethode verwendet wird.</p><h2>Die Einschränkungen sind orthogonal zur Abrufmethode.</h2><p>Das Anwenden von Einschränkungen auf semantische Abrufe bedeutet nicht <em>hybride Suche</em>. Dies sind orthogonale Konzepte. Einschränkungen wie Filter und Boosts in Elasticsearch können auf jede lexikalische, semantische oder hybride Suche angewendet werden. Die Herausforderung besteht darin, zu entscheiden, wie die Abfrage interpretiert werden soll, welche Einschränkungen durchgesetzt werden müssen und welche Abfragemethode verwendet werden soll.</p><p>Im Folgenden finden Sie einige Beispiele für Abfragen, die die Datensuche mit festen Einschränkungen kombinieren:</p><ul><li><p><strong>Orangen:</strong> Lexikalische Suche nach „Orangen“ unter Hinzunahme einer Kategoriebeschränkung, wie beispielsweise „Obst“ oder „Frischwaren“, wodurch Orangenmarmelade, Orangensaft und Orangenlimonade ausgeschlossen werden.</p></li><li><p><strong>Früchte mit hohem Vitamin-C-Gehalt unter 4 $:</strong> Semantische Suche nach dem Nährwert plus Einschränkungen, die die Ergebnisse auf die Kategorie Obst und Produkte unter 4 $ beschränken.</p></li><li><p><strong>Bequeme Schuhe für die Arbeit:</strong> Semantischer Informationsabruf für kontextuelle Absicht plus eine Kategoriebeschränkung, die die Ergebnisse auf Schuhe begrenzt.</p></li></ul><p>Diese Abfragen können nicht mit einem einzigen Ansatz bearbeitet werden:</p><ul><li><p>Ein <strong>rein lexikalischer Abruf</strong> ist hier oft unzureichend, da Phrasen wie „reich an Vitamin C“ oder „komfortabel“ möglicherweise nicht als saubere, strukturierte Attribute existieren. Sie müssen möglicherweise aus Produktbeschreibungen, Bewertungen oder Spezifikationen abgeleitet werden.</p></li><li><p>Auch eine <strong>rein semantische Suche</strong> reicht nicht immer aus, da eine Suchanfrage wie „vitamin-C-reiche Früchte“ ohne explizite Einschränkungen auf Vitaminpräparate, Getränke mit Fruchtgeschmack oder vitaminreiches Gemüse außerhalb der beabsichtigten Kategorie und Preisklasse ausgeweitet werden könnte.</p></li></ul><p>Eine Steuerungsebene legt fest, ob eine Abfrage eine lexikalische Suche, ein semantisches Verständnis, die Durchsetzung von Einschränkungen oder eine Kombination dieser Elemente erfordert. Ohne diese Ebene könnten E-Commerce-Teams in folgende Situation geraten:</p><ul><li><p><strong>Übermäßige Einschränkung:</strong> Verwendung lexikalischer Abfragen für semantische Anfragen (zum Beispiel „Geschenk für Opa“).</p></li><li><p><strong>Unterbeschränkung: </strong>Verwendung semantischer Abfragen für Head-Abfragen mit hoher Intention (z. B. „Orangen“).</p></li></ul><p>Die Herausforderung im Bereich der Governance besteht darin, ein System zu entwickeln, das für jede Art von Anfrage die richtige Entscheidung treffen kann.</p><h2>Was passiert ohne Governance?</h2><p>Die häufigste Fehlerquelle ist ganz einfach: Teams nehmen die rohe Benutzeranfrage und leiten sie direkt an eine einzige Abrufstrategie weiter (lexikalisch, semantisch oder hybrid), ohne eine zwischengeschaltete Governance-Ebene.</p><h3>Die lexikalische Suche verfehlt die beabsichtigte Auflösung.</h3><p>Wenn ein Nutzer nach "Orangen" sucht, kann eine lexikalische Suchstrategie alles zurückgeben, was dieses Token enthält: Orangensaft, Orangenmarmelade oder Orangenlimonade. Das System hat den Begriff korrekt zugeordnet, aber ohne Governance kann es den beabsichtigten Einkaufskontext (die Frucht) nicht auflösen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1b4595242ea6eb05/6a1710f35091684ba3e1bbd0/99abc7a46f9c56a26a68d0a089d7ab830b9b5568-1560x814.png" alt=" Eine Illustration, die zeigt, wie eine einzige Suche nach „Orangen“ verschiedene verwandte Ergebnisse liefert, wie beispielsweise Marmelade, frische Orangen und Orangenlimonade." /><h3>Der semantische Abruf weitet sich über die beabsichtigten Einschränkungen hinaus aus</h3><p>Wenn ein Nutzer nach „Orangen“ sucht, kann ein semantisches System konzeptionell verwandte Elemente aus nahegelegenen Produktkonzepten abrufen. Das System versteht zwar den übergeordneten Bereich (Obst oder Gemüse), aber ohne explizite Steuerung kann es dennoch über die vom Nutzer beabsichtigte Beschränkung (speziell Orangen) hinausgehen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltff1aba60c7b13fc8/6a1710f58b73cb3cef18a117/c9de86363ecbed499fe48259f47b3c5b2c26bc43-1568x796.png" alt="Diagramm, das zeigt, wie eine Abfrage nach „Orangen“ zu verschiedenen Obstkategorien weitergeleitet wird, einschließlich Äpfeln, Orangen und gemischtem Obst." /><h3>Die Lücke ist Governance</h3><p>Erforderlich ist eine vorgelagerte Entscheidungsebene, die die Abfrageabsicht bestimmt und die richtigen Einschränkungen durchsetzt, bevor der Abruf beginnt. Dadurch werden Probleme wie die folgenden behoben:</p><ul><li><p>Ähnliche oder verwandte Artikel, die neben dem angezeigt werden, was der Nutzer eigentlich gesucht hat.</p></li><li><p>Verschwimmende Kategoriegrenzen („Getränke“ vs. „Frischwaren“).</p></li><li><p>Unfähigkeit, saisonale Boosts oder Kampagnen umzusetzen.</p></li><li><p>Unvorhersehbare und unerklärliche Ergebnisse.</p></li></ul><h2>Absichtserkennung und Weiterleitung: Die notwendige Steuerungsebene</h2><p>Ein gesteuertes Suchsystem führt eine schlanke Steuerungsebene vor dem Abruf ein (vor der Ausführung einer Abfrage in Elasticsearch). Auf dieses Steuerelement wird in den Teilen <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">3</a> und <a href="https://www.elastic.co/search-labs/blog/elasticsearch-percolator-search-governance">4</a> dieser Blogreihe ausführlich eingegangen. Vorerst beschränken wir uns darauf, zu erläutern, was es leisten kann, ohne jedoch auf seine Funktionsweise einzugehen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt373bd838e1751998/6a1710f74a531b1e5436aa57/88c3d0f9731a128d73a765dcdffed897308110a6-2680x766.png" alt="Diagramm, das veranschaulicht, wie verschiedene Abfragen über eine Steuerungsebene an BM25 oder semantische Suchergebnisse weitergeleitet werden." /><p>Eine Steuerungsebene kann Absichten erkennen, Geschäftsrichtlinien anwenden und die entsprechende Abrufstrategie wie folgt sicherstellen:</p><p><strong>1. Absichtssignale erkennen</strong></p><ul><li><p>Ist diese Abfrage wahrscheinlich Navigation oder Entdeckung?</p></li><li><p>Handelt es sich um eine bekannte Head-Abfrage (Milch, Brot, Bananen)?</p></li><li><p>Gibt es eine bekannte Interpretation für ein Produkt, eine Marke oder eine Kategorie (beispielsweise sollte „Orangen“ zu „Frischwaren“ führen)?</p></li><li><p>Ist die Abfrage ein SKU-ähnliches Muster?</p></li><li><p>Fällt die Abfrage unter eine aktive Kampagne oder eine saisonale Richtlinie (beispielsweise während der Weihnachtszeit, um Suchergebnisse zum Thema Truthahn stärker hervorzuheben)?</p></li><li><p>Impliziert die Abfrage Einschränkungen (Kategorie, Attribute, Ausschlüsse, Preis/Größe/Farbe)?</p></li></ul><p><strong>2. Setzen Sie Governance- und Geschäftsrichtlinien um.</strong></p><ul><li><p>Wenden Sie zunächst deterministische Einschränkungen an (Kategorie/Attribut/Negation/Verfügbarkeit).</p></li><li><p>Wenden Sie aktive Merchandising-Maßnahmen an (hervorheben/verbergen/fixieren/überschreiben).</p></li><li><p>Lösen Sie Konflikte mithilfe von Prioritätsregeln (z. B. Kampagnen-Überschreibungen gegenüber globalen Richtlinien).</p></li></ul><p><strong>3. Weg zur geeigneten Abrufstrategie</strong></p><ul><li><p>Lexikalisch (schnell, deterministisch) für navigationsorientierte Suchanfragen mit hoher Kaufabsicht.</p></li><li><p>Semantische Suche für echte Entdeckungsanfragen.</p></li><li><p>Ein hybrider Ansatz, bei dem kombinierte lexikalische und semantische Signale unter expliziten geschäftlichen Vorgaben einen Mehrwert schaffen.</p></li></ul><p>In der Praxis ist der Ausgang der Steuerungsebene nicht einfach „Hybrid verwenden“ oder „Semantik verwenden“. Es handelt sich um einen geregelten Abrufplan: eine Interpretation der Absicht des Kunden, der geltenden Einschränkungen und Richtlinien sowie der auszuführenden Abrufstrategie. Ein paar einfache Beispiele verdeutlichen dies:</p><p>Kundenabfrage</p><p>Gesteuerte Interpretation</p><p>Beispiel-Abrufplan</p><p>„Schokolade ohne Erdnüsse“</p><p>Produktorientierte Abfrage mit einer strengen Ausschlussbedingung</p><p>Lexikalische Suche nach „Schokolade“ sowie ein Ausschlussfilter für Produkte, die Erdnüsse enthalten</p><p>„billiges Olivenöl“</p><p>Produkt-/Kategorie-Abfrage mit einer Preisbeschränkung</p><p>Lexikalischer Abruf für Olivenöl plus ein Preisfilter, der auf den Schwellenwert des Einzelhändlers für „günstig“ begrenzt ist</p><p>„Obst reich an Vitamin C unter 4 $“</p><p>Discovery-Abfrage, die semantisches Verständnis sowie strikte Einschränkungen erfordert</p><p>Semantische Suche nach Produkten für Ernährungszwecke, beschränkt auf die Kategorie „Obst“ und gefiltert nach Produkten mit einem Preis unter 4 $</p><p>Eine Steuerungsebene wählt für jede Abfrage konsistent, vorhersehbar und in großem Maßstab die richtige Richtlinie und Abrufstrategie aus. Dies macht fortgeschrittene Abrufmethoden in der Produktion vorhersehbarer, da absichtsbasierte Einschränkungen zuerst durchgesetzt werden und Routing-Entscheidungen explizit statt implizit getroffen werden.</p><h2>Wie dies mit anderen Ansätzen zusammenhängt</h2><p>Einige Teams nutzen verbesserte Einbettungsmodelle, um die Produktsemantik besser zu erfassen, was die Qualität der semantischen Suche erheblich verbessern kann. Andere nutzen Ansätze zur Neureihenfolge, wie beispielsweise <a href="https://www.elastic.co/docs/solutions/search/ranking/learning-to-rank-ltr">Learning To Rank (LTR)</a>, um die Reihenfolge der Ergebnisse nach der Abfrage auf der Grundlage von Interaktions- oder geschäftsbezogenen Signalen zu optimieren. Beide sind wertvoll und ergänzen sich oft. Bessere Einbettungen verbessern den Ähnlichkeitsabgleich. Durch die Neubewertung wird die Reihenfolge der abgerufenen Kandidaten verbessert.</p><p>Governance befasst sich mit einer anderen Ebene des Problems: Sie ist dem Abrufprozess vorgelagert. Es entscheidet, welche Abrufstrategie verwendet wird (zum Beispiel lexikalisch, semantisch oder hybrid), welche deterministischen Einschränkungen erforderlich sind und welche Abfragen mehrere Geschäftsrichtlinien kombinieren sollten.</p><h2>Was eine gesteuerte Steuerungsebene ermöglicht</h2><p>Sobald eine Governance-Ebene eingerichtet ist, verändert sich das Betriebsmodell grundlegend. Umsatzrelevante Abfragen lassen sich vorhersagen. Geschäftsteams können das Suchverhalten anpassen, ohne auf die Release-Zyklen der Entwickler warten zu müssen. Und fortgeschrittene Abrufmethoden, wie semantische und hybride Verfahren, können schrittweise eingeführt werden – im Rahmen von Routing-Regeln und Sicherheitsvorkehrungen – anstatt als globaler Ein-/Aus-Schalter.</p><p>Der <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">nächste Beitrag</a> dieser Reihe befasst sich damit, wie dieses Betriebsmodell in der Praxis aussieht und warum es möglicherweise genauso wichtig ist wie die ihm zugrunde liegende Suchtechnologie.</p><p>Wenn ein Merchandiser ein Jira-Ticket erstellen und auf eine Bereitstellung warten muss, um eine umsatzkritische Abfrage zu beheben, liegt der Engpass nicht in der Engine, sondern im Betriebsmodell. Eine moderne E-Commerce-Suche muss in der Lage sein, geschäftliche Absichten schnell und sicher in kontrolliertes, überprüfbares Suchverhalten umzusetzen, dabei aber weiterhin auf erweiterte Suchfunktionen zurückzugreifen, wo diese einen messbaren Mehrwert bieten.</p><h2>Wie geht es weiter in dieser Serie?</h2><p>Die in dieser Reihe behandelten Muster greifen bereits vor der Abfrage an: Sie dienen dazu, geschäftliche Absichten in die richtige Abfragestrategie umzusetzen, noch bevor die Abfrage generiert wird. Im <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">nächsten Beitrag</a> wechseln wir vom technischen zum operativen Problem: Was passiert, wenn Geschäftsteams das Suchverhalten ohne ein technisches Deployment ändern können, und warum Governance das sicher macht?</p><h2>Setzen Sie die reglementierte E-Commerce-Suche in die Praxis um</h2><p>Technische Engpässe, instabile Logik auf Anwendungsebene und unvorhersehbare Suchergebnisse sind Probleme, bei deren Lösung Ihnen Elastic Services im Rahmen von E-Commerce-Projekten für Unternehmen behilflich sein kann. Die in dieser Reihe beschriebene Architektur der verwalteten Steuerungsebene wurde von Elastic Services Engineering entwickelt.</p><p>Wenn Ihr Team Entwicklungsressourcen darauf verwendet, Merchandising-Anforderungen in Codeänderungen umzusetzen, oder wenn Ihr Rückstand bei der Suchrelevanz scheinbar nie abnimmt, können wir Ihnen dabei helfen, Ihre aktuelle Architektur zu bewerten und einen Weg zu einer kontrollierten, vom Geschäftsteam editierbaren Suche zu ebnen. Kontaktieren Sie <a href="https://www.elastic.co/consulting">Elastic Services</a>.  </p><h2>Nehmen Sie an der Diskussion teil</h2><p>Haben Sie Fragen zur Suchsteuerung, zu Abrufstrategien oder zur Sucharchitektur im E-Commerce? Nehmen Sie an der <a href="https://discuss.elastic.co/">Diskussion der Elastic-Community</a> teil.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ecommerce-search-governance-improve-retrieval</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ecommerce-search-governance-improve-retrieval</guid>
    <category><![CDATA[Operativer Betrieb]]></category>
    <dc:creator><![CDATA[Alexander Marquardt,Honza Král,Taylor Roy]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt840c7a0a5b92080f/6a1710f967045b3e5445c2cd/3793259b01a5653a7520393a2f006610de0d21e7-1280x720.png" length="0" type="image/png"/>
    <pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Höherer Durchsatz und geringere Latenz: Elastic Cloud Serverless auf AWS erhält einen deutlichen Leistungsschub.]]></title>
    <description><![CDATA[Wir haben die AWS-Infrastruktur für Elasticsearch Serverless auf neuere, schnellere Hardware upgegradet. Erfahren Sie, wie dieser enorme Leistungsschub schnellere Abfragen, besseres Skalieren und niedrigere Kosten liefert.]]></description>
    <content:encoded><![CDATA[<p>Elastic Cloud Serverless ist bereits die endgültige Lösung für Entwickler:innen, die effiziente Such- und KI-Anwendungen ohne die operative Belastung der Infrastruktur entwickeln möchten. Jetzt heben wir die Performance Ihrer serverlosen Projekte auf ein ganz neues Niveau.</p><p>Wir haben ein umfassendes Infrastruktur-Upgrade für alle <a href="https://www.elastic.co/cloud/serverless">Elastic Cloud Serverless-Projekte</a> abgeschlossen, die auf AWS laufen und auf neuere, schnellere Hardware migriert wurden. Diese Änderung wurde automatisch auf alle Serverless-Projekte ausgerollt. Es bietet <strong>einen höheren Durchsatz und geringere Latenz</strong> für Serverless-Projekte mit Elasticsearch, Elastic Observability und Elastic Security auf AWS.</p><h2><strong>Wichtigste Leistungsvorteile für Entwickler:innen</strong></h2><p>Die neue AWS-Hardwareinfrastruktur bildet die Grundlage für alles, was Sie mit Elastic Cloud Serverless tun, und führt zu spürbaren Vorteilen hinsichtlich der Geschwindigkeit und Reaktionsfähigkeit Ihrer Anwendungen.</p><h3><strong>Reduzierte Abfragelatenz … erhöhter Durchsatz</strong></h3><p>Die verbesserte Hardware steigert die Geschwindigkeit der Rechenressourcen erheblich, sodass Ihre Suchanfragen schneller als je zuvor verarbeitet werden.</p><ul><li><p><strong>Suchen und Vektorsuche:</strong> Egal, ob Sie traditionelle Volltextabfragen durchführen oder modernste Vektorsuche für Ihre <a href="https://www.elastic.co/generative-ai">generative KI- und Retrieval-Augmented-Generation (RAG)-Anwendungen</a> verwenden – Sie werden eine deutliche Verringerung der Latenzzeit feststellen. Interne Benchmarkings zeigten einen durchschnittlichen Rückgang der Suchlatenz um 35 %.</p></li><li><p><strong>Schnellere Indexierung:</strong> Die Ingestion-Raten sind optimiert, sodass Sie riesige Datenmengen und komplexe Dokumente mit erhöhtem Durchsatz indexieren können. Das ist besonders wichtig für Anwendungen, die Daten nahezu in Echtzeit anzeigen müssen. Interne Benchmarkings zeigten einen durchschnittlichen Anstieg des Indexierungsdurchsatzes um 26 %.</p></li></ul><h3><strong>Konstante Leistung unter Last</strong></h3><p>Elastic Cloud Serverless ist so konzipiert, dass es sich dynamisch in Echtzeit an die Nachfrage anpasst und die Latenz minimiert, unabhängig von Ihrer Arbeitslast. Mit diesem Hardware-Upgrade ist das Skalieren nun leistungsfähiger und reaktionsschneller.</p><ul><li><p><strong>Problemloser Umgang mit Spitzen:</strong> Egal, ob Sie mit einem plötzlichen Anstieg des Nutzerverkehrs oder einem massiven Batch-Ingest konfrontiert sind – die neue Infrastruktur stellt sicher, dass Ihre Such- und Indexierungsressourcen effizienter skaliert werden, um eine gleichbleibend niedrige Latenz zu gewährleisten.</p></li><li><p><strong>Optimierte Entkopplung von Rechenleistung und Speicher:</strong> Die Serverless-Architektur trennt Rechenleistung und Speicher, wodurch Workloads unabhängig voneinander skaliert werden können, um optimale Leistung und Kosteneffizienz zu gewährleisten. Die schnellere Hardware verbessert die Computerschicht und maximiert die Effizienz dieses entkoppelten Designs.</p></li></ul><h2><strong>Hinter den Kulissen: Ergebnisse interner Benchmarks</strong></h2><p>Um die Auswirkungen unseres AWS-Infrastruktur-Upgrades zu quantifizieren, führte das Elastic-Engineering-Team ein umfassendes internes Benchmarking mit einer Reihe von Serverless-Workloads durch. Diese Workloads lieferten empirische Beweise für Leistungsverbesserungen, die Sie in Ihren Anwendungen erwarten können, unabhängig von Ihrem Anwendungsfall.</p><h3><strong>Der Benchmarking-Ansatz</strong></h3><p>Wir konzentrierten unsere Tests auf die wichtigsten Kennzahlen, die das Entwicklererlebnis und die Anwendungsreaktionsfähigkeit direkt beeinflussen: Reaktionszeit (also Latenz) und Durchsatz bei Such- und Indexierungsoperationen.</p><ul><li><p><strong>Getestete Arbeitslasten:</strong> Die Tests umfassten Suchvorgänge mit hoher Parallelität, wie sie typisch für benutzerorientierte Anwendungen sind, komplexe Vektorsuchanfragen sowie die Erfassung/Indexierung großer Datenmengen für Anwendungsfälle im Bereich Beobachtbarkeit und Sicherheit. Insbesondere nutzte unsere Testmethodik <a href="https://github.com/elastic/rally-tracks/tree/master">öffentlich</a> <a href="https://github.com/elastic/rally-tracks/tree/master">verfügbare Datensätze für Rally</a>, das Benchmarking-Tool von Elastic.</p><ul><li><p><a href="https://github.com/elastic/rally-tracks/tree/3bedd51/wikipedia"><code>wikipedia</code></a>Ein Datensatz, der aus einem Snapshot des Wikipedia-Textinhalts abgeleitet wurde, um die allgemeine Textsuchleistung zu messen.</p></li><li><p><a href="https://github.com/elastic/rally-tracks/tree/3bedd51/msmarco-passage-ranking"><code>MSMARCO-Passage-Ranking</code></a>Ein Datensatz, abgeleitet von Microsofts Machine Reading Comprehension (MS MARCO), um die Suchleistung auf spärlichen Vektorfeldern zu messen.</p></li><li><p><a href="https://github.com/elastic/rally-tracks/tree/3bedd51/openai_vector"><code>OpenAI_Vector</code></a>: Ein Datensatz, der aus BEIRs NQ abgeleitet und mit Einbettungen angereichert wurde, die vom <code>text-embedding-ada-002</code>-Modell von OpenAI generiert wurden, um die Suchleistung auf dichten Vektorfeldern zu messen.</p></li></ul></li><li><p><strong>Messung:</strong> Wir verglichen die Leistung der alten und neuen Infrastruktur und maßen die Latenz im 99. Perzentil (P99), um den Worst-Case, die Tail-Latenz-Performance und die Operationen pro Sekunde zu erfassen. Jeder Track wurde für jedes Hardware-Profil fünfmal ausgeführt, um die Konsistenz der Ergebnisse zu gewährleisten.</p></li><li><p><strong>Das Ziel:</strong> Unser Ziel war es, die Fähigkeit der Infrastruktur zu validieren, um eine konstant <strong>schnellere und vorhersehbarere Leistung</strong> zu liefern, selbst in Phasen schneller automatischer Skalierung.</p></li></ul><h3><strong>Zusammenfassung der Leistungsdaten</strong></h3><p>Die Ergebnisse bestätigen deutliche Verbesserungen in Effizienz und Geschwindigkeit. Diese Vorteile schlagen sich direkt in kürzeren Reaktionszeiten für Ihre Benutzer:innen und niedrigeren Betriebskosten nieder, da Sie die gleiche Menge an Arbeit mit weniger Rechenressourcen erledigen können.</p><p>Die folgenden Tabellen zeigen die quantitativen Verbesserungen. Höhere Werte sind besser für den Durchsatz; niedrigere Werte sind besser für die Latenz.</p><p><strong>Suche nach Benchmark-Ergebnissen:</strong></p><p>Benchmark</p><p>Vergleich</p><p>Alte Infrastruktur</p><p>Neue Infrastruktur</p><p>Differential</p><p>„Wikipedia“ (Klartext)</p><p>Durchsatz der Suchvorgänge (Operationen/s)</p><p>729</p><p>1.107</p><p>+52 %</p><p>„Wikipedia“ (Klartext)</p><p>Latenz der Suchoperation (p99, ms)</p><p>56</p><p>35</p><p>-37 %</p><p>„MSMARCO-Passage-Ranking“ (dünnbesetzte Vektoren)</p><p>Durchsatz der Suchvorgänge (Operationen/s)</p><p>22</p><p>31</p><p>+40 %</p><p>„MSMARCO-Passage-Ranking“ (dünnbesetzte Vektoren)</p><p>Latenz der Suchoperation (p99, ms)</p><p>108</p><p>67</p><p>-38 %</p><p>`OpenAI_Vector` (dichte Vektoren)</p><p>Durchsatz der Suchvorgänge (Operationen/s)</p><p>475</p><p>624</p><p>+31 %</p><p>`OpenAI_Vector` (dichte Vektoren)</p><p>Latenz der Suchoperation (p99, ms)</p><p>35</p><p>22</p><p>-37 %</p><p><strong>Indexieren der Benchmark-Ergebnisse:</strong></p><p>Benchmark</p><p>Vergleich</p><p>Alte Infrastruktur</p><p>Neue Infrastruktur</p><p>Differential</p><p>„Wikipedia“ (Klartext)</p><p>Durchsatz der Suchvorgänge (Operationen/s)</p><p>2.845</p><p>3220</p><p>+13 %</p><p>„Wikipedia“ (Klartext)</p><p>Latenz der Suchoperation (p99, ms)</p><p>1769</p><p>1120</p><p>-37 %</p><p>„MSMARCO-Passage-Ranking“ (dünnbesetzte Vektoren)</p><p>Durchsatz der Suchvorgänge (Operationen/s)</p><p>7.087</p><p>8900</p><p>+26 %</p><p>„MSMARCO-Passage-Ranking“ (dünnbesetzte Vektoren)</p><p>Latenz der Suchoperation (p99, ms)</p><p>824</p><p>677</p><p>-18 %</p><p>`OpenAI_Vector` (dichte Vektoren)</p><p>Durchsatz der Suchvorgänge (Operationen/s)</p><p>2.972</p><p>3187</p><p>+7 %</p><p>`OpenAI_Vector` (dichte Vektoren)</p><p>Latenz der Suchoperation (p99, ms)</p><p>2946</p><p>2944</p><p>0 %</p><h2><strong>Der zusätzliche Bonus: Kostenreduzierung</strong></h2><p>Unser Fokus liegt zwar auf der Bereitstellung einer Performance mit geringer Latenz, aber die Effizienz der neuen Hardware hat auch einen direkten, positiven Einfluss auf die Kosten von Elasticsearch-Projekten.</p><p><a href="https://www.elastic.co/pricing/serverless-search">Die Preisgestaltung von Elasticsearch Serverless</a> basiert auf der Nutzung, das heißt, Sie zahlen nur für die Ingest- und Suchressourcen, die Sie verbrauchen. Da die neuere, schnellere Hardware effizienter ist, werden Ihre Arbeitslasten oft mit weniger Ressourcen erledigt, was bei den meisten Projekten zu einer erheblichen Kostenreduzierung führt. Sie erhalten eine Premium-Leistungssteigerung ohne den Premium-Preis – die Definition von optimierter Effizienz.</p><h2><strong>Was bedeutet das für Sie als Entwickler:in?</strong></h2><p>Dieses Infrastruktur-Upgrade wird vollständig von Elastic verwaltet, sodass Sie keinen Finger rühren müssen – keine Migrationen und keine Konfigurationsänderungen. Die Verbesserung erfolgt sofort und automatisch bei all Ihren AWS-basierten Serverless-Projekten.</p><p>Dieses Upgrade ermöglicht Ihnen Folgendes:</p><ul><li><p><strong>Erstellen Sie schnellere Anwendungen:</strong> Konzentrieren Sie sich auf die Geschwindigkeit der Features, da Sie wissen, dass Ihre zugrundeliegende Such-Platform die Geschwindigkeit bietet, die Ihre Benutzer:innen erwarten.</p></li><li><p><strong>Innovation mit Zuversicht:</strong> Stellen Sie neue Such-, Beobachtbarkeits- und Sicherheitsfeatures – einschließlich komplexer KI-Features wie Vektorsuche und Relevanzranking – mit der Gewissheit bereit, dass die Platform die Last mit maximaler Leistung bewältigen kann.</p></li><li><p><strong>Vereinfachen Sie Ihren Stack:</strong> Nutzen Sie einen vollständig verwalteten Service, der Infrastrukturmanagement, Kapazitätsplanung und Skalierung übernimmt, damit Sie sich auf Ihren Code und Ihre Daten konzentrieren können.
</p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-serverless-aws-performance-boost</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-serverless-aws-performance-boost</guid>
    <category><![CDATA[Elastic Cloud Serverless]]></category>
    <category><![CDATA[Operativer Betrieb]]></category>
    <dc:creator><![CDATA[Pete Galeotti,Yuvraj Gupta,Rachel Forshee]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt399bcc5a2e55bfe0/6a1708b45091684557e1ba3c/3aa0b481994d2445ba979d3c79fff64c5ee6676a-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Verbesserung der Relevanz mehrsprachiger Einbettungsmodelle durch hybrides Such-Reranking]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie die Relevanz der Suchergebnisse des E5-Multilingual-Embedding-Modells mithilfe des Cohere-Rerankers und der Hybridsuche in Elasticsearch verbessern können.]]></description>
    <content:encoded><![CDATA[<h2>Einleitung</h2><p>Im <a href="https://www.elastic.co/search-labs/blog/multilingual-embedding-model-deployment-elasticsearch">letzten Teil dieser Serie</a> haben wir die Bereitstellung des vortrainierten E5-Modells von Elastic (sowie anderer mehrsprachiger Text-Embedding-Modelle von Hugging Face) erläutert und uns mit der Generierung dichter Vektor-Embeddings aus Ihren Textdaten mithilfe von Elasticsearch und Kibana befasst. In diesem Blogbeitrag werden wir die Ergebnisse dieser Einbettungen untersuchen und die wesentlichen Vorteile der Verwendung eines mehrsprachigen Modells hervorheben.</p><p>Nachdem wir nun unseren Index <code>coco_multilingual</code> haben, liefert die Suche Dokumente in mehreren Sprachen, wobei das Feld „en“ als Referenz dient:</p># GET coco_multilingual/_search
    {
       "_index": "coco_multilingual",
       "_id": "WAiXQJYBgf6odR9bLohZ",
       "_score": 1,
       "_source": {
         "description": "Ein Parkmeßgerät auf einer Straße mit Autos",
         "en": "A row of parked cars sitting next to parking meters.",
         "language": "de",
         "vector_description": {...}
       }
     },
     . . .<h2>Eine Suche auf Englisch durchführen</h2><p>Versuchen wir, die Suche auf Englisch durchzuführen und sehen wir, wie gut sie funktioniert:</p>GET coco_multi/_search
{
"size": 10,
"_source": [
  "description", "language", "en"
],
"knn": {
  "field": "vector_description.predicted_value",
  "k": 10,
  "num_candidates": 100,
  "query_vector_builder": {
    "text_embedding": {
      "model_id": ".multilingual-e5-small_linux-x86_64_search",
      "model_text": "query: kitty"
    }
  }
}
}{
       "_index": "coco_multi",
       "_id": "JQiXQJYBgf6odR9b6Yz0",
       "_score": 0.9334303,
       "_source": {
         "description": "Eine Katze, die in einem kleinen, gepackten Koffer sitzt.",
         "en": "A brown and white cat is in a suitcase.",
         "language": "de"
       }
     },
      {
       "_index": "coco_multi",
       "_id": "3AiXQJYBgf6odR9bFod6",
       "_score": 0.9281012,
       "_source": {
         "description": "Una bambina che tiene un gattino vicino a una recinzione blu.",
         "en": "A little girl holding a kitten next to a blue fence.",
         "language": "it"
       }
     },
     . . .<p>Auch wenn die Anfrage täuschend einfach aussieht, suchen wir hier im Hintergrund nach den numerischen Einbettungen des Wortes „Kitty“ in allen Dokumenten und Sprachen. Und weil wir eine Vektorsuche durchführen, können wir semantisch nach allen Wörtern suchen, die mit „Kitty“ verwandt sein könnten: „Katze“, „Kätzchen“, „Katze“, „Gatto“ (Italienisch), „Mèo“ (Vietnamesisch), 고양이 (Koreanisch), 猫 (Chinesisch) usw. Das bedeutet, dass wir, selbst wenn meine Suchanfrage auf Englisch ist, auch Inhalte in allen anderen Sprachen suchen können. Wenn man beispielsweise nach „kitty l<code>ying on something</code> sucht, erhält man auch Dokumente in Italienisch, Niederländisch oder Vietnamesisch. Das nenne ich Effizienz!</p><h2>Suche nach Inhalten in anderen Sprachen</h2>GET coco_multi/_search
{  
 "size": 100,
 "_source": [
   "description", "language", "en"
 ],
 "knn": {
   "field": "vector_description.predicted_value",
   "k": 50,
   "num_candidates": 1000,
   "query_vector_builder": {
     "text_embedding": {
       "model_id": ".multilingual-e5-small_linux-x86_64_search",
       "model_text": "query: kitty lying on something"
     }
   }
 }
}{
 "description": "A black kitten lays on her side beside remote controls.",
 "en": "A black kitten lays on her side beside remote controls.",
 "language": "en"
},
{
 "description": "un gattino sdraiato su un letto accanto ad alcuni telefoni ",
 "en": "A black kitten lays on her side beside remote controls.",
 "language": "it"
},
{
 "description": "eine Katze legt sich auf ein ausgestopftes Tier",
 "en": "a cat lays down on a stuffed animal",
 "language": "de"
},
{
 "description": "Một chú mèo con màu đen nằm nghiêng bên cạnh điều khiển từ xa.",
 "en": "A black kitten lays on her side beside remote controls.",
 "language": "vi"
}
. . .<p>Eine Suche nach dem koreanischen Stichwort „Katze“ („고양이“) liefert ebenfalls aussagekräftige Ergebnisse. Das Spektakuläre daran ist, dass wir in diesem Index nicht einmal Dokumente in koreanischer Sprache haben!</p>GET coco_multi/_search
{
 "size": 100,
 "_source": [
   "description", "language", "en"
 ],
 "knn": {
   "field": "vector_description.predicted_value",
   "k": 50,
   "num_candidates": 1000,
   "query_vector_builder": {
     "text_embedding": {
       "model_id": ".multilingual-e5-small_linux-x86_64_search",
       "model_text": "query: 고양이"
     }
   }
 }
} {
       {
         "description": "eine Katze legt sich auf ein ausgestopftes Tier",
         "en": "a cat lays down on a stuffed animal",
         "language": "de"
       }
     },
     {
       {
         "description": "Một con chó và con mèo đang ngủ với nhau trên một chiếc ghế dài màu cam.",
         "en": "A dog and cat lying  together on an orange couch. ",
         "language": "vi"
       }
     },<p>Dies funktioniert, weil das Einbettungsmodell die Bedeutung in einem gemeinsamen semantischen Raum repräsentiert und somit das Auffinden relevanter Bilder auch bei einer Anfrage in einer anderen Sprache als den indizierten Bildunterschriften ermöglicht.</p><h2>Erhöhung der Relevanz der Suchergebnisse durch hybride Suche und Reranking</h2><p>Wir freuen uns, dass die entsprechenden Ergebnisse wie erwartet eingetreten sind. In der realen Welt, beispielsweise im E-Commerce oder bei RAG-Anwendungen, bei denen die Ergebnisse auf die 5 bis 10 relevantesten Ergebnisse eingegrenzt werden müssen, können wir ein Rerank-Modell verwenden, um die relevantesten Ergebnisse zu priorisieren.</p><p>Eine Suchanfrage wie „Welche Farbe hat die Katze?“ auf Vietnamesisch liefert hier zwar viele Ergebnisse, aber die ersten ein oder zwei Ergebnisse sind möglicherweise nicht die relevantesten.</p>GET coco_multi/_search
{
 "size": 20,
 "_source": [
   "description",
   "language",
   "en"
 ],
 "knn": {
   "field": "vector_description.predicted_value",
   "k": 20,
   "num_candidates": 1000,
   "query_vector_builder": {
     "text_embedding": {
       "model_id": ".multilingual-e5-small_linux-x86_64_search",
       "model_text": "query: con mèo màu gì?"
     }
   }
 }
}<p>In allen Ergebnissen wird die Katze oder irgendeine Farbe erwähnt:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt979f5944b1708042/6a17ef76420229ff6829f6aa/33e1e887dbbdd1066cfedc7375f5e3b46538529e-859x847.png" alt="" /><p>Lasst uns das verbessern! Lasst uns das mehrsprachige Rerank-Modell von <a href="https://cohere.com/blog/rerank-3pt5">Cohere</a>integrieren, um die Argumentation in Bezug auf unsere Frage zu verbessern.</p>PUT _inference/rerank/cohere_rerank
{
 "service": "cohere",
 "service_settings": {
   "api_key": "your_api_key",
   "model_id": "rerank-v3.5"
 },
 "task_settings": {
   "top_n": 10,
   "return_documents": true
 }
}


GET coco_multi/_search
{
"size": 10,
"_source": [
  "description",
  "language",
  "en"
],
"retriever": {
  "text_similarity_reranker": {
    "retriever": {
      "rrf": {
        "retrievers": [
          {
            "knn": {
              "field": "vector_description.predicted_value",
              "k": 50,
              "num_candidates": 100,
              "query_vector_builder": {
                "text_embedding": {
                  "model_id": ".multilingual-e5-small_linux-x86_64_search",
                  "model_text": "query: con mèo màu gì?" // English: What color is the cat?
                }
              }
            }
          }
        ],
        "rank_window_size": 100,
        "rank_constant": 0
      }
    },
    "field": "description",
    "inference_id": "cohere_rerank",
    "inference_text": "con mèo màu gì?"
  }
}
} {
       "_index": "coco_multi",
       "_id": "rQiYQJYBgf6odR9bBYyH",
       "_score": 1.5501487,
       "_source": {
         "description": "Hai cái điện thoại được đặt trên một cái chăn cạnh một con mèo con màu đen.",
         "en": "A black kitten lays on her side beside remote controls.",
         "language": "vi"
       }
     },
     {
       "_index": "coco_multi",
       "_id": "swiXQJYBgf6odR9b04uf",
       "_score": 1.5427427,
       "_source": {
         "description": "Một con mèo sọc nâu nhìn vào máy quay.", // Real translation: A brown striped cat looks at the camera 
         "en": "This cat is sitting on a porch near a tire.",
         "language": "vi"
       }
     },<p>Mit den besten Ergebnissen kann unsere Anwendung nun mit Sicherheit sagen, ob das Kätzchen schwarz oder braun mit Streifen ist. Was hierbei noch interessanter ist: Unsere Vektorsuche hat tatsächlich eine Auslassung in der englischen Bildunterschrift des ursprünglichen Datensatzes aufgedeckt. Es ist in der Lage, die braun gestreifte Katze zu finden, obwohl die englische Referenzübersetzung dieses Detail ausgelassen hat. Das ist die Stärke der Vektorsuche.</p><h2>Fazit</h2><p>In diesem Blog haben wir den Nutzen eines mehrsprachigen Einbettungsmodells erläutert und gezeigt, wie man Elasticsearch nutzen kann, um die Modelle zu integrieren, Einbettungen zu generieren und Relevanz und Genauigkeit mit einer hybriden Suche und einem Reranker effektiv zu verbessern. Sie können <a href="https://cloud.elastic.co/registration?onboarding_token=vectorsearch&amp;cta=cloud-registration&amp;tech=trial&amp;plcmt=article%20content&amp;pg=search-labs">einen eigenen Cloud-Cluster erstellen</a> , um <a href="https://www.elastic.co/docs/explore-analyze/machine-learning/nlp/ml-nlp-e5">die mehrsprachige semantische Suche mit unserem sofort einsatzbereiten E5-Modell</a> auf der Sprache und dem Datensatz Ihrer Wahl auszuprobieren.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/multilingual-embedding-model-hybrid-search-reranking</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/multilingual-embedding-model-hybrid-search-reranking</guid>
    <category><![CDATA[Vektordatenbank]]></category>
    <category><![CDATA[Operativer Betrieb]]></category>
    <dc:creator><![CDATA[Quynh Nguyen]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf625e3f63fcd9f54/6a17ef7796142a61f8eb1bcd/d341b04acecc8eeec321f5404e1643447ecc8526-720x420.png" length="0" type="image/png"/>
    <pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Bereitstellung eines mehrsprachigen Einbettungsmodells in Elasticsearch]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie ein mehrsprachiges e5-Einbettungsmodell für die Vektorsuche und den sprachübergreifenden Abruf in Elasticsearch bereitstellen.]]></description>
    <content:encoded><![CDATA[<h2>Einleitung</h2><p>In einer Welt globaler Nutzer ist die sprachübergreifende Informationswiedergewinnung (CLIR) von entscheidender Bedeutung. Anstatt die Suche auf eine einzige Sprache zu beschränken, ermöglicht CLIR das Auffinden von Informationen in <em>jeder beliebigen</em> Sprache, verbessert so die Benutzerfreundlichkeit und optimiert die Abläufe. Stellen Sie sich einen globalen Markt vor, auf dem E-Commerce-Kunden in ihrer Sprache nach Artikeln suchen können und die passenden Ergebnisse angezeigt werden, ohne dass die Daten vorher lokalisiert werden müssen. Oder, um akademischen Forschern die Möglichkeit zu geben, in ihrer Muttersprache nach wissenschaftlichen Artikeln zu suchen, inklusive aller Nuancen und Komplexitäten, selbst wenn die Quelle in einer anderen Sprache verfasst ist.</p><p>Mehrsprachige Text-Embedding-Modelle ermöglichen uns genau das. Einbettungen sind eine Möglichkeit, die Bedeutung von Text als numerische Vektoren darzustellen. Diese Vektoren sind so konzipiert, dass Texte mit ähnlicher Bedeutung in einem hochdimensionalen Raum nahe beieinander liegen. Multilinguale Text-Embedding-Modelle sind speziell dafür entwickelt worden, Wörter und Phrasen mit der gleichen Bedeutung in verschiedenen Sprachen in einen ähnlichen Vektorraum abzubilden.</p><p>Modelle wie das Open-Source-Multilingual E5 werden mit riesigen Mengen an Textdaten trainiert, oft unter Verwendung von Techniken wie dem kontrastiven Lernen. Bei diesem Ansatz lernt das Modell, zwischen Textpaaren mit ähnlicher Bedeutung (positive Paare) und solchen mit unähnlicher Bedeutung (negative Paare) zu unterscheiden. Das Modell wird so trainiert, dass die von ihm erzeugten Vektoren so angepasst werden, dass die Ähnlichkeit zwischen positiven Paaren maximiert und die Ähnlichkeit zwischen negativen Paaren minimiert wird. Bei mehrsprachigen Modellen umfassen diese Trainingsdaten Textpaare in verschiedenen Sprachen, die Übersetzungen voneinander sind, wodurch das Modell einen gemeinsamen Repräsentationsraum für mehrere Sprachen erlernen kann. Die resultierenden Einbettungen können dann für verschiedene NLP-Aufgaben verwendet werden, darunter die sprachübergreifende Suche, bei der die Ähnlichkeit zwischen Texteinbettungen genutzt wird, um relevante Dokumente unabhängig von der Sprache der Anfrage zu finden.</p><h2>Vorteile der mehrsprachigen Vektorsuche</h2><ul><li><p><strong>Nuance</strong>: Die Vektorsuche zeichnet sich durch ihre Fähigkeit aus, semantische Bedeutungen zu erfassen und geht über die reine Stichwortsuche hinaus. Dies ist von entscheidender Bedeutung für Aufgaben, die das Verständnis von Kontext und sprachlichen Feinheiten erfordern.</p></li><li><p><strong>Sprachübergreifendes Verständnis</strong>: Ermöglicht einen effektiven Informationsabruf über verschiedene Sprachen hinweg, selbst wenn die Suchanfrage und die Dokumente unterschiedliches Vokabular verwenden.</p></li><li><p><strong>Relevanz</strong>: Liefert relevantere Ergebnisse durch Fokussierung auf die konzeptionelle Ähnlichkeit zwischen Suchanfragen und Dokumenten.</p></li></ul><p>Nehmen wir beispielsweise einen akademischen Forscher, der den „Einfluss sozialer Medien auf den politischen Diskurs“ in verschiedenen Ländern untersucht. Mit der Vektorsuche können sie Suchanfragen wie „l'impatto dei social media sul discorso politico“ (Italienisch) oder „ảnh hưởng của mạng xã hội đối với diễn ngôn chính trị“ (Vietnamesisch) eingeben und relevante Artikel auf Englisch, Spanisch oder einer anderen Sprache finden indizierte Sprache. Dies liegt daran, dass die Vektorsuche Artikel identifiziert, die das <em>Konzept</em> des Einflusses sozialer Medien auf die Politik diskutieren, und nicht nur solche, die die exakten Schlüsselwörter enthalten. Dies erweitert und vertieft die Bandbreite ihrer Forschung erheblich.</p><h2>Erste Schritte</h2><p>Hier erfahren Sie, wie Sie CLIR mit Elasticsearch einrichten – mit dem E5-Modell, das standardmäßig mitgeliefert wird. Wir verwenden den <a href="https://huggingface.co/datasets/romrawinjp/multilingual-coco">Open-Source-Datensatz COCO</a>, der Bildunterschriften in mehreren Sprachen enthält, um zwei Arten von Suchanfragen zu visualisieren:</p><ol><li><p>Suchanfragen und Suchbegriffe in anderen Sprachen für einen englischen Datensatz, und</p></li><li><p>Abfragen in mehreren Sprachen auf einem Datensatz, der Dokumente in mehreren Sprachen enthält.</p></li></ol><p>Anschließend werden wir die Leistungsfähigkeit der hybriden Suche und des Rerankings nutzen, um die Suchergebnisse noch weiter zu verbessern.</p><h2>Voraussetzungen</h2><ul><li><p>Python 3.6+</p></li><li><p>Elasticsearch 8+</p></li><li><p>Elasticsearch Python-Client: pip install elasticsearch</p></li></ul><h2>Datensatz</h2><p>Der <a href="https://huggingface.co/datasets/romrawinjp/multilingual-coco">COCO-Datensatz</a> ist ein umfangreicher Datensatz zur Untertitelung. Jedes Bild im Datensatz ist in mehreren verschiedenen Sprachen beschriftet, wobei für jede Sprache mehrere Übersetzungen verfügbar sind. Zur Veranschaulichung werden wir jede Übersetzung als einzelnes Dokument indexieren, zusammen mit der ersten verfügbaren englischen Übersetzung als Referenz.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc7e508e9a7dffe8/6a17f3e2b1e113249579f394/d4f0632529c71a22fbdecf21c9f4f0bb64b8e69c-1600x567.png" alt="" /><h3>Schritt 1: Laden Sie den mehrsprachigen COCO-Datensatz herunter</h3><p>Um den Blog zu vereinfachen und das Nachvollziehen zu erleichtern, laden wir hier die ersten 100 Zeilen der Restval-Tabelle mit einem einfachen API-Aufruf in eine lokale JSON-Datei. Alternativ können Sie die Datensätze der HuggingFace-Bibliothek verwenden, um den vollständigen Datensatz oder Teilmengen des Datensatzes zu laden.</p>import requests
import json
import os
### Download multilingual coco dataset into a json file (for easy viewing)
### Here we are retrieving first 100 rows for this example
### Alternatively, you can use `datasets` library from Hugging Face
url = "https://datasets-server.huggingface.co/rows?dataset=romrawinjp%2Fmultilingual-coco&amp;config=default&amp;split=restval&amp;offset=0&amp;length=100"
response = requests.get(url)


if response.status_code == 200:
   data = response.json()
   output_file = "multilingual_coco_sample.json" 
   ### Loading the downloaded content into a json file locally
   with open(output_file, "w", encoding="utf-8") as f:
       json.dump(data, f, indent=4, ensure_ascii=False)
   print(f"Data successfully downloaded and saved to {output_file}")
else:
   print(f"Failed to download data: {response.status_code}")
   print(response.text)<p>Wenn die Daten erfolgreich in eine JSON-Datei geladen wurden, sollte die Ausgabe in etwa so aussehen:</p><p><code>Data successfully downloaded and saved to multilingual_coco_sample.json</code></p><h3>Schritt 2: (Elasticsearch starten) und die Daten in Elasticsearch indizieren</h3><p>a) Starten Sie Ihren lokalen Elasticsearch-Server.</p><p>b) Starten Sie den Elasticsearch-Client.</p>from elasticsearch import Elasticsearch
from getpass import getpass


# Initialize Elasticsearch client
es = Elasticsearch(getpass("Host: "), api_key=getpass("API Key: "))


index_name = "coco"


# Create the index if it doesn't exist
if not es.indices.exists(index=index_name):
   es.indices.create(index=index_name, body=mapping)<p>c) Indexdaten</p># Load the JSON data
with open('./multilingual_coco_sample.json', 'r') as f:
   data = json.load(f)


rows = data["rows"]
# List of languages to process
languages = ["en", "es", "de", "it", "vi", "th"]


# For each image, we will process each individual caption as its own document
bulk_data = []
for data in rows:
   row = data["row"]
   image = row.get("image")
   image_url = image["src"]


   # Process each language
   for lang in languages:
       # Skip if language not present in this row
       if lang not in row:
           continue


       # Get all descriptions for this language
 # along with first available English caption for reference
       descriptions = row[lang]
       first_eng_caption = row["en"][0]


       # Prepare bulk indexing data
       for description in descriptions:
           if description == "":
               continue
           # Add index operation
           bulk_data.append(
               {"index": {"_index": index_name}}
           )
           # Add document
           bulk_data.append({
               "language": lang,
               "description": description,
               "en": first_eng_caption,
               "image_url": image_url,
           })


# Perform bulk indexing
if bulk_data:
   try:
       response = es.bulk(operations=bulk_data)
       if response["errors"]:
           print("Some documents failed to index")
       else:
           print(f"Successfully bulk indexed {len(bulk_data)} documents")
   except Exception as e:
       print(f"Error during bulk indexing: {str(e)}")


print("Indexing complete!")<p>Sobald die Daten indexiert sind, sollte etwa Folgendes angezeigt werden:</p><p><code>Successfully bulk indexed 4840 documents</code></p><p><code>Indexing complete!</code></p><h3>Schritt 3: Das mit E5 trainierte Modell bereitstellen</h3><p>Navigieren Sie in Kibana zur Seite „Stack-Verwaltung &gt; <strong>Trainierte Modelle“</strong> und klicken Sie für das Modell „.multilingual-e5-small_linux-x86_64“ <strong>auf „Bereitstellen“</strong> . Option. Dieses E5-Modell ist ein kleines, mehrsprachiges Gerät, das für linux-x86_64 optimiert ist und sofort einsatzbereit ist. Durch Klicken auf „Bereitstellen“ wird ein Bildschirm angezeigt, auf dem Sie die Bereitstellungseinstellungen oder vCPU-Konfigurationen anpassen können. Der Einfachheit halber verwenden wir die Standardoptionen mit der Auswahl adaptiver Ressourcen, wodurch unsere Bereitstellung je nach Nutzung automatisch skaliert wird.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfbc09867063a8e6f/6a17f3e3148009a295b4889d/95cd8f352425d1db2d04b00c3c88d1e71d1ef19a-1600x440.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt264a2016341e9b6f/6a17f3f0e8fbce18de3a1aa7/1599d99949dda8267acc58f400a403a3af5373ef-1600x655.png" alt="" /><p>Optional können Sie auch andere Text-Embedding-Modelle verwenden. Um beispielsweise BGE-M3 zu verwenden, können Sie <a href="https://www.elastic.co/docs/reference/elasticsearch/clients/eland/machine-learning#ml-nlp-pytorch">den Eland Python-Client von Elastic</a> verwenden, um das Modell von HuggingFace zu importieren.</p>export MODEL_ID="bge-m3"
export HUB_MODEL_ID="BAAI/bge-m3"
export CLOUD_ID={{CLOUD_ID}}
export ES_API_KEY={{API_KEY}}
docker run -it --rm docker.elastic.co/eland/eland \
eland_import_hub_model --cloud-id $CLOUD_ID --es-api-key $ES_API_KEY --hub-model-id $HUB_MODEL_ID --es-model-id $MODEL_ID --task-type text_embedding --start<p>Navigieren Sie anschließend zur Seite „Trainierte Modelle“, um das importierte Modell mit den gewünschten Konfigurationen bereitzustellen.</p><h3>Schritt 4: Vektorisieren oder Einbettungen für die Originaldaten mit dem bereitgestellten Modell erstellen</h3><p>Um die Einbettungen zu erstellen, müssen wir zunächst eine Ingest-Pipeline erstellen, die es uns ermöglicht, den Text zu nehmen und ihn durch das Inferenz-Texteinbettungsmodell laufen zu lassen. Dies ist über die Benutzeroberfläche von Kibana oder über die API von Elasticsearch möglich.</p><p><strong>Um dies über die Kibana-Oberfläche zu tun</strong>, klicken Sie nach dem Bereitstellen des trainierten Modells auf die Schaltfläche <strong>„Testen </strong> “. Dies ermöglicht es Ihnen, die generierten Einbettungen zu testen und eine Vorschau anzuzeigen. Erstellen Sie eine neue Datenansicht für <code>coco</code>Index, Datenansicht auf die neu erstellte Coco-Datenansicht setzen und Feld auf <code>description</code> setzen, da dies das Feld ist, für das wir Einbettungen generieren möchten.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt24a2b9a9a5111bbc/6a17f3f13e9e452c7fba15d5/cfe189e13dc118d325e7fb90bdace0c912e29f51-1088x1600.png" alt="" /><p>Das funktioniert hervorragend! Nun können wir mit der Erstellung der Ingest-Pipeline fortfahren und unsere Originaldokumente neu indizieren, sie durch die Pipeline leiten und einen neuen Index mit den Einbettungen erstellen. Dies erreichen Sie durch Klicken auf <strong>„Pipeline erstellen“</strong>. Sie werden dann durch den Erstellungsprozess der Pipeline geführt, wobei automatisch die benötigten Prozessoren zur Erstellung der Einbettungen bereitgestellt werden.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte39c5ad52702103d/6a17f3f3e9ea87dd05a9c734/1e043c1c3279b66fbdf19c06b41e76e613043998-1600x1126.png" alt="" /><p>Der Assistent kann außerdem automatisch die Prozessoren eintragen, die zur Fehlerbehebung während der Datenerfassung und -verarbeitung benötigt werden.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt63e002a79d177cf4/6a17f3f596142a3e91eb1c48/8804d31b4f869078e3b2245040bbb0ab1720a94a-1600x1084.png" alt="" /><p>Erstellen wir nun die Ingest-Pipeline. Ich nenne die Pipeline <code>coco_e5</code>. Sobald die Pipeline erfolgreich erstellt wurde, können Sie sie sofort verwenden, um die Einbettungen zu generieren, indem Sie die ursprünglich indizierten Daten im Assistenten in einen neuen Index umindizieren. Klicken Sie auf <strong>„Neu indizieren“</strong> , um den Vorgang zu starten.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt39243d9ad1779fdf/6a17f3f696142a13eaeb1c4c/e34b1b18f5b24420d4581fe4d657c569926c2023-1600x1126.png" alt="" /><h2>Für komplexere Konfigurationen können wir die Elasticsearch-API verwenden.</h2><p>Bei einigen Modellen kann es aufgrund der Art und Weise, wie die Modelle trainiert wurden, erforderlich sein, bestimmte Texte vor oder nach dem eigentlichen Input einzufügen, bevor die Einbettungen generiert werden; andernfalls kommt es zu einer Leistungsverschlechterung.</p><p>Beim Modell e5 erwartet man beispielsweise, dass der Eingabetext dem Format „passage: {content of passage}“ folgt. Um das zu erreichen, nutzen wir die Ingest-Pipelines: Wir erstellen eine neue Ingest-Pipeline <strong>vectorize_descriptions</strong>. In dieser Pipeline erstellen wir ein neues temporäres Feld <code>temp_desc</code> , fügen dem Text <code>description</code> „passage: “ voran, führen <code>temp_desc</code> das Modell aus, um Text-Embeddings zu generieren, und löschen dann <code>temp_desc</code>.</p>PUT _ingest/pipeline/vectorize_descriptions
{
"description": "Pipeline to run the descriptions text_field through our inference text embedding model",
"processors": [
 {
   "set": {
     "field": "temp_desc",
     "value": "passage: {{description}}"
   }
 },
 {
   "inference": {     
"field_map": {
       "temp_desc": "text_field"
     },
     "model_id": ".multilingual-e5-small_linux-x86_64_search",
     "target_field": "vector_description"
   }
 },
 {
   "remove": {
     "field": "temp_desc"
   }
 }
]
}<p>Darüber hinaus möchten wir möglicherweise festlegen, welche <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/dense-vector#dense-vector-quantization">Art der Quantisierung</a> wir für den generierten Vektor verwenden möchten. Standardmäßig verwendet Elasticsearch <code>int8_hnsw</code>, aber hier möchte ich <a href="https://www.elastic.co/search-labs/blog/better-binary-quantization-lucene-elasticsearch">Better Binary Quantization</a> (oder <code>bqq_hnsw</code>), wodurch jede Dimension auf eine Einzelbitgenauigkeit reduziert wird. Dadurch wird der Speicherbedarf um 96 % (oder um das 32-Fache) reduziert, allerdings auf Kosten der Genauigkeit. Ich entscheide mich für diese Quantisierungsart, weil ich weiß, dass ich später einen Reranker verwenden werde, um den Genauigkeitsverlust zu verbessern.</p><p>Dazu erstellen wir einen neuen Index mit dem Namen <strong>coco_multi</strong> und legen die Zuordnungen fest. Die Magie liegt hier im Feld vector_description, wo wir den Typ von <strong>index_options</strong>auf <strong>bbq_hnsw</strong> festlegen.</p>PUT coco_multi
{
 "mappings": {
   "properties": {
     "description": {
       "type": "text"
     },
     "en": {
       "type": "text"
     },
     "image_url": {
       "type": "keyword"
     },
     "language": {
       "type": "keyword"
     },
     "vector_description.predicted_value": {
       "type": "dense_vector",
       "dims": 384,
       "index": "true",
       "similarity": "cosine",
       "index_options": {
         "type": "bbq_hnsw" 
       }
     }
   }
 }
}<p>Nun können wir die Originaldokumente in einem neuen Index neu indizieren, wobei unsere Ingest-Pipeline das Beschreibungsfeld „vektorisiert“ oder Einbettungen erstellt.</p>POST _reindex?wait_for_completion=false
{
 "source": {
   "index": "coco"
 },
 "dest": {
   "index": "coco_multilingual",
   "pipeline": "vectorize_descriptions"
 }
}<p>Und das war's! Wir haben erfolgreich ein mehrsprachiges Modell mit Elasticsearch und Kibana implementiert und Schritt für Schritt gelernt, wie man mit Elastic Vektoreinbettungen für seine Daten erstellt, entweder über die Kibana-Benutzeroberfläche oder mit der Elasticsearch-API. Im zweiten Teil dieser Reihe werden wir die Ergebnisse und die Feinheiten der Verwendung eines mehrsprachigen Modells untersuchen. In der Zwischenzeit können Sie <a href="https://cloud.elastic.co/registration?onboarding_token=vectorsearch&amp;cta=cloud-registration&amp;tech=trial&amp;plcmt=article%20content&amp;pg=search-labs">einen eigenen Cloud-Cluster erstellen</a> , um <a href="https://www.elastic.co/docs/explore-analyze/machine-learning/nlp/ml-nlp-e5">die mehrsprachige semantische Suche mit unserem sofort einsatzbereiten E5-Modell</a> auf der Sprache und dem Datensatz Ihrer Wahl auszuprobieren.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/multilingual-embedding-model-deployment-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/multilingual-embedding-model-deployment-elasticsearch</guid>
    <category><![CDATA[Vektordatenbank]]></category>
    <category><![CDATA[Operativer Betrieb]]></category>
    <dc:creator><![CDATA[Quynh Nguyen]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt59254226694f93a6/6a17f3f81480098988b488a1/8f2aa7bebb6b2f701e274ba7282273f9ab4abed6-720x432.png" length="0" type="image/png"/>
    <pubDate>Wed, 22 Oct 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Elastic Open Web Crawler als Code]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie GitHub Actions verwenden, um Elastic Open Crawler-Konfigurationen zu verwalten, sodass Änderungen, die wir in das Repository übertragen, automatisch auf die bereitgestellte Instanz des Crawlers angewendet werden.]]></description>
    <content:encoded><![CDATA[<p>Mit <a href="https://github.com/elastic/crawler">Elastic Open Web Crawler</a> und seiner CLI-gesteuerten Architektur lassen sich versionierte Crawler-Konfigurationen und eine CI/CD-Pipeline mit lokalen Tests jetzt recht einfach realisieren.</p><p>Traditionell war die Verwaltung von Webcrawlern ein manueller, fehleranfälliger Prozess. Dabei ging es um das direkte Bearbeiten von Konfigurationen in der Benutzeroberfläche sowie um das Klonen von Crawl-Konfigurationen, das Zurücksetzen von Einstellungen, die Versionsverwaltung und vieles mehr. Die Behandlung von Crawler-Konfigurationen als Code löst dieses Problem, indem sie die gleichen Vorteile bietet, die wir von der Softwareentwicklung erwarten: Wiederholbarkeit, Nachvollziehbarkeit und Automatisierung.</p><p>Dieser Workflow erleichtert es, den Open Web Crawler in Ihre CI/CD-Pipeline für Rollbacks, Backups und Migrationen einzubinden – Aufgaben, die mit früheren Elastic Crawlern wie dem Elastic Web Crawler oder dem App Search Crawler wesentlich schwieriger waren.</p><p>In diesem Artikel erfahren Sie, wie Sie:</p><ul><li><p>Verwalten Sie unsere Crawl-Konfigurationen mit GitHub.</p></li><li><p>Eine lokale Testumgebung für Pipelines vor der Bereitstellung einrichten</p></li><li><p>Wir erstellen eine Produktionsumgebung, um den Webcrawler jedes Mal mit neuen Einstellungen auszuführen, wenn wir Änderungen an unseren Hauptzweig übertragen.</p></li></ul><p>Das Projekt-Repository finden Sie <a href="https://github.com/llermaly/elastic-open-crawler-as-code"><em><strong>hier</strong></em></a><em><strong>. </strong></em><em>Zum Zeitpunkt der Erstellung dieses Dokuments verwende ich Elasticsearch 9.1.3 und Open Web Crawler 0.4.2.</em></p><h2>Voraussetzungen</h2><ul><li><p>Docker Desktop</p></li><li><p>Elasticsearch-Instanz</p></li><li><p>Virtuelle Maschine mit SSH-Zugriff (z. B. AWS EC2) und installiertem Docker</p></li></ul><h2>Schritte</h2><ol><li><p>Ordnerstruktur</p></li><li><p>Raupenkonfiguration</p></li><li><p>Docker-Compose-Datei (lokale Umgebung)</p></li><li><p>GitHub Actions</p></li><li><p>Lokale Tests</p></li><li><p>Bereitstellung in der Produktionsumgebung</p></li><li><p>Änderungen vornehmen und erneut bereitstellen</p></li></ol><h2>Ordnerstruktur</h2><p>Für dieses Projekt werden wir folgende Dateistruktur verwenden:</p>├── docker-compose.yml # Local elasticsearch + crawler
├── config/crawler-config.yml # Crawler config
├── .github/workflows/deploy.yml # GH Action to deploy changes
├── local.sh # Script to run our local crawler<h2>Raupenkonfiguration</h2><p>Unter <code>crawler-config.yml,</code> wird Folgendes eingetragen:</p>output_sink: elasticsearch
output_index: web-crawl-index
max_crawl_depth: 1

elasticsearch:
  host: ${ES_HOST}
  api_key: ${ES_API_KEY}
     
domains:
  - url: https://web-scraping.dev
    seed_urls:
      - https://web-scraping.dev/product/1
      - https://web-scraping.dev/product/2
      - https://web-scraping.dev/product/3<p>Dies führt einen Crawl von <a href="https://web-scraping.dev/products">https://web-scraping.dev/products</a> durch, einer simulierten Website für Produkte. Wir werden nur die ersten drei Produktseiten durchsuchen. Die Einstellung <code>max_crawl_depth</code> verhindert, dass der Crawler mehr Seiten als die als <code>seed_urls</code> definierten Seiten entdeckt, indem er die darin enthaltenen Links nicht öffnet.</p><p>Elasticsearch <code>host</code> und <code>api_key</code> werden dynamisch befüllt, abhängig von der Umgebung, in der das Skript ausgeführt wird.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7d37b966aafbd3c1/6a17ef9842022946e929f6b9/f9831034e1c4ccb554d37bdd188f2824338355a0-890x624.png" alt="Die Produktseite für „Schokoladenbox“ von der Domain web-scraping.dev, einer Testseite für Web-Scraping. Auf der Seite werden der Produkttitel, das Bild, die Beschreibung sowie die HTML-Elemente für Preis- und Kaufbuttons angezeigt." /><h2>Docker-Compose-Datei (lokale Umgebung)</h2><p>Für die lokale Umgebung <code>docker-compose.yml,</code> werden wir den Crawler und einen einzelnen Elasticsearch-Cluster + Kibana bereitstellen, damit wir unsere Crawling-Ergebnisse <em><strong>vor</strong></em> der Bereitstellung in der Produktionsumgebung einfach visualisieren können.</p>services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:9.1.3
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
    ports:
      - "9200:9200"
    networks: [esnet]
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9200"]
      interval: 5s
      timeout: 5s
      retries: 10

  kibana:
    image: docker.elastic.co/kibana/kibana:9.1.3
    environment:
      - ELASTICSEARCH_HOSTS=http://es01:9200
    ports:
      - "5601:5601"
    networks: [esnet]
    depends_on: [es01]

  crawler:
    image: docker.elastic.co/integrations/crawler:0.4.2
    environment:
      - ES_HOST=http://es01:9200
      - CRAWLER_JRUBY_OPTS=--server
    container_name: crawler
    volumes:
      - ./config:/home/app/config
    networks: [esnet]
    entrypoint: ["/home/app/bin/crawler", "crawl", "/home/app/config/crawl-config-final.yml"]
    stdin_open: true
    tty: true

networks:
  esnet:
    driver: bridge<p>Beachten Sie, wie der Crawler wartet, bis Elasticsearch bereit ist, ausgeführt zu werden.</p><h2>GitHub Actions</h2><p>Nun müssen wir eine GitHub-Aktion erstellen, die die neuen Einstellungen kopiert und den Crawler bei jedem Push auf den Hauptzweig in unserer virtuellen Maschine ausführt. Dadurch wird sichergestellt, dass wir immer die aktuellste Konfiguration im Einsatz haben, ohne manuell in die virtuelle Maschine eingreifen zu müssen, um Dateien zu aktualisieren und den Crawler auszuführen. Wir werden AWS EC2 als Anbieter virtueller Maschinen verwenden.</p><p>Der erste Schritt besteht darin, den Host (<code>VM_HOST</code>), den Maschinenbenutzer (<code>VM_USER</code>), den SSH-RSA-Schlüssel (<code>VM_KEY</code>), den Elasticsearch-Host (<code>ES_HOST</code>) und den Elasticsearch-API-Schlüssel (<code>ES_API_KEY</code>) zu den GitHub Action Secrets hinzuzufügen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb5a0fcfff9b7f997/6a17ef9a6df731d7d40a0fdf/e1075bc54151b4b94eac2a6bd2682e9997e6c709-1106x707.png" alt="Eine Konfigurationsseite für „Aktionen, Geheimnisse und Variablen“, auf der Repository-Geheimnisse wie VM_HOST, VM_KEY und VM_USER über eine webbasierte Oberfläche angezeigt werden." /><p>Auf diese Weise kann die Aktion auf unseren Server zugreifen, um die neuen Dateien zu kopieren und den Crawl auszuführen.</p><p>Nun erstellen wir unsere <code>.github/workflows/deploy.yml</code> -Datei:</p>name: Deploy

on:
  push:
    branches: [main]

jobs:
  Deploy:
    name: Deploy to EC2
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v5

      - name: Deploy crawler
        env:
          HOSTNAME: ${{ secrets.VM_HOST }}
          USER_NAME: ${{ secrets.VM_USER }}
          PRIVATE_KEY: ${{ secrets.VM_KEY }}
          ES_HOST: ${{ secrets.ES_HOST }}
          ES_API_KEY: ${{ secrets.ES_API_KEY }}
        run: |
          # Save private key
          echo "$PRIVATE_KEY" &gt; private_key
          chmod 600 private_key

          # Generate final config locally
          envsubst &lt; config/crawler-config.yml &gt; config/crawl-config-final.yml

          # Copy the config folder to VM
          scp -o StrictHostKeyChecking=no -i private_key -r config ${USER_NAME}@${HOSTNAME}:~/config

          # SSH into VM and run crawler
          ssh -o StrictHostKeyChecking=no -i private_key ${USER_NAME}@${HOSTNAME} &lt;&lt; EOF
            docker run --rm \
              -v ~/config:/config \
              docker.elastic.co/integrations/crawler:latest jruby \
              bin/crawler crawl /config/crawl-config-final.yml
          EOF<p>Diese Aktion führt jedes Mal die folgenden Schritte aus, wenn wir Änderungen an der Crawler-Konfigurationsdatei vornehmen:</p><ol><li><p>Tragen Sie den Elasticsearch-Host und den API-Schlüssel in die YAML-Konfiguration ein.</p></li><li><p>Kopieren Sie den Konfigurationsordner auf unsere VM</p></li><li><p>Stellen Sie über SSH eine Verbindung zu unserer VM her.</p></li><li><p>Führen Sie den Crawl mit der Konfiguration aus, die wir gerade aus dem Repository kopiert haben.</p></li></ol><h2>Lokale Tests</h2><p>Um unseren Crawler lokal zu testen, haben wir ein Bash-Skript erstellt, das den Elasticsearch-Host mit dem lokalen Docker-Repository befüllt und einen Crawl startet. Sie können <code>./local.sh</code> eingeben, um es auszuführen.</p>#!/bin/bash

# Exit on any error
set -e

# Load environment variables
export ES_HOST="http://es01:9200"

# Generate final crawler config
envsubst &lt; ./config/crawler-config.yml &gt; ./config/crawl-config-final.yml

# Bring everything up
docker compose up --build<p>Schauen wir uns die Kibana DevTools an, um zu bestätigen, dass<code> web-crawler-index</code> korrekt befüllt wurde:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt989660368fe14db8/6a17ef9b9da390c79ce46562/18551635e8265866e389a9632c4e4540958e4468-990x723.png" alt="Kibana DevTools-Code zur Bestätigung, dass der Webcrawler-Index korrekt eingerichtet ist." /><h2>Bereitstellung in der Produktionsumgebung</h2><p>Jetzt sind wir bereit, die Änderungen auf den Hauptzweig zu übertragen. Dadurch wird der Crawler in Ihrer virtuellen Maschine bereitgestellt und beginnt, Protokolle an Ihre Serverless Elasticsearch-Instanz zu senden.</p>git add .
git commit -m "First commit"
git push<p>Dadurch wird die GitHub-Aktion ausgelöst, die das Bereitstellungsskript innerhalb der virtuellen Maschine ausführt und mit dem Crawling beginnt.</p><p>Sie können die Ausführung der Aktion überprüfen, indem Sie zum GitHub-Repository gehen und den Tab „Aktionen“ aufrufen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt986f1a4e4f3288d2/6a17ef9c7f6f1584fdc09c10/67ba3a7164d7a8049fe5661264820826cb18ed64-667x325.png" alt="Die Aktionen werden im EC2-Tab eines GitHub-Repositorys bereitgestellt." /><h2>Änderungen vornehmen und erneut bereitstellen</h2><p>Vielleicht ist Ihnen aufgefallen, dass die <code>price</code> jedes Produkts Teil des Body-Felds des Dokuments ist. Ideal wäre es, den Preis in einem separaten Feld zu speichern, damit wir Filter darauf anwenden können.</p><p>Fügen wir diese Änderung zur Datei <code>crawler.yml</code> hinzu, um <a href="https://github.com/elastic/crawler/blob/main/docs/features/EXTRACTION_RULES.md">Extraktionsregeln</a> zu verwenden, mit denen der Preis aus der CSS-Klasse <code>product-price</code> extrahiert werden kann:</p>output_sink: elasticsearch
output_index: web-crawl-index
max_crawl_depth: 1

elasticsearch:
  host: ${ES_HOST}
  api_key: ${ES_API_KEY}
     
  # Index ingest pipeline to process documents before indexing          
  pipeline_enabled: true
  pipeline: pricing-pipeline

domains:
  - url: https://web-scraping.dev
    seed_urls:
      - https://web-scraping.dev/product/1
      - https://web-scraping.dev/product/2
      - https://web-scraping.dev/product/3
    extraction_rulesets:
      - url_filters:
          - type: ends
            pattern: /product/*
        rules:
          - action: extract
            field_name: price
            selector: .product-price
            join_as: string
            source: html<p>Wir sehen auch, dass der Preis ein Dollarzeichen (<code>$</code>) enthält, das wir entfernen müssen, wenn wir Bereichsabfragen ausführen wollen. Dafür können wir eine Ingest-Pipeline verwenden. Beachten Sie, dass wir in unserer neuen Crawler-Konfigurationsdatei oben darauf verweisen:</p>PUT _ingest/pipeline/pricing-pipeline
{
  "processors": [
    {
      "script": {
        "source": """
                ctx['price'] = ctx['price'].replace("$","")
            """
      }
    }
  ]
}<p>Wir können diesen Befehl in unserem Elasticsearch-Produktionscluster ausführen. Da die Entwicklungsversion ephemer ist, können wir die Pipeline-Erstellung in die <code>docker-compose.yml</code> -Datei integrieren, indem wir den folgenden Dienst hinzufügen. Beachten Sie, dass wir dem Crawler-Dienst auch eine <code>depends_on</code> hinzugefügt haben, damit er erst startet, nachdem die Pipeline erfolgreich erstellt wurde.</p> crawler:
    image: docker.elastic.co/integrations/crawler:0.4.2
    environment:
      - ES_HOST=http://es01:9200
      - CRAWLER_JRUBY_OPTS=--server
    container_name: crawler
    volumes:
      - ./config:/home/app/config
    networks: [esnet]
    entrypoint: ["/home/app/bin/crawler", "crawl", "/home/app/config/crawl-config-final.yml"]
    depends_on:
      pipeline-init:
        condition: service_completed_successfully
    stdin_open: true
    tty: true  


  pipeline-init:
    image: curlimages/curl:latest
    depends_on:
      es01:
        condition: service_healthy
    networks: [esnet]
    entrypoint: &gt;
        sh -c "
        echo 'Creating ingest pipeline...';
        curl -s -X PUT http://es01:9200/_ingest/pipeline/pricing-pipeline \\
          -H 'Content-Type: application/json' \\
          -d '{\"processors\":[{\"script\":{\"source\":\"ctx.price = ctx.price.replace(\\\"$\\\", \\\"\\\")\"}}]}';
        echo 'Pipeline created!';
        "<p>Führen wir nun <code>`./local.sh`</code> aus, um die Änderung lokal zu sehen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0f390aedf67cb4fe/6a17ef9eaf47b62bd2cde05b/dc1801599344a9f69f072b07ff828c4ba3815d7b-738x473.png" alt="Führen Sie `./local.sh` aus, um die Preisänderung lokal zu sehen." /><p>Großartig! Jetzt lasst uns die Veränderung vorantreiben:</p>git add crawler-config.yml
git commit -m "added price CSS selector"
git push<p>Um sicherzustellen, dass alles funktioniert, können Sie Ihre Produktions-Kibana-Datei überprüfen. Dort sollten die Änderungen sichtbar sein und der Preis als neues Feld ohne Dollarzeichen angezeigt werden.</p><h2>Fazit</h2><p>Mit dem Elastic Open Web Crawler können Sie Ihren Crawler als Code verwalten. Das bedeutet, dass Sie die gesamte Pipeline – von der Entwicklung bis zur Bereitstellung – automatisieren und beispielsweise ephemere lokale Umgebungen und Tests anhand der gecrawlten Daten programmatisch hinzufügen können.</p><p>Sie sind eingeladen, das offizielle Repository zu klonen und mit der Indizierung Ihrer eigenen Daten mithilfe dieses Workflows zu beginnen. In <a href="https://www.elastic.co/search-labs/blog/semantic-search-open-crawler">diesem Artikel</a> erfahren Sie auch, wie Sie eine semantische Suche auf den vom Crawler erzeugten Indizes durchführen.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elastic-open-crawler-config-as-code</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elastic-open-crawler-config-as-code</guid>
    <category><![CDATA[Index-Daten]]></category>
    <category><![CDATA[Operativer Betrieb]]></category>
    <dc:creator><![CDATA[Gustavo Llermaly]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt00e7c95012dc38cc/6a17efa0fbc5f80dad491b93/0ac41f55c85ad3f647cb0e0d750ed80bacd397f3-1036x581.png" length="0" type="image/png"/>
    <pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>