<?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[Grundlagen - 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[Grundlagen - 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/basics</link>
    </image>
    <link>https://www.elastic.co/de/search-labs/blog/category/basics</link>
    <atom:link href="https://www.elastic.co/de/search-labs/rss/category/basics.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[de]]></language>
    <lastBuildDate>Tue, 29 Sep 2026 10:46:27 GMT</lastBuildDate>
  <item>
    <title><![CDATA[So stellen Sie Elasticsearch auf Azure AKS Automated bereit]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie Elasticsearch mit Kibana auf Azure mithilfe von AKS Automatic und ECK für eine teilweise verwaltete Elasticsearch-Setup-Konfiguration bereitstellen.]]></description>
    <content:encoded><![CDATA[<p>Dieser Artikel ist Teil einer Reihe, in der wir lernen werden, wie man Elasticsearch mithilfe verschiedener Infrastrukturen installiert.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt45071aec499098c0/6a17fe770b0beda3d1dd37f4/0a65ca8b62fd8a42d7751b8f4bf057e33d877304-940x458.png" alt="Elasticsearch-Bereitstellungsbemühungen" /><p>ECK erfordert deutlich mehr Aufwand als die Marketplace-basierten Elastic Cloud-Lösungen, ist aber stärker automatisiert als die manuelle Bereitstellung von VMs, da der Kubernetes-Operator die Systemorchestrierung und die Skalierung der Knoten übernimmt.</p><p>Dieses Mal werden wir mit dem Azure Kubernetes Service (AKS) arbeiten und dabei die automatische Methode verwenden. In den anderen Artikeln erfahren Sie, wie Sie <a href="https://www.elastic.co/search-labs/blog/azure-elasticsearch-vm-deployment">Azure VM</a> und <a href="https://www.elastic.co/search-labs/blog/deploy-elasticsearch-azure-marketplace">Azure Marketplace</a> nutzen.</p><h2>Was ist AKS Automatic?</h2><p><a href="https://learn.microsoft.com/en-us/azure/aks/intro-aks-automatic">Der Azure Kubernetes Service (AKS) verwaltet automatisch </a>die Clusterkonfiguration, weist Ressourcen dynamisch zu und integriert bewährte Sicherheitspraktiken bei gleichzeitiger Beibehaltung der Flexibilität von Kubernetes. Dadurch können Entwickler innerhalb von Minuten vom Container-Image zur bereitgestellten Anwendung gelangen.</p><p>AKS Automatic beseitigt den Großteil des Aufwands für die Clusterverwaltung und schafft ein gutes Gleichgewicht zwischen Einfachheit und Flexibilität. Die richtige Wahl hängt von Ihrem Anwendungsfall ab, aber die Entscheidung wird einfacher, wenn Sie Folgendes planen:</p><ul><li><p><strong>Bereitstellung einer Testumgebung: </strong>Die Bereitstellung ist schnell und unkompliziert und eignet sich daher ideal für schnelle Experimente oder kurzlebige Cluster.</p></li><li><p><strong>Arbeiten Sie ohne strenge VM-, Speicher- oder Netzwerkanforderungen: </strong>AKS Automatic bietet vordefinierte Standardeinstellungen. Wenn diese Ihren Bedürfnissen entsprechen, erspart Ihnen das zusätzliche Konfigurationsaufwand.</p></li><li><p><strong>So starten Sie zum ersten Mal mit Kubernetes: </strong>AKS Automatic übernimmt einen Großteil der Cluster-Einrichtung, senkt die Lernkurve und ermöglicht es Teams, sich auf ihre Anwendungen zu konzentrieren.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9e74556cda9b56bd/6a17fe791d1b830cdc93e681/2e4c09b8c5e0ce5e8ea9c369626a373b7030a5ba-854x489.png" alt=" So erstellen Sie einen automatischen Azure Kubernetes Service (AKS)-Cluster" /><p>Für Elasticsearch werden wir <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s">Elastic Cloud on Kubernetes </a>(ECK) verwenden, den offiziellen Elastic Kubernetes Operator, der die Orchestrierung von Kubernetes-Bereitstellungen des Elastic Stack vereinfacht.</p><h2>So richten Sie AKS Automatic ein</h2><p>1. Melden Sie sich beim <a href="https://azure.microsoft.com/">Microsoft Azure Portal</a> an.</p><p>2. Klicken Sie <strong>oben rechts. </strong>Klicken Sie auf die Schaltfläche<strong> „Cloud Shell“</strong> , um auf die Konsole zuzugreifen und den AKS-Cluster von dort aus bereitzustellen. Alternativ können Sie die <a href="https://learn.microsoft.com/en-us/azure/cloud-shell/overview">Azure Cloud Shell</a> verwenden.</p><p><em><strong>Denken Sie daran, die Projekt-ID während des Tutorials durch Ihre eigene zu ersetzen.</strong></em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt06acd165140f9ab5/6a17fe7ae9ea876604a9c849/0aa60605777c0a6e3aef8faa4e54388c2cb582c8-624x495.png" alt="" /><p><em>Das Öffnen des AKS sollte wie im obigen Screenshot aussehen.</em></p><p>3. Installieren Sie die Azure CLI-Erweiterung aks-preview. Diese Vorabversion ermöglicht es uns, bei der Clustererstellung <code>--sku automatic</code> auszuwählen, wodurch die AKS-Automatikfunktion aktiviert wird.</p>az extension add --name aks-preview<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt703add301bb94b89/6a17fe7c57726213da1bce20/2e05ab67fc554c5fb5208683c179fdeaeadd95db-624x56.png" alt="" /><p><em>Wenn Sie diese Meldung sehen, bedeutet dies, dass die AKS-Erweiterung ordnungsgemäß installiert wurde.</em></p><p>4. Registrieren Sie<a href="https://learn.microsoft.com/en-us/azure/azure-app-configuration/concept-feature-management"> Feature-Flags</a> mit dem Befehl <code>az feature register</code></p>az feature register --namespace Microsoft.ContainerService --name AutomaticSKUPreview<p><em>Sie sehen nun die Details zu dem soeben erstellten Funktionsabonnement:</em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt024ca2930c3a02e3/6a17fe7ee9ea87e003a9c84d/3aca710c1f312ba91de461638e518386919ec722-801x138.png" alt="" /><p>Überprüfen Sie den Registrierungsstatus, bis er sich von „ <em><strong>Registrierung läuft</strong></em>“ in „ <em><strong>Registriert</strong></em>“ ändert. Die Registrierung kann einige Minuten dauern.</p>az feature show --namespace Microsoft.ContainerService --name AutomaticSKUPreview<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0b8d717b484bd461/6a17fe7f445de951aa4d0382/186486b08ab8e1c372efaff50f10cbddeaf4e0cd-844x177.png" alt="" /><p>Führen Sie <code>az provider register</code> aus, um die Änderungen zu verbreiten.</p>az provider register --namespace Microsoft.ContainerService<p>5. Erstellen Sie eine Ressourcengruppe</p><p>Eine Ressourcengruppe ist eine logische Gruppe von Azure-Ressourcen, die verwaltet und bereitgestellt werden sollen.</p>az group create --name elastic-resource --location eastus<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbbf4b6e75c2dd560/6a17fe8163baff6114741e72/d1952269e97d94f914020754bd02702f9eafd037-770x212.png" alt="" /><p>6. Erstellen Sie einen Autopilot-Cluster. Wir werden es <em><strong>myAKSAutomaticCluster </strong></em>nennen und die soeben erstellte Ressourcengruppe verwenden. Stellen Sie sicher, dass auf einer der folgenden VM-Größen <em><strong>16 vCPUs</strong></em> verfügbar sind: <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/dpsv5-series">Standard_D4pds_v5</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/dldsv5-series">Standard_D4lds_v5</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/dadsv5-series">Standard_D4ads_v5</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/ddsv5-series">Standard_D4ds_v5</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/ddv5-series">Standard_D4d_v5</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/ddv4-series">Standard_D4d_v4</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/dsv3-series">Standard_DS3_v2</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/memory-optimized/dv2-dsv2-series-memory">Standard_DS12_v2,</a> damit AKS Ressourcen zuweisen kann.</p>az aks create \
    --resource-group elastic-resource \
    --name myAKSAutomaticCluster \
    --sku automatic \
    --generate-ssh-keys<p>* Falls<em><code>MissingSubscriptionRegistration</code></em>-Fehler <em>auftreten </em><em>, gehen Sie mit den fehlenden Abonnements zurück zu Schritt 4. Beispielsweise</em><em> erfordert </em><em><code>The subscription is not registered to use namespace '</code></em><em><strong><code>microsoft.insights</code></strong></em><em><code>'</code></em>die Ausführung von<em><code>az provider register --namespace Microsoft.Insights.</code></em></p><p>Folgen Sie dem interaktiven Login:</p><p><em>Es erscheint eine Meldung mit der Aufforderung, „az login“ auszuführen. Sie müssen diesen Befehl ausführen und dann warten.</em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc711a241388cf786/6a17fe83dbb4fff454fb5929/14c0238f755fe6347519e69d3cb28c0fa52ec044-775x203.png" alt="" /><p>7. Warten Sie, bis es fertig ist. Die Erstellung dauert etwa 10 Minuten.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc389eecd12e3b2c8/6a17fe8425daab0b2408a442/eb00c3ad18f884f47db6645b196808ebec07c1fc-797x177.png" alt="" /><p>8. Konfigurieren Sie den Zugriff auf die kubectl-Befehlszeile.</p>az aks get-credentials --resource-group elastic-resource --name myAKSAutomaticCluster<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfdb13d3950950b06/6a17fe85b1e11319e179f4bd/5136d72a5d455345b0b6205bb232c4bdf7762998-793x52.png" alt="" /><p><em>Beachten Sie, dass die von uns installierte Erweiterung AKS Automatic aktiviert.</em></p><p>9. Bestätigen Sie, dass die Knoten bereitgestellt wurden.</p>kubectl get nodes<p>Es wird eine Fehlermeldung angezeigt, die den Zugriff verweigert. Kopieren Sie die Benutzer-ID aus der Fehlermeldung.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4b2bb8558e1a39f4/6a17fe87a292991ce3d02ea8/d6c021fa54f4db00d2d795f5ba9b5a93376d03cd-818x47.png" alt="" /><p>10. Fügen Sie Ihren Benutzer zur AKS-Zugriffskontrolle hinzu.</p><p>AKS-ID abrufen. Kopiere die Ausgabe des Befehls.</p>az aks show --resource-group elastic-resource  --name myAKSAutomaticCluster --query id --output tsv<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0ebc4fa29348d561/6a17fe896df7317a3b0a1166/22a1cdc538bd379812a752c6a368a0651000abb8-810x36.png" alt="" /><p>Erstellen Sie eine Rollenzuweisung mithilfe der AKS-ID und der Principal-ID Ihres Benutzers.</p>az role assignment create --role "Azure Kubernetes Service RBAC Cluster Admin" --assignee &lt;PRINCIPAL_ID&gt; --scope &lt;AKS_ID&gt;<p>11. Versuchen Sie erneut zu überprüfen, ob die Knoten bereitgestellt wurden.</p>kubectl get nodes<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltda416366f0e53d49/6a17fe8ab1e113f87c79f4c1/c9b3a5c1cc540ef732c3e7f60b0a973bdbd0b6fd-617x99.png" alt="" /><p>12. Installieren Sie den Elastic Cloud on the Kubernetes (ECK)-Operator.</p># Install ECK Custom Resource Definitions
kubectl create -f https://download.elastic.co/downloads/eck/2.16.1/crds.yaml

# Install the ECK operator
kubectl apply -f https://download.elastic.co/downloads/eck/2.16.1/operator.yaml<p>13. Wir erstellen eine Elasticsearch-Instanz mit einem einzelnen Knoten und den Standardwerten.</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 9.0.0
  nodeSets:
  - name: default
    count: 1
    config:
      node.store.allow_mmap: false
EOF<p>Wir haben <code>nmap</code> deaktiviert, da die Standard-AKS-Maschine einen zu niedrigen Wert für <code>vm.max_map_count</code> hat. Für den Produktivbetrieb wird von einer Deaktivierung abgeraten, stattdessen sollte der Wert von <code>vm.max_map_count</code> erhöht werden. Mehr dazu können Sie <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/virtual-memory">hier</a> nachlesen.</p><p>14. Wir werden auch einen Kibana-Einzelknotencluster bereitstellen. Für Kibana werden wir einen Load Balancer hinzufügen, der uns eine externe IP-Adresse bereitstellt, über die wir Kibana von unserem Gerät aus erreichen können.</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 9.0.0
  http:
    service:
      spec:
        type: LoadBalancer
  count: 1
  elasticsearchRef:
    name: quickstart
EOF<p>Standardmäßig konfiguriert AKS Automatic den Load Balancer als öffentlich; Sie können dieses Verhalten ändern, indem Sie die Metadaten-Annotation festlegen:</p><p><code>service.beta.kubernetes.io/azure-load-balancer-internal: "true"</code></p><p>15. Überprüfen Sie, ob Ihre Pods ausgeführt werden.</p>kubectl get pods<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltea98380109a7a0b1/6a17fe8c4b055dda6c43241e/213a897176c0af6cea19c7c777cfaf8734e3ee6e-616x84.png" alt="" /><p>16. Sie können auch <code>kubectl get elasticsearch</code> und <code>kubectl get kibana</code> ausführen, um spezifischere Statistiken wie Elasticsearch-Version, Knoten und Zustand zu erhalten.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt89119d59582673d9/6a17fe8d4b055d4257432422/c84988e725ef892eddd8fb7e5a03d58c35a8f9d6-470x62.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte714550df3504cd4/6a17fe8f7b54f982a28b3b19/452dd03d314cd00c8a3c19e19862b968592a0435-415x62.png" alt="" /><p>17. Greifen Sie auf Ihre Dienste zu.</p>kubectl get svc<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc9c24dc9b78a354/6a17fe900b0beda9f8dd37f8/b2d3e8f368be22b89aa2ed4d4d514f97dd6cbabd-624x115.png" alt="" /><p>Hier wird Ihnen die <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/accessing-services">externe URL</a> für Kibana unter EXTERNAL-IP angezeigt. Es kann einige Minuten dauern, bis der Load Balancer bereitgestellt ist. <em><strong>Kopieren Sie den Wert von EXTERNAL-IP.</strong></em></p><p>18. Ermitteln Sie das Elasticsearch-Passwort für den Benutzer „elastic“:</p>kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltec8ef3a4df60e7a8/6a17fe9263baff3381741e76/bd74537f8c35c4e027c518913fdb0a0524621d56-624x31.png" alt="" /><p>19. <strong>Greifen Sie über Ihren Browser auf Kibana zu</strong> :</p><p>a. URL: https://:5601&lt;EXTERNAL_IP&gt;</p><p>b. Benutzername:elastic</p><p>c. Passwort:c44A295CaEt44D6xIzN6Zs5m (aus dem vorherigen Schritt)</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7e8fbd1593bae329/6a17fe937b54f91d7c8b3b1d/a601112527d80721b292328ed8da58386d2837eb-463x503.png" alt="" /><p>20. Wenn Sie Elastic Cloud über Ihren Browser aufrufen, wird Ihnen der Begrüßungsbildschirm angezeigt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9ad7cd3196eb7dbe/6a17fe95b1e11336a579f4c5/f91e71fa961d215a8d886601d1a9fc5c452ce329-1999x1256.png" alt="" /><p>Wenn Sie die Spezifikationen des Elasticsearch-Clusters ändern möchten, z. B. die Anzahl oder Größe der Knoten anpassen, können Sie das YML-Manifest mit den neuen Einstellungen erneut anwenden:</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 9.0.0
  nodeSets:
    - name: default
      count: 2
      config:
        node.store.allow_mmap: false
      podTemplate:
        spec:
          containers:
            - name: elasticsearch
              resources:
                requests:
                  memory: 1.5Gi
                  cpu: 2
                limits:
                  memory: 1.5Gi
                  cpu: 2
EOF<p>In diesem Beispiel fügen wir einen weiteren Knoten hinzu und modifizieren RAM und CPU. Wie Sie sehen können, zeigt <code>kubectl get elasticsearch</code> jetzt 2 Knoten an:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdfe6ff383e03814e/6a17fe974b055dd514432426/4b139a476b50933d45d99e09479112817964f76a-624x60.png" alt="" /><p>Das Gleiche gilt für Kibana:</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 9.0.0
  http:
    service:
      spec:
        type: LoadBalancer
  count: 1
  elasticsearchRef:
    name: quickstart
  podTemplate:
    spec:
      containers:
        - name: kibana
          env:
            - name: NODE_OPTIONS
              value: "--max-old-space-size=1024"
          resources:
            requests:
              memory: 0.5Gi
              cpu: 0.5
            limits:
              memory: 1Gi
              cpu: 1
EOF<p>Wir können die CPU/RAM-Auslastung des Containers sowie die Speichernutzung von <a href="https://nodejs.org/">Node.js </a>(<a href="https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-mib">max-old-space-size</a>) anpassen.</p><p>Beachten Sie, dass <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/volume-claim-templates">bestehende Volumenansprüche nicht reduziert werden können</a>. Nach der Installation des Updates kann der Betreiber die Änderungen mit minimalen Unterbrechungszeiten vornehmen.</p><p>Denken Sie daran, den Cluster nach Abschluss der Tests zu löschen, um unnötige Kosten zu vermeiden.</p>az aks delete --name myAKSAutomaticCluster --resource-group elastic-resource<h2>Fazit</h2><p>Die Verwendung von Azure AKS Automatic mit ECK bietet eine ausgewogene Lösung für die Bereitstellung von Elasticsearch und Kibana: Sie reduziert die operative Komplexität, gewährleistet automatisierte Skalierung und Aktualisierungen und nutzt die Flexibilität von Kubernetes. Dieser Ansatz ist ideal für Teams, die einen zuverlässigen, wiederholbaren und wartungsfreundlichen Bereitstellungsprozess wünschen, ohne jedes Infrastrukturdetail manuell verwalten zu müssen. Daher ist er eine praktische Wahl sowohl für Test- als auch für Produktionsumgebungen.</p><h2>Wie geht es weiter?</h2><p>Wenn Sie mehr über Kubernetes erfahren möchten, können Sie die offizielle Dokumentation hier einsehen:</p><ul><li><p><a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s">Elastic Cloud auf Kubernetes | Elastic Docs</a></p></li><li><p><a href="https://learn.microsoft.com/en-us/azure/aks/intro-aks-automatic">Einführung in Azure Kubernetes Service (AKS) Automatisch (Vorschau)</a></p></li><li><p><a href="https://azure.github.io/AKS/2024/05/22/aks-automatic">AKS Automatic – AKS Engineering Blog</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-azure-aks-automatic-deployment</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-azure-aks-automatic-deployment</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Eduard Martin]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt58d08dac9d3586db/6a17fe983e9e45002eba16e7/4d821659a606e04390b09215e9a0d32eb01f0d1b-854x489.png" length="0" type="image/png"/>
    <pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Konfiguration der rekursiven Segmentierung für strukturierte Dokumente in Elasticsearch]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie rekursives Chunking in Elasticsearch mit Chunk-Größe, Trenngruppen und benutzerdefinierten Trennlisten für eine optimale strukturierte Dokumentenindizierung konfigurieren.]]></description>
    <content:encoded><![CDATA[<p>Seit Version 8.16 können Benutzer die Chunking-Strategie konfigurieren, die beim Importieren langer Dokumente in semantische Textfelder verwendet wird. Ab Version 9.1 / 8.19 haben wir eine neue konfigurierbare rekursive Chunking-Strategie eingeführt, die eine Liste regulärer Ausdrücke verwendet, um das Dokument in Abschnitte zu unterteilen. Das Ziel des Chunking ist es, ein langes Dokument in Abschnitte zu unterteilen, die zusammengehörige Inhalte enthalten. Unsere bisherigen Strategien zerlegen Texte auf der Ebene einzelner Wörter/Sätze, aber Dokumente, die in strukturierten Formaten geschrieben sind (z. B. Markdown-Dateien enthalten oft zusammengehörige Inhalte innerhalb von Abschnitten, die durch Trennzeichen definiert sind (z. B. Überschriften). Für diese Art von Dokumenten führen wir die rekursive Chunking-Strategie ein, um das Format strukturierter Dokumente zu nutzen und bessere Chunks zu erstellen!</p><h2>Was ist rekursives Chunking?</h2><p>Bei der rekursiven Segmentierung wird eine Liste von vorgegebenen Abschnittstrennungsmustern durchlaufen, um ein Dokument schrittweise in kleinere Segmente zu unterteilen, bis eine gewünschte maximale Segmentgröße erreicht ist.</p><h3>Wie konfiguriere ich rekursives Chunking?</h3><p>Folgende Werte können vom Benutzer für die rekursive Segmentierung konfiguriert werden:</p><ul><li><p>(erforderlich) <code>max_chunk_size</code>: Die maximale Anzahl von Wörtern in einem Chunk.</p></li><li><p>Entweder eines von beiden:</p><ul><li><p><code>separators</code>Eine Liste von regulären Ausdrücken, die verwendet werden, um das Dokument in Abschnitte zu unterteilen.</p></li><li><p><code>separator_group</code>Eine Zeichenkette, die einer von Elastic definierten Standardliste von Trennzeichen zugeordnet wird, die für bestimmte Dokumenttypen verwendet werden. Aktuell sind <code>markdown</code> und <code>plaintext</code> verfügbar.</p></li></ul></li></ul><h3>Wie funktioniert rekursives Chunking?</h3><p>Der Prozess des rekursiven Chunkings bei gegebenem Eingabedokument, einem <code>max_chunk_size</code> (gemessen in Wörtern) und einer Liste von Trennzeichenketten verläuft wie folgt:</p><ol><li><p>Wenn das Eingabedokument bereits innerhalb der maximalen Chunk-Größe liegt, wird ein einzelner Chunk zurückgegeben, der die gesamte Eingabe umfasst.</p></li><li><p>Teile den Text anhand des Vorkommens des Trennzeichens in mögliche Abschnitte auf. Für jeden potenziellen Teil:</p><ol><li><p>Wenn der potenzielle Datenblock innerhalb der maximalen Datenblockgröße liegt, fügen Sie ihn der Liste der an den Benutzer zurückzugebenden Datenblöcke hinzu.</p></li><li><p>Andernfalls wiederholen Sie ab Schritt 2, wobei Sie nur den Text aus dem potenziellen Chunk verwenden und diesen anhand des nächsten Trennzeichens in der Liste aufteilen. Wenn keine weiteren Trennzeichen mehr übrig sind, sollte man auf satzbasierte Segmentierung zurückgreifen.</p></li></ol></li></ol><h2>Beispiele für die Konfiguration von rekursivem Chunking</h2><p>Abgesehen von der Chunk-Größe besteht die wichtigste Konfiguration für rekursives Chunking in der Auswahl der Trennzeichen, die zum Aufteilen der Dokumente verwendet werden sollen. Wenn Sie nicht sicher sind, wo Sie anfangen sollen, bietet Elasticsearch einige Standardtrennzeichengruppen an, die für gängige Anwendungsfälle verwendet werden können.</p><h3>Verwendung von Trenngruppen</h3><p>Um eine Trenngruppe zu verwenden, geben Sie einfach den Namen der Gruppe an, die Sie bei der Konfiguration der Chunking-Einstellungen verwenden möchten. Zum Beispiel:</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separator_group": "plaintext"
}<p>Dies führt zu einer rekursiven Chunking-Strategie, die die Trennzeichenliste <code>["(?&lt;!\\n)\\n\\n(?!\\n)", "(?&lt;!\\n)\\n(?!\\n)")]</code> verwendet. Dies funktioniert gut für allgemeine Klartextanwendungen, wobei der Text an zwei Zeilenumbruchzeichen, gefolgt von einem weiteren Zeilenumbruchzeichen, geteilt wird.</p><p>Wir bieten außerdem eine Trennzeichengruppe <code>markdown</code> an, die die Trennzeichenliste verwendet:</p>[
"\n# ",
       "\n## ",
       "\n### ",
       "\n#### ",
       "\n##### ",
       "\n###### ",
       "\n^(?!\\s*$).*\\n-{1,}\\n",
       "\n^(?!\\s*$).*\\n={1,}\\n"
]<p>Diese Trennzeichenliste eignet sich gut für allgemeine Markdown-Anwendungsfälle, da sie an jeder der 6 Überschriftenebenen und den Abschnittsumbruchzeichen aufteilt.</p><p>Beim Erstellen einer Ressource (Inferenzendpunkt/semantisches Textfeld) wird die Liste der Trennzeichen, die der Trennzeichengruppe zu diesem Zeitpunkt entsprechen, in Ihren Konfigurationen gespeichert. Wenn die Trenngruppe zu einem späteren Zeitpunkt aktualisiert wird, ändert sich dadurch das Verhalten Ihrer bereits erstellten Ressourcen nicht.</p><h3>Verwendung einer benutzerdefinierten Trennliste</h3><p>Falls eine der vordefinierten Trennzeichengruppen für Ihren Anwendungsfall nicht geeignet ist, können Sie eine benutzerdefinierte Liste von Trennzeichen definieren, die Ihren Anforderungen entspricht. Beachten Sie, dass reguläre Ausdrücke innerhalb der Trennzeichenliste angegeben werden können. Nachfolgend ein Beispiel für Chunking-Einstellungen mit benutzerdefinierten Trennzeichen:</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separators": ["\n\n", "\n", "&lt;my-custom-separator&gt;"]
}<p>Die oben beschriebene Chunking-Strategie teilt an zwei Zeilenumbruchzeichen, gefolgt von einem Zeilenumbruchzeichen und schließlich an der Zeichenkette <code>“&lt;my-custom-separator&gt;”</code> auf.</p><h2>Ein Beispiel für rekursives Chunking in der Praxis</h2><p>Schauen wir uns ein Beispiel für rekursives Chunking in der Praxis an. In diesem Beispiel verwenden wir die folgenden Chunking-Einstellungen mit einer benutzerdefinierten Liste von Trennzeichen, die ein Markdown-Dokument anhand der beiden obersten Header-Ebenen aufteilen:</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separators": ["\n# ", "\n## "]
}<p>Werfen wir einen Blick auf ein einfaches, unstrukturiertes Markdown-Dokument:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdb5f41d1bd43ba50/6a17e831e9ea87c1d8a9c5f3/3a5507f4a1288065097231548e5b18e240508785-1302x1446.png" alt="Ein nicht segmentiertes Markdown-Dokument" /><p>Nun verwenden wir die oben definierten Chunking-Einstellungen, um das Dokument in Chunking-Elemente zu unterteilen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfffda162c7b9c87a/6a17e83296142aefa8eb1b0b/a3313c4c40ff39b8dbcdd7c4878c723f088e6c1a-1600x1187.png" alt="Aufteilen eines Dokuments in Elasticsearch" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt96f65346a8e09e3a/6a17e834445de9157b4d015e/79a2921943191ea631df94c9d465818ec8d3e738-1600x1206.png" alt="Aufteilen am zweiten Trennzeichen – Aufteilen eines Dokuments in Elasticsearch" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt28381c8f85aedf07/6a17e836ec0f89801e5a6640/459e695cce7540267422396b9a62ff4ad35f61db-1600x1260.png" alt="Letzte Abschnitte in einem Dokument nach satzbasierter Segmentierung in Elasticsearch" /><p>Hinweis: Der Zeilenumbruch am Ende jedes Abschnitts (außer Abschnitt 3) ist nicht hervorgehoben, befindet sich aber innerhalb der eigentlichen Abschnittsgrenzen.</p><h3>Legen Sie noch heute mit rekursivem Chunking los!</h3><p>Weitere Informationen zur Nutzung dieser Funktion finden Sie in der Dokumentation zur Konfiguration der Chunking-Einstellungen.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/recursive-chunking-structured-documents-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/recursive-chunking-structured-documents-elasticsearch</guid>
    <category><![CDATA[Grundlagen]]></category>
    <category><![CDATA[Inside Elastic]]></category>
    <category><![CDATA[KI]]></category>
    <dc:creator><![CDATA[Daniel Rubinstein]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf442dc4941f37be7/6a17e838505ac3eaf8ad8b3d/591872e31880768ca927507654a621addc0d124d-1600x960.png" length="0" type="image/png"/>
    <pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Einführung der Elasticsearch-Abfrageregeln-Benutzeroberfläche in Kibana]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie mit der Elasticsearch Query Rules UI Dokumente mithilfe anpassbarer Regelsätze in Kibana zu Suchanfragen hinzufügen oder ausschließen können, ohne das organische Ranking zu beeinträchtigen.]]></description>
    <content:encoded><![CDATA[<p>Die Aufgabe einer Suchmaschine besteht darin, relevante Ergebnisse zu liefern. Es gibt jedoch geschäftliche Anforderungen, die darüber hinausgehen – wie die Hervorhebung von Sonderangeboten, die Priorisierung saisonaler Produkte oder die Präsentation gesponserter Artikel – und Entwickler können dies nicht immer in der Suchanfrage umsetzen.</p><p>Darüber hinaus sind diese Anwendungsfälle in der Regel zeitkritisch, und das Durchlaufen der typischen Entwicklungsphasen (Erstellen eines Codezweigs und anschließendes Warten auf eine neue Version) ist ein zeitaufwändiger Prozess.</p><p>Was wäre, wenn wir diesen gesamten Prozess mit einem einzigen API-Aufruf oder, noch besser, mit nur wenigen Klicks in Kibana erledigen könnten?</p><h2>Benutzeroberfläche für Abfrageregeln</h2><p>Elasticsearch 8.10 führte <a href="https://www.elastic.co/blog/introducing-query-rules-elasticsearch-8-10"><strong>Abfrageregeln</strong></a> und <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/rule-retriever"><strong>Regelabrufer</strong></a> ein. Hierbei handelt es sich um Tools, die entwickelt wurden, um <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-pinned-query"><em>festgelegte Ergebnisse</em></a> in die Suchanfragen einzufügen, ohne die Rangfolge der organischen Ergebnisse gemäß den Regeln zu beeinträchtigen. Sie fügen den Ergebnissen lediglich auf deklarative und einfache Weise Geschäftslogik hinzu.</p><p>Einige gängige Anwendungsfälle für Abfrageregeln sind:</p><ul><li><p><strong>Hervorhebung von beworbenen Angeboten oder Verkäufen</strong>: Anzeige von reduzierten oder gesponserten Artikeln ganz oben.</p></li><li><p><strong>Ausschluss nach Kontext oder Standort</strong>: Ausblenden bestimmter Elemente, wenn deren Anzeige aufgrund lokaler Vorschriften nicht zulässig ist.</p></li><li><p><strong>Priorisierung wichtiger Ergebnisse</strong>: Sicherstellen, dass beliebte oder feste Suchanfragen unabhängig vom organischen Ranking immer ganz oben stehen.</p></li></ul><p>Um auf die Benutzeroberfläche zuzugreifen und mit diesen Tools zu interagieren, müssen Sie im Kibana-Seitenmenü auf <strong>„Abfrageregeln“</strong> unter <strong>„Relevanz“ klicken:</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltac12541cddd58e36/6a170853a29299941cd00fc2/242e33e89d1a07ffa0e76009c46b3a9236722741-458x1010.png" alt="Zugriff auf Abfrageregeln in Elasticsearch unter Relevanz" /><p>Sobald das Menü mit den Abfrageregeln erscheint, klicken Sie auf <strong>„Erstes Regelset erstellen“:</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcc28329c0f3c3aa9/6a17085547d49c67e22d893b/30b3a91bbbf243d314cf38298e01ca5cff784430-1600x945.png" alt="Erstellen Ihres ersten Abfrageregelsatzes in Elasticsearch" /><p>Als Nächstes müssen Sie Ihrem Regelsatz einen Namen geben.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb37d271297a4f148/6a170856a29299782cd00fc6/26c5462f88678867776f933b5655ca0df0d72a16-708x446.png" alt="Benennung Ihres Abfrageregelsatzes in Elasticsearch" /><p>Das Formular zur Definition jeder Regel besteht aus drei Hauptkomponenten:</p><ul><li><p><strong>Kriterien</strong>: Die Bedingungen, die erfüllt sein müssen, damit die Regel Anwendung findet. Zum Beispiel: „wenn das Feld query_string den Wert <em>Christmas</em> enthält“ oder „wenn das Feld country <em>CO ist“.</em></p></li><li><p><strong>Aktion</strong>: Das soll passieren, wenn die Bedingungen erfüllt sind. Es kann angeheftet (ein Dokument wird an der Spitze der Suchergebnisse fixiert) oder ausgeschlossen (ein Dokument wird ausgeblendet) werden.</p></li><li><p><strong>Metadaten</strong>: Dies sind die Felder, die bei der Ausführung der Abfrage mitgeführt werden. Sie können sowohl Benutzerinformationen (wie Standort oder Sprache) als auch Suchdaten (Query-String) enthalten. Dies sind die Werte, anhand derer die Kriterien entscheiden, ob eine Regel angewendet werden soll oder nicht.</p></li></ul><h2>Beispiel: beliebte Artikel</h2><p>Stellen wir uns vor, wir hätten eine E-Commerce-Website mit verschiedenen Artikeln. Bei der Überprüfung der Kennzahlen stellen wir fest, dass einer der meistverkauften Artikel in der Kategorie Konsolen der „DualShock 4 Wireless Controller“ ist, insbesondere wenn Nutzer nach den Schlüsselwörtern „PS4“ oder „PlayStation 4“ suchen. Deshalb haben wir beschlossen, dieses Produkt ganz oben in den Suchergebnissen anzuzeigen, wenn ein Nutzer nach diesen Schlüsselwörtern sucht.</p><p>Als Erstes indizieren wir die Dokumente für jeden Artikel mithilfe einer Bulk-API-Anfrage:</p>POST _bulk
{ "index": { "_index": "products", "_id": "1" } }
{ "id": "1", "name": "PlayStation 4 Slim 1TB", "category": "console", "brand": "Sony", "price": 1200 }
{ "index": { "_index": "products", "_id": "2" } }
{ "id": "2", "name": "DualShock 4 Wireless Controller", "category": "accessory", "brand": "Sony", "price": 250 }
{ "index": { "_index": "products", "_id": "3" } }
{ "id": "3", "name": "PlayStation 4 Camera", "category": "accessory", "brand": "Sony", "price": 200 }
{ "index": { "_index": "products", "_id": "4" } }
{ "id": "4", "name": "PlayStation 4 VR Headset", "category": "accessory", "brand": "Sony", "price": 900 }
{ "index": { "_index": "products", "_id": "5" } }
{ "id": "5", "name": "Charging Station for DualShock 4", "category": "accessory", "brand": "Sony", "price": 80 }<p>Wenn wir nicht in die Abfrage eingreifen, erscheint der Eintrag normalerweise an vierter Stelle. Hier die Anfrage:</p>GET products/_search
{
 "query": {
   "match": {
     "name": "PlayStation 4"
   }
 }
}<p>Und hier sind die Ergebnisse.</p>{
 "took": 1,
 "timed_out": false,
 "_shards": {
   "total": 1,
   "successful": 1,
   "skipped": 0,
   "failed": 0
 },
 "hits": {
   "total": {
     "value": 5,
     "relation": "eq"
   },
   "max_score": 0.6973252,
   "hits": [
     {
       "_index": "products",
       "_id": "3",
       "_score": 0.6973252,
       "_source": {
         "id": "3",
         "name": "PlayStation 4 Camera",
         "category": "accessory",
         "brand": "Sony",
         "price": 200
       }
     },
     {
       "_index": "products",
       "_id": "1",
       "_score": 0.6260078,
       "_source": {
         "id": "1",
         "name": "PlayStation 4 Slim 1TB",
         "category": "console",
         "brand": "Sony",
         "price": 1200
       }
     },
     {
       "_index": "products",
       "_id": "4",
       "_score": 0.6260078,
       "_source": {
         "id": "4",
         "name": "PlayStation 4 VR Headset",
         "category": "accessory",
         "brand": "Sony",
         "price": 900
       }
     },
     {
       "_index": "products",
       "_id": "2",
       "_score": 0.08701137,
       "_source": {
         "id": "2",
         "name": "DualShock 4 Wireless Controller",
         "category": "accessory",
         "brand": "Sony",
         "price": 250
       }
     },
     {
       "_index": "products",
       "_id": "5",
       "_score": 0.07893815,
       "_source": {
         "id": "5",
         "name": "Charging Station for DualShock 4",
         "category": "accessory",
         "brand": "Sony",
         "price": 80
       }
     }
   ]
 }
}<p>Lasst uns eine Abfrageregel erstellen, um dies zu ändern. Als Erstes fügen wir es dem Regelwerk folgendermaßen hinzu:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1576d4f4a2e60548/6a170858cdacbfccb07d298d/fdc42646fb3e76a09bca7d19047a76efe343f7a2-1600x650.png" alt="Wie man einen Regelsatz für Abfrageregeln in Elasticsearch bearbeitet" /><p>Oder eine entsprechende <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-query-rules-put-ruleset">API-Anfrage</a>:</p>PUT _query_rules/my-rules
{
  "rules": [
    {
      "rule_id": "rule-1232",
      "type": "pinned",
      "criteria": [
        {
          "type": "exact",
          "metadata": "query_string",
          "values": [
            "PS4",
            "PlayStation 4"
          ]
        }
      ],
      "actions": {
        "docs": [
          {
            "_index": "products",
            "_id": "2"
          }
        ]
      }
    }
  ]
}<p>Um das <strong>Regelset </strong>in unserer Abfrage verwenden zu können, müssen wir einen Abfrageregeltyp verwenden. Diese Art von Anfrage besteht aus zwei Hauptteilen:</p>GET /products/_search
{
 "retriever": {
   "rule": {
     "retriever": {
       "standard": {
         "query": {
           "match": { "name": "PlayStation 4" }
         }
       }
     },
     "match_criteria": {
       "query_string": "PlayStation 4"
     },
     "ruleset_ids": ["my-rules"]
   }
 }
}<ul><li><p><strong>match_criteria</strong>: Dies sind die Metadaten, die zum Vergleich mit der Benutzeranfrage verwendet werden. In diesem Beispiel wird das Regelset aktiviert, wenn das Feld query_string den Wert „PlayStation 4“ hat.</p></li><li><p><strong>Suchanfrage</strong>: Die eigentliche Suchanfrage, die verwendet wird, um die organischen Suchergebnisse zu finden.</p></li></ul><p>Auf diese Weise führen Sie zuerst die organische Abfrage aus, und anschließend wendet Elasticsearch die Regeln aus Ihrem Regelsatz an:</p>{
 "took": 17,
 "timed_out": false,
 "_shards": {
   "total": 1,
   "successful": 1,
   "skipped": 0,
   "failed": 0
 },
 "hits": {
   "total": {
     "value": 5,
     "relation": "eq"
   },
   "max_score": 1.7014122e+38,
   "hits": [
     {
       "_index": "products",
       "_id": "2",
       "_score": 1.7014122e+38,
       "_source": {
         "id": "2",
         "name": "DualShock 4 Wireless Controller",
         "category": "accessory",
         "brand": "Sony",
         "price": 250
       }
     },
     {
       "_index": "products",
       "_id": "3",
       "_score": 0.6973252,
       "_source": {
         "id": "3",
         "name": "PlayStation 4 Camera",
         "category": "accessory",
         "brand": "Sony",
         "price": 200
       }
     },
     {
       "_index": "products",
       "_id": "1",
       "_score": 0.6260078,
       "_source": {
         "id": "1",
         "name": "PlayStation 4 Slim 1TB",
         "category": "console",
         "brand": "Sony",
         "price": 1200
       }
     },
     {
       "_index": "products",
       "_id": "4",
       "_score": 0.6260078,
       "_source": {
         "id": "4",
         "name": "PlayStation 4 VR Headset",
         "category": "accessory",
         "brand": "Sony",
         "price": 900
       }
     },
     {
       "_index": "products",
       "_id": "5",
       "_score": 0.07893815,
       "_source": {
         "id": "5",
         "name": "Charging Station for DualShock 4",
         "category": "accessory",
         "brand": "Sony",
         "price": 80
       }
     }
   ]
 }
}<h2>Beispiel: benutzerbasierte Metadaten</h2><p>Eine weitere interessante Anwendung von Abfrageregeln besteht darin, Metadaten zu verwenden, um bestimmte Dokumente basierend auf Kontextinformationen des Benutzers oder der Webseite anzuzeigen.</p><p>Nehmen wir beispielsweise an, wir möchten Artikel oder personalisierte Angebote basierend auf dem Loyalitätsgrad eines Nutzers hervorheben, der als numerischer Wert dargestellt wird.</p><p>Dies erreichen wir, indem wir diese Metadaten direkt in die Abfrage einbinden, sodass die Regeln aktiviert werden, wenn der genannte Wert bestimmte Kriterien erfüllt.</p><p>Zunächst indexieren wir ein Dokument, das nur Nutzer mit einer hohen Loyalitätsstufe sehen können:</p>POST _bulk
{ "index": { "_index": "products", "_id": "6" } }
{ "id": "6", "name": "PlayStation Plus Deluxe Card - 12 months", "category": "membership", "brand": "Sony", "price": 300 }<p>Jetzt erstellen wir eine neue Regel innerhalb desselben Regelsatzes, sodass der Artikel ganz oben in den Ergebnissen erscheint, wenn der Loyalitätswert (loyality_level) gleich oder höher als 80 ist.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt158578005df8c76d/6a17085aab7f086dc0db9de3/58de12dff93305440608f51465462fcc68653a08-1421x496.png" alt="Wie man einen Regelsatz für Abfrageregeln in Elasticsearch bearbeitet" /><p>Speichern Sie die Regel und das Regelwerk.</p><p>Hier ist die entsprechende REST-Anfrage:</p>PUT _query_rules/my-rules
{
  "rules": [
    {
      "rule_id": "pin-premiun-user",
      "type": "pinned",
      "criteria": [
        {
          "type": "gte",
          "metadata": "loyalty_level",
          "values": [
            80
          ]
        }
      ],
      "actions": {
        "docs": [
          {
            "_index": "products",
            "_id": "6"
          }
        ]
      }
    }
  ]
}<p>Beim Ausführen einer Abfrage muss nun der neue Parameter <strong>loyalty_level </strong>in die Metadaten aufgenommen werden. Wenn die Bedingung in der Regel erfüllt ist, erscheint das neue Dokument ganz oben in den Suchergebnissen.</p><p>Beispiel: Senden einer Anfrage, bei der der Loyalitätsgrad 80 beträgt:</p>POST /products/_search
{
  "retriever": {
    "rule": {
      "retriever": {
        "standard": {
          "query": {
            "match": {
              "name": "PlayStation"
            }
          }
        }
      },
      "match_criteria": {
        "query_string": "PlayStation",
        "loyalty_level": 80
      },
      "ruleset_ids": ["my-rules"]
    }
  }
}<p>Das Treuezertifikat wird oben auf den Ergebnissen angezeigt:</p>{
  "took": 31,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4,
      "relation": "eq"
    },
    "max_score": 1.7014122e+38,
    "hits": [
      {
        "_index": "products",
        "_id": "6",
        "_score": 1.7014122e+38,
        "_source": {
          "id": "6",
          "name": "PlayStation Plus Deluxe Card - 12 months",
          "category": "membership",
          "brand": "Sony",
          "price": 300
        }
      },
      {
        "_index": "products",
        "_id": "3",
        "_score": 0.5054567,
        "_source": {
          "id": "3",
          "name": "PlayStation 4 Camera",
          "category": "accessory",
          "brand": "Sony",
          "price": 200
        }
      },
      {
        "_index": "products",
        "_id": "1",
        "_score": 0.45618832,
        "_source": {
          "id": "1",
          "name": "PlayStation 4 Slim 1TB",
          "category": "console",
          "brand": "Sony",
          "price": 1200
        }
      },
      {
        "_index": "products",
        "_id": "4",
        "_score": 0.45618832,
        "_source": {
          "id": "4",
          "name": "PlayStation 4 VR Headset",
          "category": "accessory",
          "brand": "Sony",
          "price": 900
        }
      }
    ]
  }
}<p>Im folgenden Fall ist die Regel aufgrund des Loyalitätslevels von 70 nicht erfüllt, und der Artikel sollte nicht oben erscheinen:</p>POST /products/_search
{
  "retriever": {
    "rule": {
      "retriever": {
        "standard": {
          "query": {
            "match": {
              "name": "PlayStation"
            }
          }
        }
      },
      "match_criteria": {
        "query_string": "PlayStation",
        "loyalty_level": 70
      },
      "ruleset_ids": ["my-rules"]
    }
  }
}<p>Hier die Ergebnisse:</p>{
  "took": 7,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4,
      "relation": "eq"
    },
    "max_score": 0.5054567,
    "hits": [
      {
        "_index": "products",
        "_id": "3",
        "_score": 0.5054567,
        "_source": {
          "id": "3",
          "name": "PlayStation 4 Camera",
          "category": "accessory",
          "brand": "Sony",
          "price": 200
        }
      },
      {
        "_index": "products",
        "_id": "1",
        "_score": 0.45618832,
        "_source": {
          "id": "1",
          "name": "PlayStation 4 Slim 1TB",
          "category": "console",
          "brand": "Sony",
          "price": 1200
        }
      },
      {
        "_index": "products",
        "_id": "4",
        "_score": 0.45618832,
        "_source": {
          "id": "4",
          "name": "PlayStation 4 VR Headset",
          "category": "accessory",
          "brand": "Sony",
          "price": 900
        }
      },
      {
        "_index": "products",
        "_id": "6",
        "_score": 0.3817649,
        "_source": {
          "id": "6",
          "name": "PlayStation Plus Deluxe Card - 12 months",
          "category": "membership",
          "brand": "Sony",
          "price": 300
        }
      }
    ]
  }
}<h2>Beispiel: sofortiger Ausschluss</h2><p>Nehmen wir an, unser <strong>DualShock 4 Wireless-Controller (ID 2)</strong> ist vorübergehend nicht verfügbar und kann nicht verkauft werden. Anstatt das Dokument manuell zu löschen oder auf die Verarbeitung der Daten zu warten, beschließt das Business-Team, es in der Zwischenzeit aus den Suchergebnissen zu entfernen.</p><p>Wir werden ein ähnliches Verfahren anwenden wie das, das wir gerade bei den beliebten Artikeln angewendet haben, aber diesmal wählen wir anstelle von <em>"Angeheftet"</em> <em>die Option "Ausschließen"</em>. Diese Regel funktioniert wie eine Art Blacklist. Ändern Sie das Kriterium auf <strong>„Immer“</strong> , damit der Ausschluss bei jeder Ausführung der Abfrage funktioniert.</p><p>Die Regel sollte folgendermaßen aussehen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt38564c0b7f4a6ee2/6a17085c1949f78692e7a989/f10971e4f1bc9520105111adfa3a476581a27130-1600x623.png" alt="Beispiel für einen sofortigen Ausschlussregelsatz in Elasticsearch" /><p>Speichern Sie die Regel und das Regelset, um die Änderungen anzuwenden. Hier ist die entsprechende REST-Anfrage:</p>PUT _query_rules/my-rules
{
  "rules": [
    {
      "rule_id": "rule-6358",
      "type": "pinned",
      "criteria": [
        {
          "type": "always"
        }
      ],
      "actions": {
        "docs": [
          {
            "_index": "products",
            "_id": "2"
          }
        ]
      }
    }
  ]
}<p>Wenn wir die Abfrage nun erneut ausführen, werden Sie feststellen, dass das Element nicht mehr in den Ergebnissen enthalten ist, obwohl die vorherige Regel vorsah, es zu fixieren. Dies liegt daran, dass <strong>Ausschlüsse Vorrang vor dem Anheften von Ergebnissen haben</strong>.</p>{
 "took": 6,
 "timed_out": false,
 "_shards": {
   "total": 1,
   "successful": 1,
   "skipped": 0,
   "failed": 0
 },
 "hits": {
   "total": {
     "value": 4,
     "relation": "eq"
   },
   "max_score": 2.205655,
   "hits": [
     {
       "_index": "products",
       "_id": "3",
       "_score": 2.205655,
       "_source": {
         "id": "3",
         "name": "PlayStation 4 Camera",
         "category": "accessory",
         "brand": "Sony",
         "price": 200
       }
     },
     {
       "_index": "products",
       "_id": "1",
       "_score": 1.9738505,
       "_source": {
         "id": "1",
         "name": "PlayStation 4 Slim 1TB",
         "category": "console",
         "brand": "Sony",
         "price": 1200
       }
     },
     {
       "_index": "products",
       "_id": "4",
       "_score": 1.9738505,
       "_source": {
         "id": "4",
         "name": "PlayStation 4 VR Headset",
         "category": "accessory",
         "brand": "Sony",
         "price": 900
       }
     },
     {
       "_index": "products",
       "_id": "5",
       "_score": 0.69247496,
       "_source": {
         "id": "5",
         "name": "Charging Station for DualShock 4",
         "category": "accessory",
         "brand": "Sony",
         "price": 80
       }
     }
   ]
 }
}<h2>Fazit</h2><p><strong>Mit Abfrageregeln</strong> lässt sich die Relevanz ganz einfach und ohne Codeänderungen anpassen. Die neue <strong>Kibana</strong> <strong>-Benutzeroberfläche </strong>ermöglicht IhnenDiese Änderungen lassen sich in Sekundenschnelle vornehmen, wodurch Sie und Ihr Team mehr Kontrolle über Ihre Suchergebnisse erhalten.</p><p>Über den E-Commerce hinaus können Abfrageregeln in vielen anderen Szenarien eingesetzt werden: Hervorhebung von Anleitungen zur Fehlerbehebung in Supportportalen, Auffinden wichtiger interner Dokumente in Wissensdatenbanken, Förderung aktueller Meldungen auf Nachrichtenseiten oder Herausfiltern abgelaufener Stellen- oder Inhaltsangebote. Sie können sogar Compliance-Regeln durchsetzen, wie beispielsweise das Ausblenden von eingeschränktem Material nach Benutzerrolle oder Region.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-query-rules-ui-introduction</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-query-rules-ui-introduction</guid>
    <category><![CDATA[Grundlagen]]></category>
    <category><![CDATA[Entwicklererfahrung]]></category>
    <dc:creator><![CDATA[Jhon Guzmán]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt565ed0eb407e098d/6a17085d8b73cb363d189fb1/1fb10bd31c509cc9b9bb4f71f49970f140e6c36f-1600x945.png" length="0" type="image/png"/>
    <pubDate>Fri, 07 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[So stellen Sie Elasticsearch auf dem AWS Marketplace bereit]]></title>
    <description><![CDATA[In dieser Schritt-für-Schritt-Anleitung erfahren Sie, wie Sie Elasticsearch mithilfe des Elastic Cloud Service auf dem AWS Marketplace einrichten und ausführen.]]></description>
    <content:encoded><![CDATA[<p>In diesem Artikel erfahren Sie, wie Sie Elasticsearch mithilfe von Marketplace-Angeboten auf AWS bereitstellen.</p><p>Wir werden den Elastic Cloud Service auf AWS nutzen, den offiziellen verwalteten Elasticsearch-Service, der die Bereitstellung und Orchestrierung aller Elastic Stack-Komponenten über die native Infrastruktur von AWS vereinfacht.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6c1107b202d48147/6a16f67d92262a04071cc077/f15814051b53b50bec38f9a9f515a1e6dc08a56c-884x440.png" alt="" /><p>Wenn Sie erfahren möchten, wie Sie Elasticsearch auf AWS EC2 installieren und konfigurieren, schauen Sie sich <a href="https://www.elastic.co/search-labs/blog/elasticsearch-on-aws-ec2-deployment-guide">diesen Blog</a> an.
</p><h2>Was ist AWS Marketplace?</h2><p><a href="https://aws.amazon.com/marketplace"><strong>Elastic auf AWS Marketplace</strong></a> bietet ein vollständig verwaltetes Such- und Analyseerlebnis, bei dem AWS die Infrastrukturbereitstellung, Sicherheit und Skalierung übernimmt, während sich die Entwickler auf die Erstellung von Suchanwendungen konzentrieren. Dies ermöglicht es Teams, Elasticsearch-Cluster der Enterprise-Klasse innerhalb von Minuten mit integrierten AWS-Integrationen bereitzustellen.</p><h2>Wann sollte man Elastic auf dem AWS Marketplace verwenden?</h2><p>Elastic auf AWS Marketplace eignet sich am besten für Organisationen mit einer bestehenden AWS-Infrastruktur, die Elasticsearch mit Managed Services, integrierter Sicherheit und nahtloser AWS-Integration ohne operativen Mehraufwand bereitstellen möchten.</p><h2>So richten Sie Elastic Cloud auf dem AWS Marketplace ein</h2><h3>Schritt 1: Zugriff auf den AWS Marketplace</h3><p>1. Melden Sie sich bei <a href="https://console.aws.com/">AWS</a>an.</p><ul><li><p>Suchen Sie in der Suchleiste nach AWS Marketplace.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd7b4a64a97929ca0/6a16f67e60084b1ee43c4333/fc9928f79482c2c01e33978c88d390a2bfa2a3bf-1600x340.png" alt="" /><p>2. Klicken Sie im linken Navigationsbereich auf <strong>„Produkte entdecken“</strong> und suchen Sie dann nach Elasticsearch.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta3efc233beb103ab/6a16f680b0367d681572babd/ca4232271cb13ebfe33de406ecaec085033ec8a0-1454x760.png" alt="" /><p>3. Klicken Sie auf <strong>Elastic Cloud (Elasticsearch-Dienst).</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd7fe524f5d0cc84e/6a16f682cdacbfabdf7d27c4/e59aa276e55532f2ac3461d0ca983af4d41ad7a6-1600x611.png" alt="" /><h3>Schritt 2: Abonnieren Sie den Dienst</h3><p>1. Wählen Sie <strong>Ihre Kaufoptionen</strong> oder klicken Sie auf <strong>„Kostenlos testen“.</strong></p><p>2. Überprüfen Sie <strong>die Preisdetails</strong>, <strong>die Allgemeinen Geschäftsbedingungen</strong> und <strong>die Kaufdetails</strong> .</p><p>3. Klicken Sie auf die Schaltfläche <strong>„Abonnieren“</strong> .</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt027c8adb6bfa2b73/6a16f683a292995855d00de4/1c30d12b6b1061e76771d518011e522285f939f1-1600x290.png" alt="" /><p>4. Jetzt müssen wir das Elastic-Konto einrichten. Folgen Sie den Schritten von AWS.</p><p>a. Klicken Sie auf die Schaltfläche „Integration aktivieren“.</p><p>b. Klicken Sie auf die Schaltfläche „Anmelden oder ein Händlerkonto erstellen“.</p><p>c. Klicken Sie auf die Schaltfläche „Vorlage starten“.</p><p>d. Klicken Sie auf die Schaltfläche „Software starten“.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4d290ceb4c00c3ca/6a16f685839dfa35f6dcfc9b/879d9f0f01406e1955e1b38a2f6f2192ef040344-852x722.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt20832a47a3a5ce7b/6a16f68767045b0c8b45bf92/fc59be78cf776aa12867f40810598419576cbd39-1600x1143.png" alt="" /><h3>Schritt 3. Konfigurieren Sie Ihr neues Konto in Elastic.</h3><p>1. Erstellen Sie Ihr Elastic-Konto</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2a47e1e23a0be123/6a16f68875879e400ffe15c0/5efeaf0737062a55470b17b67651f220e12183f2-986x905.png" alt="" /><p>2. Bestätigen Sie Ihre E-Mail-Adresse</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltaad961a0644018b5/6a16f68a0811ae0734e9feb6/e0cfaac278614e317ce278935040bfa5a58edd13-853x894.png" alt="" /><p>3. Geben Sie Ihren Namen und Ihre Firmeninformationen ein.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt52f4a502993fa5d4/6a16f68b2b835fb4b9f4afc4/d5658fe66c3b1bcced73e822eae006846f0ddd9e-997x903.png" alt="" /><p>4. Füllen Sie eine kurze Elastic-Umfrage aus.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt375dca1904b2f0c1/6a16f68dcdacbf4f8d7d27c8/a3f53c00dadfd22f7d739a920c87d5f387182833-892x805.png" alt="" /><p>5. Wählen Sie die Region aus, in der Sie Elastic Cloud hosten möchten. Standardmäßig wird Ihre tatsächliche AWS-Region ausgewählt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0c23f8b8b63af517/6a16f68fb0367d6a6072bac1/c1dcdf3bf91c305821daaa25a60aa03be6454c1c-1207x1032.png" alt="" /><p>6. Warten Sie, bis Elastic bereitgestellt ist.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd88a26701fb26db5/6a16f69075879ef0d8fe15cc/50903e57ebea7cc47bdfabf4750b4ba2a7a91148-1370x1266.png" alt="" /><p>7. Ihre Bereitstellung ist mit Ihrem AWS Marketplace-Abonnement verbunden.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt822e8acb553ffac4/6a16f69275879ed57ffe15d0/3bb731e2d5de5053ccecb77e45dbdbcdaf294dba-1600x1288.png" alt="" /><h2>Kündigen Sie Ihr Abonnement</h2><p>Um Ihr Abonnement zu kündigen</p><p>1. Öffnen Sie die <a href="https://console.aws.com/">AWS-Konsole.</a></p><p>Suchen Sie in der Suchleiste nach AWS Marketplace. Klicken Sie auf <strong>AWS Marketplace.</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7a19e162d4cb818a/6a16f694839dfa21a6dcfc9f/aeed3d1e67b4cef91934de257a6fd6daa9737a12-1600x554.png" alt="" /><p>2. Klicken Sie auf das <strong>Elastic Cloud-Abonnement.</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta189d9ff9b518243/6a16f695a292991b60d00de8/04e6cc41850226df223dbe2d1b0e4b45265f6c39-1600x564.png" alt="" /><p>3. Klicken Sie auf die Schaltfläche <strong>„Aktionen“</strong> und anschließend auf <strong>„Abonnement kündigen“.</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt40fc41f3911b8b66/6a16f6971949f70896e7a7a9/e33d334ea6541c637a223de3ebd6209def75a6d3-1600x1039.png" alt="" /><p>4. Bestätigen Sie die Kündigung, indem Sie dann auf <strong>„Ja“</strong>und anschließend auf die Schaltfläche<strong> „Abonnement</strong> kündigen“ klicken.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3eb1839197854313/6a16f699ab7f08469fdb9c31/b73b3187168adc7aefdd46f95be33c1bce3da1e4-1103x698.png" alt="" /><p>5. Eine Bestätigungsmeldung erscheint oben auf der Seite.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt513bdb916a3bff8e/6a16f69a1949f74c5de7a7ad/c5ba66a23d535e866a8b458e5aca82c5f0b93037-1600x639.png" alt="" /><h2>Wie geht es weiter?</h2><p>Starten Sie Ihre Elastic Cloud-Reise mit einer 7-tägigen kostenlosen Testversion, die eine einzelne Bereitstellung und drei Projekte umfasst<a href="https://aws.amazon.com/marketplace/pp/prodview-voru33wi6xs7k">. Elastic Cloud (Elasticsearch Service)</a>. Melden Sie sich einfach in Ihrem AWS-Konto an und klicken Sie auf „Kaufoptionen anzeigen“, um die Elastic Search AI Platform sofort auf Elastic<a href="https://aws.amazon.com/marketplace/pp/prodview-voru33wi6xs7k"> Cloud (Elasticsearch Service)</a> zu nutzen. Die Testversion bietet vollen Zugriff auf Such-, Sicherheits- und Überwachungslösungen ohne zusätzlichen Aufwand für die Infrastrukturverwaltung.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/aws-elasticsearch-service-set-up</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/aws-elasticsearch-service-set-up</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Eduard Martin]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcbf8a044704b64d5/6a16f69ccf4f25d524b2cf3f/a80776d2ef85db26f850d932339fac2d26b90278-1086x620.png" length="0" type="image/png"/>
    <pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Elasticsearch-Shards und -Replikate: Ein praktischer Leitfaden]]></title>
    <description><![CDATA[Machen Sie sich mit den Konzepten von Elasticsearch-Shards und -Replikaten vertraut und lernen Sie, wie Sie diese optimieren können.]]></description>
    <content:encoded><![CDATA[<p>Elasticsearch erweitert die Leistungsfähigkeit von Lucene, indem es ein verteiltes System darauf aufbaut, wodurch die Probleme der Skalierbarkeit und Fehlertoleranz gelöst werden. Es stellt außerdem eine JSON-basierte REST-API bereit, wodurch die Interoperabilität mit anderen Systemen sehr einfach ist.</p><p>Verteilte Systeme wie Elasticsearch können sehr komplex sein, und es gibt viele Faktoren, die ihre Leistungsfähigkeit und Stabilität beeinflussen können. <strong>Shards</strong> gehören zu den grundlegendsten Konzepten in Elasticsearch, und das Verständnis ihrer Funktionsweise ermöglicht Ihnen die effektive Verwaltung eines Elasticsearch-Clusters.</p><p>Dieser Artikel erklärt, was primäre und Replikat-Shards sind, welche Auswirkungen sie auf einen Elasticsearch-Cluster haben und welche Tools es gibt, um sie an unterschiedliche Anforderungen anzupassen.</p><h2>Scherben verstehen</h2><p>Die Datenmenge in einem Elasticsearch-Index kann enorm anwachsen. Um die Verwaltung überschaubar zu halten, wird jedes Datenelement in einem Index gespeichert, und Indizes sind ein Index, der in eine Anzahl von <strong>Shards</strong> aufgeteilt ist. Jeder Elasticsearch-Shard ist ein Apache Lucene-Index, wobei jeder einzelne Lucene-Index eine Teilmenge der Dokumente im Elasticsearch-Index enthält. Durch die Aufteilung der Indizes auf diese Weise bleibt die Ressourcennutzung unter Kontrolle. Ein Apache Lucene-Index hat eine Begrenzung von 2.147.483.519 (2³¹ - 129) Dokumenten.</p><p>Manchmal müssen Indizes zum Zweck der Neuausrichtung zwischen Knoten verschoben werden. Da dieser Prozess sowohl zeit- als auch ressourcenintensiv sein kann, sollten die Indizes nicht zu groß werden, was dazu beiträgt, die Wiederherstellungszeit überschaubar zu halten. Da Indizes aus Lucene-Segmenten bestehen, die ständig zusammengeführt werden müssen, ist es außerdem wichtig, dass die Segmente nicht zu groß werden. Aus diesen Gründen teilt Elasticsearch die Indexdaten in kleinere, besser handhabbare Teile auf, sogenannte <strong>primäre Shards</strong>, die sich leichter auf mehrere Maschinen verteilen lassen. <strong>Replikat-</strong> Shards sind einfach eine exakte Kopie eines entsprechenden primären Shards. Ihre Funktion werden wir später in diesem Artikel erläutern.</p><p>Die richtige Anzahl an Shards ist wichtig für die Performance. Daher ist es ratsam, im Voraus zu planen. Wenn Abfragen parallel über verschiedene Shards ausgeführt werden, sind sie schneller als ein Index, der aus einem einzigen Shard besteht, allerdings nur dann, wenn sich jeder Shard auf einem anderen Knoten befindet und genügend Knoten im Cluster vorhanden sind. Gleichzeitig verbrauchen Shards jedoch Arbeitsspeicher und Festplattenspeicher, sowohl im Hinblick auf indizierte Daten als auch auf Cluster-Metadaten. Zu viele Shards (auch als Oversharding bezeichnet) können Abfragen, Indexierungsanforderungen und Verwaltungsvorgänge verlangsamen, daher ist die Aufrechterhaltung des richtigen Gleichgewichts von entscheidender Bedeutung.</p><p>Die Anzahl der primären Shards wird zum Zeitpunkt der Indexerstellung <strong>für die jeweilige Indexinstanz</strong> festgelegt. Falls Sie später eine andere Anzahl primärer Shards benötigen, können Sie die<strong> Resize-APIs</strong>verwenden –<a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-indices-split">split</a> (mehr primäre Shards), <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-indices-shrink">shrink</a> (weniger primäre Shards) oder <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-indices-clone">clone</a> (die gleiche Anzahl primärer Shards mit neuen Einstellungen für Replikate). Diese Operationen kopieren Lucene-Segmente und <strong>vermeiden eine vollständige Neuindizierung aller Dokumente</strong>. Beim Erstellen eines Index können Sie die Anzahl der primären und Replikat-Shards als Indexeinstellungen festlegen:</p>PUT /sensor
{
   "settings" : {
       "index" : {
           "number_of_shards" : 6,
           "number_of_replicas" : 2
       }
   }
}<p>(Wenn Sie die Anzahl der Shards oder Replikate nicht angeben, ist der Standardwert für beides 1 (Stand: Elasticsearch 7.0). Die ideale Anzahl an Shards sollte anhand der Datenmenge im Index bestimmt werden. Im Allgemeinen <a href="https://www.elastic.co/docs/deploy-manage/production-guidance/optimize-performance/size-shards">sollte ein optimaler Shard 10-50 GB an Daten enthalten</a>, mit weniger als 200 Millionen Dokumenten pro Shard. Wenn Sie beispielsweise erwarten, dass sich täglich etwa 300 GB an Anwendungsprotokollen ansammeln, wären etwa 10 Shards in diesem Index angemessen, vorausgesetzt, Sie verfügen über eine ausreichende Anzahl von Knoten, um diese zu hosten.</p><p>Während ihrer Lebensdauer können Scherben verschiedene Zustände durchlaufen, darunter:</p><ul><li><p><strong>Initialisierung:</strong> Ein Anfangszustand, bevor der Shard verwendet werden kann.</p></li><li><p><strong>Gestartet:</strong> Ein Zustand, in dem der Shard aktiv ist und Anfragen empfangen kann.</p></li><li><p><strong>Verschieben:</strong> Ein Zustand, der eintritt, wenn Shards gerade auf einen anderen Knoten verschoben werden. Dies kann unter bestimmten Bedingungen erforderlich sein, beispielsweise wenn auf dem Knoten, auf dem sie sich befinden, der Speicherplatz knapp wird.</p></li><li><p><strong>Nicht zugewiesen:</strong> Der Status eines Shards, der nicht zugewiesen werden konnte. Wenn dies geschieht, wird ein Grund angegeben, beispielsweise wenn sich der Knoten, auf dem der Shard gehostet wird, nicht mehr im Cluster befindet <em>(NODE_LEFT)</em> oder wenn die Wiederherstellung in einen geschlossenen Index erfolgt <em>(EXISTING_INDEX_RESTORED).</em></p></li></ul><p>Um alle Shards, deren Zustände und weitere Metadaten anzuzeigen, können Sie die folgende Anfrage verwenden:</p>GET _cat/shards<p>Um Shards für einen bestimmten Index anzuzeigen, können Sie den Namen des Index an die URL anhängen, zum Beispiel sensor:</p>GET _cat/shards/sensor<p>Dieser Befehl erzeugt eine Ausgabe, wie im folgenden Beispiel. Standardmäßig enthalten die angezeigten Spalten den Namen des Index, den Namen (d. h. Nummer) des Shards, ob es sich um einen primären Shard oder eine Replik handelt, sein Status, die Anzahl der Dokumente, die Größe auf der Festplatte sowie die IP-Adresse und die Knoten-ID des Knotens, auf dem sich der Shard befindet.</p>sensor 5 p STARTED    0  283b 127.0.0.1 ziap
sensor 5 r UNASSIGNED                  
sensor 2 p STARTED    1 3.7kb 127.0.0.1 ziap
sensor 2 r UNASSIGNED                  
sensor 3 p STARTED    3 7.2kb 127.0.0.1 ziap
sensor 3 r UNASSIGNED                  
sensor 1 p STARTED    1 3.7kb 127.0.0.1 ziap
sensor 1 r UNASSIGNED                  
sensor 4 p STARTED    2 3.8kb 127.0.0.1 ziap
sensor 4 r UNASSIGNED                  
sensor 0 p STARTED    0  283b 127.0.0.1 ziap
sensor 0 r UNASSIGNED<h2>Repliken verstehen</h2><p>Während jeder Shard nur eine einzige Kopie der Daten enthält, kann ein Index mehrere Kopien des Shards enthalten. Es gibt also zwei Arten von Shards, den <strong>primären Shard</strong> und eine Kopie oder <strong>Replik</strong>. Jede Replik eines primären Shards befindet sich immer auf einem anderen Knoten, was eine hohe Verfügbarkeit Ihrer Daten im Falle eines Knotenausfalls gewährleistet. Neben der Redundanz und ihrer Rolle bei der Vermeidung von Datenverlust und Ausfallzeiten können Replikate auch zur Steigerung der Suchleistung beitragen, indem sie die parallele Verarbeitung von Abfragen mit dem primären Shard und damit eine schnellere Verarbeitung ermöglichen.</p><p>Es gibt einige wichtige Unterschiede im Verhalten von primären und Replikat-Shards. Beide können zwar Anfragen verarbeiten, Indexierungsanfragen (d. h. Daten, die dem Index hinzugefügt werden, müssen zuerst die primären Shards durchlaufen, bevor sie auf die Replikat-Shards repliziert werden können. Wie bereits erwähnt, wird, wenn ein primärer Shard nicht mehr verfügbar ist – beispielsweise aufgrund einer Knotenunterbrechung oder eines Hardwareausfalls –, eine Replik zum Nachfolger befördert, um dessen Rolle zu übernehmen.</p><p>Replikate können zwar im Falle eines Knotenausfalls hilfreich sein, es ist jedoch wichtig, nicht zu viele davon zu haben, da sie beim Indizieren Speicherplatz, Festplattenspeicher und Rechenleistung verbrauchen. Ein weiterer Unterschied zwischen den primären Shards und Replikaten besteht darin, dass die Anzahl der primären Shards nach der Erstellung des Index nicht mehr geändert werden kann, die Anzahl der Replikate jedoch jederzeit dynamisch durch Aktualisieren der Indexeinstellungen angepasst werden kann.</p><p>Ein weiterer Faktor, der bei Replikaten zu berücksichtigen ist, ist die Anzahl der verfügbaren Knoten. Replikate werden immer auf anderen Knoten als dem primären Shard platziert, da zwei Kopien derselben Daten auf demselben Knoten keinen Schutz bieten würden, wenn der Knoten ausfallen sollte. Damit ein System <em>n</em> Replikate unterstützen kann, müssen daher mindestens <em>n + 1</em> Knoten im Cluster vorhanden sein. Wenn beispielsweise ein Cluster aus zwei Knoten besteht und ein Index mit sechs Replikaten konfiguriert ist, wird nur ein Replikat zugewiesen. Ein System mit sieben Knoten hingegen ist durchaus in der Lage, einen primären Shard und sechs Replikate zu verwalten.</p><h2>Optimierung von Shards und Replikaten</h2><p>Auch nachdem ein Index mit dem richtigen Verhältnis von primären und Replikat-Shards erstellt wurde, müssen diese überwacht werden, da sich die Dynamik eines Index im Laufe der Zeit ändert. Beispielsweise sind bei der Analyse von Zeitreihendaten Indizes mit aktuellen Daten im Allgemeinen aktiver als ältere. Ohne eine Anpassung dieser Indizes würden sie alle die gleiche Menge an Ressourcen verbrauchen, trotz ihrer sehr unterschiedlichen Anforderungen.</p><p>Mithilfe der Rollover-Index-API lassen sich neuere und ältere Indizes trennen. Es kann so eingestellt werden, dass automatisch ein neuer Index erstellt wird, sobald ein bestimmter Schwellenwert erreicht ist – die Größe des Index auf der Festplatte, die Anzahl der Dokumente oder sein Alter. Diese API ist auch nützlich, um die Shard-Größen unter Kontrolle zu halten. Da die Anzahl der Shards nach der Indexerstellung nicht ohne Weiteres geändert werden kann, sammeln sich weiterhin Daten in den Shards an, wenn keine Rollover-Bedingungen erfüllt sind. Bei älteren Indizes, auf die nur selten zugegriffen werden muss, sind das Verkleinern und das erzwungene Zusammenführen eines Index zwei verschiedene Möglichkeiten, den Speicher- und Festplattenbedarf zu reduzieren. Ersteres reduziert die Anzahl der Shards in einem Index, während letzteres die Anzahl der Lucene-Segmente reduziert und Speicherplatz freigibt, der von gelöschten Dokumenten belegt wurde.</p><h2>Primäre und Replikat-Shards als Grundlage von Elasticsearch</h2><p>Elasticsearch hat sich einen hervorragenden Ruf als verteilte Speicher-, Such- und Analyseplattform für riesige Datenmengen erworben. Bei einem Betrieb in einem solchen Umfang werden jedoch unweigerlich Herausforderungen auftreten. Deshalb ist es für Elasticsearch so wichtig und grundlegend zu verstehen, wie primäre und Replikat-Shards funktionieren, da dies zur Optimierung der Zuverlässigkeit und Leistung der Plattform beitragen kann.</p><p>Zu wissen, wie sie funktionieren und wie man sie optimiert, ist entscheidend für die Erreichung eines robusteren und leistungsfähigeren Elasticsearch-Clusters. Wenn Sie regelmäßig mit langsamen Antwortzeiten auf Anfragen oder Ausfällen konfrontiert sind, könnte dieses Wissen der Schlüssel zur Überwindung dieser Hindernisse sein.</p><p>In der offiziellen Dokumentation von Elasticsearch erfahren Sie mehr über <a href="https://www.elastic.co/docs/deploy-manage/distributed-architecture/clusters-nodes-shards">Cluster, Knoten und Shards</a>, <a href="https://www.elastic.co/docs/deploy-manage/production-guidance/optimize-performance/size-shards">die Dimensionierung Ihrer Shards</a>, <a href="https://www.elastic.co/docs/deploy-manage/distributed-architecture/shard-allocation-relocation-recovery">die Shard-Zuweisung und die Wiederherstellung</a>.</p><p>Dieses Thema ist auch als Einführungskurs auf dem <a href="https://youtu.be/sAySPSyL2qE">YouTube-Kanal der Elastic Community verfügbar.</a></p><p>Zu guter Letzt: Wenn Sie sich keine Gedanken über Nodes, Shards oder Replikate machen möchten, können Sie <a href="https://www.elastic.co/docs/deploy-manage/deploy/elastic-cloud/serverless">Elastic Cloud Serverless</a> ausprobieren. Dieses Elastic Cloud-Angebot wird vollständig von Elastic verwaltet und ist so automatisiert, dass es mit Ihrer Arbeitslast skaliert. Eine kostenlose Testversion kann Ihnen helfen, sich mit weiteren Vorteilen des serverlosen Ansatzes vertraut zu machen.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-shards-and-replicas-guide</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-shards-and-replicas-guide</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Piotr Przybyl]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt71dd92d939d383a2/6a17e9d53e03d769c44f2cc7/7775c44f01f2516c4ff4cce6d6bbe9e7b2c38908-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Thu, 14 Aug 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Einzigartige Muster aufdecken: Ein Leitfaden zur Aggregation aussagekräftiger Begriffe in Elasticsearch]]></title>
    <description><![CDATA[Lernen Sie, wie Sie mithilfe der wichtigen Begriffe der Aggregation Erkenntnisse aus Ihren Daten gewinnen können.]]></description>
    <content:encoded><![CDATA[<p>In Elasticsearch geht die <a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-significantterms-aggregation">signifikante Termaggregation</a> über die <a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-terms-aggregation">häufigsten Begriffe</a> hinaus, um statistisch ungewöhnliche Werte in einem Datensatz zu finden. Dies ermöglicht es uns, wertvolle Erkenntnisse und nicht offensichtliche Muster zu entdecken. Eine signifikante Termaggregation liefert eine Antwort mit zwei nützlichen Parametern:</p><ul><li><p><strong>bg_count (Hintergrundzählung): </strong>Anzahl der im übergeordneten Datensatz gefundenen Dokumente</p></li><li><p><strong>doc_count:</strong> Anzahl der im Ergebnisdatensatz gefundenen Dokumente</p></li></ul><p>In einem Datensatz zu Handyverkäufen können wir beispielsweise nach relevanten Begriffen im Zusammenhang mit den iPhone 16-Verkäufen suchen, etwa so:</p>GET phone_sales_analysis/_search
{
 "size": 0,
 "query": {
   "term": {
     "phone_model": {
       "value": "iPhone 16"
     }
   }
 },
 "aggs": {
   "significant_cities": {
     "significant_terms": {
       "field": "city_region",
       "size": 1
     }
   }
 }
}<p>Die Antwort lautet dann:</p>{
 "aggregations": {
   "significant_cities": {
     "doc_count": 122,
     "bg_count": 424,
     "buckets": [
       {
         "key": "Houston",
         "doc_count": 12,
         "score": 0.1946481360617346,
         "bg_count": 14
       }

     ]
   }
 }
}<p>Houston gehört weder zu den Top 10 Städten im gesamten Datensatz noch ist Houston die Top-Stadt für das iPhone 16. Die Auswertung der signifikanten Terme ergab jedoch, dass das<em><strong> iPhone 16 in dieser Stadt im Vergleich zu den übrigen Daten überproportional häufig gekauft wird</strong></em> . Lassen Sie uns die Zahlen genauer betrachten:</p><ul><li><p><strong>Auf höchster Ebene:</strong></p><ul><li><p><strong>Dokumentenanzahl: 122 – </strong>Die Abfrage ergab insgesamt 122 Treffer.</p></li><li><p><strong>bg_count: 424 — </strong>Der Hintergrundsatz (alle Verkaufsbelege) enthält 424 Belege</p></li></ul></li><li><p><strong>Im Houston-Eimer:</strong></p><ul><li><p><strong>Dokumentanzahl: 12 — </strong>Houston erscheint in 12 der 122 Suchergebnisse</p></li><li><p><strong>bg_count: 14 — </strong>Houston erscheint in 14 der insgesamt 424 Dokumente im Hintergrunddatensatz</p></li></ul></li></ul><p>Dies bedeutet, dass von insgesamt 424 Käufen nur 14 in Houston stattfanden; das sind 3,3 % aller Käufe. Betrachtet man jedoch nur die Verkaufszahlen des iPhone 16, so stellt man fest, dass 12 von 122 Verkäufen in Houston stattfanden, was 9,8 % entspricht – das Dreifache des Wertes im gesamten Datensatz; das ist bemerkenswert!</p><p>So sieht das in einer Visualisierung aus: Gesamtumsatz pro Stadtregion.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blted1af6606708267e/6a17f5d614800960e1b488d5/f31335b0b7793650025f941820f238dd35bfb09f-1486x1066.png" alt="" /><p>Wir sehen, dass es in Houston 14 Verkäufe gibt, womit Houston gemessen an den Verkäufen die 14. höchste Stadt im Datensatz ist.</p><p>Wenn wir nun einen Filter anwenden, der nur die Verkaufszahlen des iPhone 16 berücksichtigt, verzeichnen wir 12 Verkäufe in Houston. Damit ist Houston die zweitmeisten Städte mit den Verkaufszahlen für dieses spezielle Modell:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd2882d5e87d02406/6a17f5d71d1b83851e93e5b2/6516040db77e6c62af5541a74c723b18008ad3c6-1472x1038.png" alt="" /><h2>Die wichtigsten Begriffe der Aggregation verstehen</h2><p>Laut Elastic-Dokumentation sind die <a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-significantterms-aggregation">wichtigsten Begriffe Aggregation</a>:</p><p><em>„(Findet) Begriffe, deren Popularität sich im Vergleich zwischen einem Vordergrund- und einem Hintergrunddatensatz signifikant verändert hat.“</em></p><p>Das bedeutet, dass statistische Kennzahlen verwendet werden, um die Häufigkeit eines Begriffs in einer Teilmenge der Daten (der Vordergrundmenge) mit der Häufigkeit desselben Begriffs in der übergeordneten Datenmenge (der Hintergrundmenge) zu vergleichen. Auf diese Weise spiegelt die Bewertung die statistische Signifikanz wider und nicht, wie häufig ein Begriff in den Daten vorkommt.</p><p>Die Hauptunterschiede zwischen einer Aggregation signifikanter Terme und einer normalen Termaggregation sind:</p><ul><li><p>Signifikante Terme vergleichen eine Teilmenge der Daten, während eine Termaggregation nur mit dem aus der Abfrage resultierenden Datensatz arbeitet.</p></li><li><p>Die Ergebnisse einer Termaggregation sind die häufigsten Terme im Datensatz, während die Ergebnisse einer signifikanten Termaggregation die häufigen Terme ignorieren, um herauszufinden, was den Datensatz einzigartig macht.</p></li><li><p>Signifikante Terme können einen größeren Einfluss auf die Leistung haben, da sie Daten von der Festplatte und nicht aus dem Arbeitsspeicher abrufen müssen, wie es bei der Termaggregation der Fall ist.</p></li></ul><h2>Praktische Anwendung (Verbraucherverhaltensanalyse)</h2><h3>Datenaufbereitung für die Analyse</h3><p>Für diese Analyse haben wir einen synthetischen Datensatz über Handyverkäufe erstellt, der Preis, technische Daten des Telefons, demografische Daten des Käufers und Kundenfeedback enthält. Wir haben außerdem Einbettungen aus dem Feedback der Nutzer generiert, um später eine semantische Abfrage durchführen zu können. Wir verwendeten das <a href="https://huggingface.co/intfloat/multilingual-e5-small">mehrsprachige e5 small model</a>, das auf Elasticsearch standardmäßig verfügbar ist.</p><p></p><p>So verwenden Sie diesen Datensatz in Elasticsearch:</p><ol><li><p>Laden Sie die CSV-Datei ( <a href="https://github.com/Alex1795/significant_terms_blog_dataset/blob/main/phone_sales_analysis_dataset.csv">hier</a> herunterladbar) mit der Kibana-Funktion <a href="https://www.elastic.co/docs/manage-data/ingest/upload-data-files">„Datendateien hochladen“</a> hoch.</p></li><li><p>Richten Sie ein semantisches Feld namens „Einbettung“ ein, wie in <a href="https://www.elastic.co/search-labs/blog/chat-with-pdf-elastic-playground#upload-pdfs-to-kibana">diesem Blog</a> beschrieben. <code>multilingual-e5-small model</code></p></li><li><p>Schließen Sie den Import mit den Feldtyp-Standardwerten ab (Schlüsselwort für jedes Feld außer <code>purchase_date</code> und <code>user_feedback)</code>. Um die hier präsentierten Abfragen ausführen zu können, müssen Sie unbedingt den Indexnamen <code>phone_sales_analysis</code> hinzufügen.</p></li></ol><p>Der Schwerpunkt dieser Analyse liegt auf der Frage <em><strong>: „Was unterscheidet die Käufer des iPhone 16 von anderen Bevölkerungsgruppen?</strong></em>“ und darauf, eine Segmentierung der Käufer für Marketingzwecke zu erstellen. </p><p>Dies ist ein Beispieldokument aus dem Datensatz:</p>{
         "customer_type": "Returning",
         "user_feedback": "I have to say, quality is great for the price. The battery life is really good.",
         "upgrade_frequency": "2 years",
         "storage_capacity": "256GB",
         "occupation": "Technology &amp; Data",
         "color": "Phantom Black",
         "gender": "Male",
         "price_paid": 899,
         "previous_brand_loyalty": "Mixed",
         "location_type": "Urban",
         "phone_model": "Samsung Galaxy S24",
         "city_region": "San Francisco Bay Area",
         "@timestamp": "2024-03-15T00:00:00.000-05:00",
         "income_bracket": "75000-100000",
         "purchase_channel": "Online",
         "feedback_sentiment": "positive",
         "education_level": "Bachelor",
         "embedding": "I have to say, quality is great for the price. The battery life is really good.",
         "customer_id": "C001",
         "purchase_date": "2024-03-15",
         "age": 34,
         "trade_in_model": "iPhone 13"
}<h3>demografische Muster verstehen</h3><p>Hier werden wir eine Analyse der Gesamtbevölkerung durchführen und sie mit interessanten Erkenntnissen aus den signifikanten Begriffsaggregationen für iPhone 16-Nutzer vergleichen.</p><h4>Normale Muster</h4><p>Um normale Kaufmuster zu verstehen, können wir Daten aus allen Dokumenten und verschiedenen Bereichen aggregieren. Der Einfachheit halber konzentrieren wir uns auf die Berufe der Personen, die ein Telefon gekauft haben. Das können wir mit einer Anfrage an Elasticsearch erreichen.</p>GET phone_sales_analysis/_search
{
 "aggs": {
   "occupation_distribution": {
     "terms": {
       "size": 5,
       "field": "occupation"
     }
   }
 },
 "size": 0
}<p>Dies zeigt uns, dass die häufigsten Berufe im Datensatz (nach Anzahl der Datensätze) folgende sind:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltec11e3ae5b9cb3c0/6a17f5d9505ac3f28aad8cba/99136ddddd7abad5d74481158a04501b6915441b-1518x480.png" alt="" /><h4>Verhaltensmuster von iPhone 16-Nutzern</h4><p>Um zu verstehen, was die Käufer eines iPhone 16 auszeichnet, führen wir eine Termaggregation auf demselben Feld mit einem Filter durch, um diese Personen in der Abfrage zu finden, etwa so:</p>GET phone_sales_analysis/_search
{
  "query": {
    "term": {
      "phone_model": "iPhone 16"
    }
  },
  "aggs": {
    "occupation_distribution": {
      "terms": {
        "size": 5,
        "field": "occupation"
      }
    }
  },
  "size": 0
}<p>Die häufigsten Berufe für iPhone 16-Nutzer sind also:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt26a5415e2f30d164/6a17f5da445de9637a4d028a/36ce86475beb03810c6ad81d7c776d1eec736654-1500x484.png" alt="" /><p>Wir können sehen, dass iPhone 16-Nutzer im Vergleich zu Nutzern anderer Telefonmodelle unterschiedliche Beschäftigungsmuster aufweisen. Nutzen wir Kibana, um die Ergebnisse einfach zu visualisieren:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4e0ddb09fe58e454/6a17f5dce317912cfa2d596b/b70ab05bc962a274e1617b6caf20575c489a62d8-1448x1128.png" alt="" /><p></p><p>In dieser Grafik können wir sehen, dass der Trend beim iPhone 16 vom Trend der Gesamtbevölkerung abweicht.</p><p>Wir können diese gesamte Analyse überspringen und direkt zu den Unterschieden zwischen iPhone 16-Nutzern und der Gesamtbevölkerung gelangen, indem wir eine Aggregation eines einzigen signifikanten Begriffs durchführen:</p>GET phone_sales_analysis/_search
{
  "query": {
    "term": {
      "phone_model": "iPhone 16"
    }
  },
  "aggs": {
    "occupation_distribution": {
      "significant_terms": {
        "size": 5,
        "field": "occupation"
      }
    }
  },
  "size": 0
}<p>Kurz gesagt, erhalten wir folgende Antwort:</p><p>Werte der Berufe für das iPhone 16</p><p>doc_count</p><p>bg_count</p><p>Berufsverteilung (oberste Ebene)</p><p>122</p><p>424</p><p>Medizin- und Gesundheitsbereich</p><p>45</p><p>57</p><p>Die Reaktion lässt eindeutig darauf schließen, dass iPhone 16-Nutzer ein ungewöhnliches (sprich: signifikantes!) Problem haben. Anzahl der Beschäftigten im medizinischen und Gesundheitsbereich im Vergleich zur Gesamtbevölkerung. Mal sehen, was die Zahlen in der Antwort bedeuten:</p><ul><li><p><strong>Auf höchster Ebene:</strong></p><ul><li><p><strong>Dokumentenanzahl: 122 – </strong>Die Abfrage ergab insgesamt 122 Treffer.</p></li><li><p><strong>bg_count: 424 — </strong>Der Hintergrundsatz (alle Verkaufsbelege) enthält 424 Belege</p></li></ul></li><li><p><strong>Im Bereich Medizin &amp; Gesundheitswesen:</strong></p><ul><li><p><strong>Dokumentanzahl: 45 — </strong>„Medizin &amp; Gesundheitswesen“ erscheint in 45 der 122 Suchergebnisse</p></li><li><p><strong>bg_count: 57 — </strong>"Medizin &amp; Gesundheitswesen" erscheint in 57 der insgesamt 424 Dokumente im Hintergrunddatensatz</p></li></ul></li></ul><p>Von 424 Käufern arbeiten 57 im medizinischen und Gesundheitsbereich – das entspricht 13,44 %. Betrachtet man jedoch die Käufer des iPhone 16, so arbeiten 45 von 122 im medizinischen und Gesundheitsbereich – das entspricht 36,88 %. Das bedeutet, dass die Wahrscheinlichkeit, jemanden aus dem medizinischen oder Gesundheitssektor unter den iPhone 16-Nutzern zu finden, doppelt so hoch ist!</p><p>Wir können diese Analyse auch auf andere Bereiche (Alter, Standort, Einkommensklasse usw.) anwenden, um mehr Informationen darüber zu erhalten, was die Nutzer des iPhone 16 auszeichnet. </p><h3>Kundensegmentierung</h3><p>Mithilfe der Aggregation signifikanter Begriffe können wir Erkenntnisse über die Beziehungen zwischen Produkten, Kategorien und Kundensegmenten gewinnen. Hierfür erstellen wir eine übergeordnete Aggregation für die Kategorie, die wir genauer untersuchen möchten. Wir verwenden außerdem eine Unteraggregation von signifikanten Begriffen und normalen Begriffen, um interessante Erkenntnisse über diese Kategorie zu gewinnen und sie mit dem zu vergleichen, was die meisten Menschen in diesem Beruf verwenden.</p><p>Schauen wir uns beispielsweise an, was Menschen in verschiedenen Berufsfeldern bevorzugen:</p><ol><li><p>Um die Analyse übersichtlicher zu gestalten, beschränken wir unsere Suche auf drei Arbeitsbereiche: ["Verwaltung &amp; Support", "Technologie &amp; Daten", "Medizin &amp; Gesundheitswesen"]</p></li><li><p>Auf der Seite der Aggregationen beginnen wir mit einer Termaggregation nach Berufsbezeichnung.</p></li><li><p>Fügen Sie eine Unteraggregation hinzu: Begriffe nach Telefonmodell – um herauszufinden, welche Modelle Nutzer kaufen, die in den jeweiligen Bereichen arbeiten.</p></li><li><p>Fügen Sie eine zweite Unteraggregation hinzu: signifikante Begriffe nach Telefonmodellen – um herauszufinden, welche Modelle in den einzelnen Arbeitsbereichen besonders sind.</p></li></ol>GET phone_sales_analysis/_search
{
 "query": {
   "terms": {
     "occupation": [
       "Administrative &amp; Support",
       "Technology &amp; Data",
       "Medical &amp; Healthcare"
     ]
   }
 },
 "aggs": {
   "occupations": {
     "terms": {
       "size": 15,
       "field": "occupation"
     },
     "aggs": {
       "general_models": {
         "terms": {
           "field": "phone_model"
         }
       },
       "significant_models": {
         "significant_terms": {
           "field": "phone_model"
         }
       }
     }
   }
 },
 "size": 0
}<p>Lassen Sie uns die Aggregationsergebnisse im Detail betrachten:</p><p><strong>Beruf</strong>: Verwaltung &amp; Unterstützung</p><p><strong>Termaggregation</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3a325cde37b40504/6a17f5dd4b055dbb68432372/a4ad519c9013867a3f4cee032160eadd8a47804a-1506x398.png" alt="" /><p><strong>Aggregation signifikanter Terme</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltef514b8bbb7f429c/6a17f5df3e9e456488ba1612/e5604fa8036667bdfe733576a5e7c6153760dd3a-306x220.png" alt="" /><p>Aus dieser Tabelle lässt sich schließen, dass es keine signifikanten Unterschiede zwischen dem Trend für diesen Beruf und dem Trend für die Gesamtbevölkerung gibt.</p><p><strong>Beruf</strong>: Technologie &amp; Daten</p><p><strong>Termaggregation</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt94189446d8f3100e/6a17f5e142022983b029f76e/13b09039bb7d183276451007d2d69dc190b1d3c0-1508x836.png" alt="" /><p></p><p><strong>Aggregation signifikanter Terme</strong></p><p>Gesamtzahl der Dokumente: 424</p><p>Dokumente in diesem Beruf: 71</p><p>Telefonmodell</p><p>doc_count (dieses Modell in diesem Beruf)</p><p>bg_count (Dieses Modell ist in allen Dokumenten enthalten)</p><p>% in allen Dokumenten</p><p>% in diesem Beruf</p><p>Google Pixel 8</p><p>12</p><p>22</p><p>5,19 %</p><p>16,90 %</p><p>OnePlus 11</p><p>9</p><p>14</p><p>3,30 %</p><p>12,68 %</p><p>OnePlus 12 Pro</p><p>3</p><p>3</p><p>0,71 %</p><p>4,23 %</p><p>Google Pixel 8 Pro</p><p>9</p><p>21</p><p>4,95 %</p><p>12,68 %</p><p>Nichts Telefon 2</p><p>5</p><p>8</p><p>1,89 %</p><p>7,04 %</p><p>Samsung Galaxy Z Fold5</p><p>4</p><p>6</p><p>1,42 %</p><p>5,63 %</p><p>OnePlus 12</p><p>8</p><p>20</p><p>4,72 %</p><p>11,27 %</p><p><strong>Beruf</strong>: Medizin &amp; Gesundheitswesen</p><p><strong>Termaggregation</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt270b0a861a16488a/6a17f5e23e03d76a934f2df0/b008e996742fc0bb48dc6bacff17cfbc56cf0d73-1492x398.png" alt="" /><p><strong>Aggregation signifikanter Terme</strong></p><p>Gesamtzahl der Dokumente: 424</p><p>Dokumente in diesem Beruf: 57</p><p>Telefonmodell</p><p>doc_count (dieses Modell in diesem Beruf)</p><p>bg_count (Dieses Modell ist in allen Dokumenten enthalten)</p><p>% in allen Dokumenten</p><p>% in diesem Beruf</p><p>iPhone 16</p><p>45</p><p>122</p><p>28,77 %</p><p>78,95 %</p><p>iPhone 15 Pro Max</p><p>3</p><p>13</p><p>3,07 %</p><p>5,26 %</p><p>iPhone 15</p><p>7</p><p>40</p><p>9,43 %</p><p>12,28 %</p><p>Mal sehen, welche Geschichte uns diese Daten erzählen:</p><ul><li><p>Medizinisches Fachpersonal und Angehörige von Gesundheitsberufen bevorzugen das iPhone 16 und neigen generell sehr dazu, Apple-Handys zu benutzen.</p></li><li><p>Technologie- und Datenexperten bevorzugen High-End-Android-Smartphones, greifen aber nicht unbedingt auf die Marke Samsung zurück. Auch in dieser Kategorie ist ein deutlicher Trend zu iPhones zu beobachten.</p></li><li><p>Bei Verwaltungs- und Supportmitarbeitern sind Samsung- und Google-Handys beliebt, es gibt jedoch keinen ausgeprägten und eindeutigen Trend.</p></li></ul><h3>Aggregation signifikanter Begriffe und Hybridsuche</h3><p>Die Hybridsuche kombiniert Textsuche und semantische Ergebnisse, um ein verbessertes Sucherlebnis zu bieten. In diesem Kontext kann eine aussagekräftige Termaggregation Aufschluss über die Ergebnisse einer kontextbezogenen Suche geben, indem sie die Frage beantwortet: <strong>Was ist das Besondere an diesem Datensatz im Vergleich zu allen Dokumenten?</strong>Um diese Funktion zu veranschaulichen, sehen wir uns an, welche Modelle überrepräsentiert sind, wenn Nutzer von guter Leistung sprechen: </p><ul><li><p>Wir erstellen eine semantische Abfrage, bei der wir das beste Nutzerfeedback finden, das dem Eingabetext „gute Leistung“ im Feld „Einbettung“ am nächsten kommt.</p></li><li><p>Wir werden außerdem eine Textsuche mit denselben Begriffen im Textfeld user_feedback durchführen.</p></li><li><p>Wir werden außerdem eine Abfrage mit aussagekräftigen Begriffen hinzufügen, um Telefonmodelle zu finden, die in diesen Ergebnissen häufiger vorkommen als im gesamten Datensatz.
</p></li></ul>GET phone_sales_analysis/_search
{
 "retriever": {
   "rrf": {
     "retrievers": [
       {
         "standard": {
           "query": {
             "bool": {
               "must": [
                 {
                   "match": {
                     "user_feedback": {
                       "query": "good performance",
                       "operator": "and"
                     }
                   }
                 }
               ]
             }
           }
         }
       },
       {
         "standard": {
           "query": {
             "semantic": {
               "field": "embedding",
               "query": "good performance"
             }
           }
         }
       }
     ],
    "rank_window_size": 20
   }
 },
 "aggs": {
   "Models": {
     "significant_terms": {
       "field": "phone_model"
     }
   }
 }
}<p>Betrachten wir ein Beispiel für die übereinstimmenden Dokumente:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1c3dc221896c8832/6a17f5e4445de91eac4d028e/4cb488097a382f0c28c21540db4f593d23633473-1600x162.png" alt="" /><p>Das ist die Antwort, die wir erhalten:</p>{
  "took": 388,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 20,
      "relation": "eq"
    },
    "max_score": 0.016393442,
    "hits": [...]
  },
  "aggregations": {
    "Models": {
      "doc_count": 20,
      "bg_count": 424,
      "buckets": [
        {
          "key": "iPhone 15",
          "doc_count": 5,
          "score": 0.4125,
          "bg_count": 40
        }
      ]
    }
  }
}<p></p><p>Dies bedeutet, dass ein iPhone 15 zwar 40 Mal in insgesamt 424 Dokumenten vorkommt (9,4 % der Dokumente), es aber 5 Mal in den 20 Dokumenten zu finden ist, die der semantischen Suche „gute Leistung“ entsprechen (25 % der Dokumente). Daraus lässt sich schließen: Die Wahrscheinlichkeit, ein iPhone 15 zu finden, ist 2,7-mal höher, wenn es um gute Leistung geht, als durch Zufall.</p><h2>Fazit</h2><p>Durch die Aggregation signifikanter Terme lassen sich einzigartige Details eines Datensatzes aufdecken, indem man ihn mit der Gesamtheit aller Dokumente vergleicht. Dadurch können unerwartete Zusammenhänge in unseren Daten aufgedeckt werden, die über die reine Anzahl der Vorkommen hinausgehen. Wir können in verschiedenen Anwendungsfällen aussagekräftige Begriffe einsetzen, die sehr interessante Funktionen ermöglichen, zum Beispiel:</p><ul><li><p><a href="https://www.elastic.co/blog/significant-terms-aggregation#credit">Bei der Betrugserkennung sollten Sie Muster erkennen </a>– identifizieren Sie typische Transaktionen gestohlener Kreditkarten.</p></li><li><p>Markenqualitätseinblicke aus Nutzerbewertungen – Marken mit einer unverhältnismäßig hohen Anzahl schlechter Bewertungen erkennen.</p></li><li><p><a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-significantterms-aggregation#_use_on_free_text_fields">Aufspüren </a>falsch klassifizierter Dokumente – Aufspüren von Dokumenten, die zu einer Kategorie gehören (Termfilter), die in einer Beschreibung ungewöhnliche Wörter für die Kategorie verwenden (Aggregation signifikanter Begriffe).</p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/significant-terms-aggregation-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/significant-terms-aggregation-elasticsearch</guid>
    <category><![CDATA[Grundlagen]]></category>
    <category><![CDATA[Query DSL]]></category>
    <dc:creator><![CDATA[Alexander Dávila]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta4d95b6134c2a110/6a17f5e6505ac3fd3cad8cbf/13adbc901837835bb56abf15e377127b017cfac8-1536x1024.png" length="0" type="image/png"/>
    <pubDate>Mon, 07 Jul 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Bereitstellung von Elasticsearch auf GCP GKE Autopilot]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie einen Elasticsearch-Cluster auf der Google Cloud Platform mit GKE Autopilot und ECK für eine teilweise verwaltete Elasticsearch-Konfiguration bereitstellen können.]]></description>
    <content:encoded><![CDATA[<p>In diesem Artikel lernen wir, wie Elasticsearch mithilfe von Autopilot auf Google Cloud Kubernetes (GKE) bereitgestellt wird.</p><p>Für Elasticsearch werden wir <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s">Elastic Cloud on Kubernetes </a>(ECK) verwenden, den offiziellen Elasticsearch Kubernetes-Operator, der die Orchestrierung von Kubernetes-Deployments aller Elastic Stack-Komponenten vereinfacht.</p><p>Um mehr darüber zu erfahren, wie man Elasticsearch-Cluster auf verschiedenen Google-Cloud-Platform-Infrastrukturen bereitstellt, können Sie unsere Einstiegsartikel für <a href="https://www.elastic.co/search-labs/blog/elasticsearch-gpc-google-compute-engine">Google Cloud Compute</a> und <a href="https://www.elastic.co/search-labs/blog/deploy-elastic-gcp-marketplace">Google Cloud Marketplace</a> lesen.</p><h2>Aufwand für die Bereitstellung von Elasticsearch</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt61969357430c94f8/6a17f6d125daab024708a3ae/56b54d718dcff9af9050873c41fdf738074851da-1428x582.png" alt="Aufwand für die Bereitstellung von Elasticsearch ECK." /><h3>Was ist GKE Autopilot?</h3><p><a href="https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview?hl=es-419"><strong>Google Kubernetes Engine (GKE) Autopilot</strong></a> bietet ein vollständig verwaltetes Kubernetes-Erlebnis, bei dem Google die Clusterkonfiguration, das Node-Management, die Security und das Skalieren übernimmt, während Entwickler sich auf die Bereitstellung von Anwendungen konzentrieren, sodass Teams mit integrierten Best Practices in wenigen Minuten vom Code zur Produktion gelangen können.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt91e10f44290aeac4/6a17f6d33e9e451f67ba1638/bbf6de63fa0a199326352f521cb22654818799f6-1600x958.png" alt="GKE-Autopilot-Container." /><h2>Wann sollte man ECK in Google Cloud nutzen?</h2><p>Elastic Cloud on Kubernetes (ECK) eignet sich besonders für Unternehmen mit einer bestehenden Kubernetes-Infrastruktur, die Elasticsearch mit erweiterten Funktionen wie dedizierten Knotenrollen, hoher Verfügbarkeit und Automatisierung bereitstellen möchten.</p><h2>Wie richtet man ECK in Google Cloud ein?</h2><p>1. Melden Sie sich in der <a href="https://console.cloud.google.com">Google Cloud Console</a> an.</p><p>2. Klicken Sie <strong>oben rechts </strong>auf die <strong>Cloud-Shell-Taste</strong>, um auf die Konsole zuzugreifen, und stellen Sie von dort aus den GKE-Cluster bereit. Alternativ können Sie auch <a href="https://cloud.google.com/cli">gcloud CLI</a> verwenden.</p><p><em><strong>Denken Sie daran, die Projekt-ID während des Tutorials durch Ihre eigene zu ersetzen.</strong></em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc69e47bf97e4be31/6a17f6d5505ac3bbe6ad8cdb/999b03861d4fe44f360ab4c7e2616e1dc10cf182-1558x1248.png" alt="So richten Sie Elasticsearch auf Google Cloud Platform GKE Autopilot ein." /><p>3. Aktivieren Sie die <a href="https://console.cloud.google.com/flows/enableapi?apiid=container.googleapis.com">Google Kubernetes Engine API</a>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1a4d95465f563ece/6a17f6d7e8fbced6393a1af3/03827d3dc0e987c019e7747d33e7c01920047beb-911x246.png" alt="Aktivierung der Google Kubernetes Engine API." /><p>Klicken Sie auf <em><strong>Next (Weiter).</strong></em></p><p>Nun sollte die Kubernetes Engine API als aktiviert angezeigt werden, wenn nach der Kubernetes Engine API gesucht wird.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6ba41b82d995347f/6a17f6d8505ac3036bad8cdf/d5cd46f0333086bcb31b80cf9c08a469b449ec0f-640x250.png" alt="Die Kubernetes Engine-API." /><p>4. In der Cloud Shell einen Autopilot-Cluster erstellen. Wir werden es „autopilot-cluster-1“ benennen und außerdem „autopilot-test“ durch die ID Ihres Projekts ersetzen.</p>gcloud beta container --project "autopilot-test-457216" clusters create-auto "autopilot-cluster-1" --region "us-central1" --release-channel "regular" --tier "standard" --enable-ip-access --no-enable-google-cloud-access --network "projects/autopilot-test-457216/global/networks/default" --subnetwork "projects/autopilot-test-457216/regions/us-central1/subnetworks/default" --cluster-ipv4-cidr "/17" --binauthz-evaluation-mode=DISABLED<p>5. Warten Sie, bis es bereit ist. Die Erstellung dauert etwa 10 Minuten.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4e821e77d5db5d71/6a17f6da148009381cb48900/81fbc45ba56d0f16ba42724cb8ae45e60b327dbc-1581x258.png" alt="Bild eines Autopilot-Cluster-Setups." /><p>Nach der korrekten Einrichtung des Clusters wird eine Bestätigungsmeldung angezeigt.</p><p>6. Konfigurieren Sie den Zugriff auf die „kubectl“-Befehlszeile.</p>gcloud container clusters get-credentials autopilot-cluster-1 --region us-central1 --project autopilot-test-457216<p>Sie sollten sehen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf1c828e5059c8ec8/6a17f6dcabe0f215e5dfebb7/b0beba1ee00ce9029f586ee32693fc2aa58c7f65-3442x142.png" alt="" /><p><em>Für autopilot-cluster-1 wurde ein „kubeconfig“-Eintrag generiert.</em></p><p>7. Installieren Sie den <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s">Elastic Cloud on Kubernetes</a> (ECK)-Operator.</p># Install ECK Custom Resource Definitions
kubectl create -f https://download.elastic.co/downloads/eck/2.16.1/crds.yaml

# Install the ECK operator
kubectl apply -f https://download.elastic.co/downloads/eck/2.16.1/operator.yaml<p>8. Lassen Sie uns eine Elasticsearch-Instanz mit einem einzelnen Knoten und den Standardwerten erstellen.</p><p>Wenn Sie einige Rezepte für verschiedene Setups prüfen möchten, können Sie <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/recipes">diesen Link</a> besuchen.</p><p>Bitte beachten Sie, dass ECK, wenn Sie kein <code>storageClass</code> angeben, den standardmäßig festgelegten Wert verwendet, der für GKE <code>standard-rwo</code> ist und den <a href="https://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/gce-pd-csi-driver?cloudshell=true">Compute Engine Persistent Disk CSI Driver</a> nutzt, und damit ein 1-GB-Volume erstellt.</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 9.0.0
  nodeSets:
  - name: default
    count: 1
    config:
      node.store.allow_mmap: false
EOF<p>Wir haben <code>nmap</code> deaktiviert, da die Standard-GKE-Maschine einen zu niedrigen Wert für <code>vm.max_map_count</code> hat. Für den Produktivbetrieb wird von einer Deaktivierung abgeraten; stattdessen sollte der Wert von <code>vm.max_map_count</code> erhöht werden. Mehr darüber, wie Sie das machen, können Sie <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/virtual-memory">hier</a> lesen.</p><p>9. Lassen Sie uns außerdem einen Kibana-Cluster mit einem einzelnen Knoten bereitstellen. Für Kibana fügen wir einen LoadBalancer hinzu, der uns eine externe IP-Adresse bereitstellt, über die wir Kibana von unserem Gerät aus erreichen können.</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 9.0.0
  http:
    service:
      metadata:
        annotations:
          cloud.google.com/l4-rbs: "enabled"
      spec:
        type: LoadBalancer
  count: 1
  elasticsearchRef:
    name: quickstart
EOF<p>Beachten Sie die Anmerkung: </p><p><code>cloud.google.com/l4-rbs: "enabled"</code></p><p><em><strong>Das ist sehr wichtig, weil es Autopilot anweist, einen öffentlich zugänglichen LoadBalancer bereitzustellen. Falls nicht festgelegt, wird der LoadBalancer intern verwendet.</strong></em></p><p>10. Prüfen Sie, ob Ihre Pods laufen</p>kubectl get pods<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt627dd8f482340bc2/6a17f6de3e03d779a44f2e16/99da1270581a137683770efdb9c6e1577ec9fc01-3150x442.png" alt="" /><p>11. Sie können auch <code>run kubectl get elasticsearch</code> und <code>kubectl get kibana</code> für spezifischere Statistiken wie Elasticsearch-Version, Nodes und Health verwenden.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt32d179d1c4f785b3/6a17f6e04b055db05a432392/86234f307970fd5f78b8acd41496e8cc89ff82d3-3414x326.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt75b60dc0e4ad9636/6a17f6e296142a27eaeb1ca6/29160286ccc88928734c8ea11b1923db8e85d49d-3142x318.png" alt="" /><p>12. Greifen Sie auf Ihre Dienste zu.</p>kubectl get svc<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3806ad91791373a2/6a17f6e46df731bc800a10ab/ed1a07314b84a99b4aa1fec3db4b9badeb9587ee-3446x610.png" alt="" /><p>Hier wird Ihnen die externe URL für Kibana unter EXTERNAL-IP angezeigt. Es kann einige Minuten dauern, bis der LoadBalancer bereitgestellt wird. <em><strong>Kopieren Sie den Wert von EXTERNAL-IP.</strong></em></p><p>13. Ermitteln Sie das Elasticsearch-Passwort für den Nutzer „elastic“:</p>kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ab53ce5a685491b/6a17f6e63e03d74fcc4f2e1a/ab5054219216ebc15fc0d96e27605aaf13b720c6-3448x210.png" alt="" /><p>14. <strong>Greifen Sie über Ihren Browser auf Kibana zu:</strong></p><ul><li><p>URL: https://&lt;EXTERNAL_IP&gt;:5601</p></li><li><p>Benutzername:elastic</p></li><li><p>Passwort: 28Pao50lr2GpyguX470L2uj5 (aus dem vorherigen Schritt)</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd86d22f797132c21/6a17f6e7e8fbce62b43a1afb/47cbe88dc14db64db3a256f3f7504cc86a843475-463x503.png" alt="Elastic Begrüßungsbildschirm." /><p>15. Wenn Sie von Ihrem Browser aus zugreifen, wird der Willkommensbildschirm angezeigt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6f44dc23e6f1f625/6a17f6e9be6086ea71004948/a75c151c0144b7efe2b730698c0ed0156fa9b16a-1600x1005.png" alt="Elasticsearch-Startseite." /><p>Wenn Sie die Spezifikationen des Elasticsearch-Clusters ändern möchten, z. B. Knoten ändern oder die Größe anpassen, können Sie das yml-Manifest mit den neuen Einstellungen erneut anwenden:</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 9.0.0
  nodeSets:
    - name: default
      count: 2
      config:
        node.store.allow_mmap: false
      podTemplate:
        spec:
          containers:
            - name: elasticsearch
              resources:
                requests:
                  memory: 1.5Gi
                  cpu: 2
                limits:
                  memory: 1.5Gi
                  cpu: 2
EOF<p>In diesem Beispiel fügen wir einen weiteren Node hinzu und ändern RAM sowie CPU. Wie Sie sehen, zeigt <code>kubectl get elasticsearch</code> jetzt 2 Knoten:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt33a7ba0be483195a/6a17f6ebe8fbcea7da3a1aff/48b475622cc48890bff8105d151f2cbde28d7021-3418x298.png" alt="" /><p>Das Gleiche gilt für Kibana:</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 9.0.0
  http:
    service:
      metadata:
        annotations:
          cloud.google.com/l4-rbs: "enabled"
      spec:
        type: LoadBalancer
  count: 1
  elasticsearchRef:
    name: quickstart
  podTemplate:
    spec:
      containers:
        - name: kibana
          env:
            - name: NODE_OPTIONS
              value: "--max-old-space-size=1024"
          resources:
            requests:
              memory: 0.5Gi
              cpu: 0.5
            limits:
              memory: 1Gi
              cpu: 1
EOF<p>Wir können die CPU/RAM des Containers sowie die Speichernutzung von <a href="https://nodejs.org/">Node.js </a>(<a href="https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-mib">max-old-space-size</a>) anpassen.</p><p>Denken Sie daran, dass <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/volume-claim-templates">bestehende Volumenbehauptungen nicht verkleinert werden können</a>. Nach der Installation des Updates wird der Betreiber die Änderungen mit minimaler Ausfallzeit vornehmen.</p><p>Denken Sie daran, den Cluster nach dem Testen zu löschen, um unnötige Kosten zu vermeiden.</p>gcloud container clusters delete autopilot-cluster-1<h2>Wie geht es weiter?</h2><p>Wenn Sie mehr über Kubernetes und die Google Kubernetes Engine erfahren möchten, lesen Sie diese Artikel:</p><ul><li><p><a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s">Elastic Cloud auf Kubernetes | Elastic Docs</a></p></li><li><p><a href="https://cloud.google.com/blog/products/containers-kubernetes/introducing-gke-autopilot">Einführung von GKE Autopilot | Google Cloud Blog</a></p></li><li><p><a href="https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview">Autopilot-Überblick | Google Kubernetes Engine (GKE)</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/eck-gke-autopilot</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/eck-gke-autopilot</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Eduard Martin]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltea045d2d12606d11/6a17f6edb1e113c86179f3e7/d9c462fe63011356671479ccfedd435eec1ede52-1200x628.png" length="0" type="image/png"/>
    <pubDate>Thu, 19 Jun 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Elasticsearch in JavaScript richtig anwenden, Teil II]]></title>
    <description><![CDATA[Erfahren Sie mehr über Best Practices für die Produktion und darüber, wie Sie den Elasticsearch Node.js-Client in serverlosen Umgebungen ausführen können, um Programmierfehler zu vermeiden. ]]></description>
    <content:encoded><![CDATA[<p>Dies ist der zweite Teil unserer Elasticsearch-in-JavaScript-Serie. Im<a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i"> ersten Teil haben wir gelernt,</a> wie wir unsere Umgebung richtig einrichten, den Node.js-Client konfigurieren, Daten indizieren und suchen. Im zweiten Teil lernen wir, wie man Best Practices für die Produktion implementiert und den Elasticsearch <a href="http://node.js">Node.js</a> -Client in serverlosen Umgebungen ausführt.</p><p>Wir werden Folgendes überprüfen:</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii#production-best-practices">Best Practices für die Produktion</a></p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii#error-handling">Fehlerbehandlung</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii#testing">Tests</a></p></li></ul></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii#serverless-environments">Serverlose Umgebungen</a></p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii#running-the-client-on-elastic-serverless">Den Client auf Elastic Serverless ausführen</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii#running-the-client-on-function-as-a-service-environment">Ausführen des Clients in einer Function-as-a-Service-Umgebung</a></p></li></ul></li></ul><p><em>Den Quellcode mit den Beispielen finden Sie </em><a href="https://github.com/Delacrobix/JS-client-best-practices_article"><em><strong>hier</strong></em></a><em><strong>.</strong></em></p><h2>Best Practices für die Produktion</h2><h3>Fehlerbehandlung in Elasticsearch</h3><p>Ein nützliches Feature des Elasticsearch-Clients in Node.js ist, dass er Objekte für die möglichen Fehler in Elasticsearch bereitstellt, sodass man diese auf verschiedene Weise validieren und behandeln kann.</p><p>Um <a href="https://www.elastic.co/docs/reference/elasticsearch/clients/javascript/connecting#client-error-handling">sie alle zu sehen</a>, führen Sie folgenden Befehl aus: </p>const { errors } = require('@elastic/elasticsearch')
console.log(errors)<p>Kehren wir zum Suchbeispiel zurück und behandeln wir einige der möglichen Fehler:</p>app.get("/search/lexic", async (req, res) =&gt; {
 ....
  } catch (error) {
    if (error instanceof errors.ResponseError) {
      let errorMessage =
        "Response error!, query malformed or server down, contact the administrator!";

      if (error.body.error.type === "parsing_exception") {
        errorMessage = "Query malformed, make sure mappings are set correctly";
      }

      res.status(error.meta.statusCode).json({
        erroStatus: error.meta.statusCode,
        success: false,
        results: null,
        error: errorMessage,
      });
    }

    res.status(500).json({
      success: false,
      results: null,
      error: error.message,
    });
  }
});<p><code>ResponseError</code> Dies tritt insbesondere dann auf, wenn die Antwort <code>4xx</code> oder <code>5xx</code> lautet, was bedeutet, dass die Anfrage fehlerhaft ist oder der Server nicht verfügbar ist.</p><p>Wir können diese Art von Fehler testen, indem wir fehlerhafte Abfragen generieren, beispielsweise den Versuch, <strong>eine Termabfrage für ein Textfeld durchzuführen:</strong></p><p>Standardfehler:</p> {
    "success": false,
    "results": null,
    "error": "parsing_exception\n\tRoot causes:\n\t\tparsing_exception: [terms] query does not support [visit_details]"
}<p>Benutzerdefinierter Fehler: </p>{
    "erroStatus": 400,
    "success": false,
    "results": null,
    "error": "Response error!, query malformed or server down; contact the administrator!"
}<p>Wir können auch jeden Fehlertyp auf eine bestimmte Weise erfassen und behandeln. Zum Beispiel können wir in einem <code>TimeoutError</code> eine Wiederholungslogik hinzufügen.</p>app.get("/search/semantic", async (req, res) =&gt; {
    try {
  ...
  } catch (error) {
    if (error instanceof errors.TimeoutError) {


     // Retry logic...

      res.status(error.meta.statusCode).json({
        erroStatus: error.meta.statusCode,
        success: false,
        results: null,
        error:
          "The request took more than 10s after 3 retries. Try again later.",
      });
    }
  }
});<h3>Tests</h3><p>Tests sind entscheidend, um die Stabilität der App zu gewährleisten. Um den Code auf eine von Elasticsearch isolierte Weise zu testen, können wir die Bibliothek <a href="https://github.com/elastic/elasticsearch-js-mock">elasticsearch-js-mock</a> beim Erstellen unseres Clusters verwenden.</p><p>Mithilfe dieser Bibliothek können wir einen Client instanziieren, der dem realen Client sehr ähnlich ist, aber auf unsere Konfiguration reagiert, indem wir lediglich die HTTP-Schicht des Clients durch eine simulierte Schicht ersetzen, während der Rest mit dem Original übereinstimmt.</p><p>Wir werden die Mock-Bibliothek und <a href="https://github.com/avajs/ava">AVA</a> für automatisierte Tests installieren.</p><p><code>npm install @elastic/elasticsearch-mock</code></p><p><code>npm install --save-dev ava</code></p><p>Wir werden die Datei <code>package.json</code> so konfigurieren, dass die Tests ausgeführt werden. Stellen Sie sicher, dass es so aussieht:</p>"type": "module",
	"scripts": {
		"test": "ava"
	},
	"devDependencies": {
		"ava": "^5.0.0"
	}<p>Erstellen wir nun eine <code>test.js</code> -Datei und installieren wir unseren Mock-Client:</p>const { Client } = require('@elastic/elasticsearch')
const Mock = require('@elastic/elasticsearch-mock')

const mock = new Mock()
const client = new Client({
  node: 'http://localhost:9200',
  Connection: mock.getConnection()
})<p>Fügen Sie nun ein Mock-Objekt für die semantische Suche hinzu:</p>function createSemanticSearchMock(query, indexName) {
  mock.add(
    {
      method: "POST",
      path: `/${indexName}/_search`,
      body: {
        query: {
          semantic: {
            field: "semantic_field",
            query: query,
          },
        },
      },
    },
    () =&gt; {
      return {
        hits: {
          total: { value: 2, relation: "eq" },
          hits: [
            {
              _id: "1",
              _score: 0.9,
              _source: {
                owner_name: "Alice Johnson",
                pet_name: "Buddy",
                species: "Dog",
                breed: "Golden Retriever",
                vaccination_history: ["Rabies", "Parvovirus", "Distemper"],
                visit_details:
                  "Annual check-up and nail trimming. Healthy and active.",
              },
            },
            {
              _id: "2",
              _score: 0.7,
              _source: {
                owner_name: "Daniel Kim",
                pet_name: "Mochi",
                species: "Rabbit",
                breed: "Mixed",
                vaccination_history: [],
                visit_details:
                  "Nail trimming and general health check. No issues.",
              },
            },
          ],
        },
      };
    }
  );
}<p>Wir können nun einen Test für unseren Code erstellen, um sicherzustellen, dass der Elasticsearch-Teil immer die gleichen Ergebnisse liefert:</p>import test from 'ava';

test("performSemanticSearch must return formatted results correctly", async (t) =&gt; {
  const indexName = "vet-visits";
  const query = "Which pets had nail trimming?";

  createSemanticSearchMock(query, indexName);

  async function performSemanticSearch(esClient, q, indexName = "vet-visits") {
    try {
      const result = await esClient.search({
        index: indexName,
        body: {
          query: {
            semantic: {
              field: "semantic_field",
              query: q,
            },
          },
        },
      });

      return {
        success: true,
        results: result.hits.hits,
      };
    } catch (error) {
      if (error instanceof errors.TimeoutError) {
        return {
          success: false,
          results: null,
          error: error.body.error.reason,
        };
      }

      return {
        success: false,
        results: null,
        error: error.message,
      };
    }
  }

  const result = await performSemanticSearch(esClient, query, indexName);

  t.true(result.success, "The search must be successful");
  t.true(Array.isArray(result.results), "The results must be an array");

  if (result.results.length &gt; 0) {
    t.true(
      "_source" in result.results[0],
      "Each result must have a _source property"
    );
    t.true(
      "pet_name" in result.results[0]._source,
      "Results must include the pet_name field"
    );
    t.true(
      "visit_details" in result.results[0]._source,
      "Results must include the visit_details field"
    );
  }
});<p>Lasst uns die Tests durchführen.</p><p><code>npm run test</code></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt36304e286146f362/6a170559d7c02237b2de638f/42feae845ae8eae03c37ad7ad114e8db35984812-1186x302.png" alt="" /><p>Erledigt! Ab sofort können wir unsere App testen und uns dabei zu 100 % auf den Code konzentrieren, ohne uns von externen Faktoren beeinflussen zu lassen.</p><h2>Serverlose Umgebungen</h2><h3>Wie Sie den Client auf Elastic Serverless ausführen</h3><p>Wir haben die Ausführung von Elasticsearch in der Cloud oder lokal behandelt; der Node.js-Client unterstützt jedoch auch Verbindungen zu <a href="https://www.elastic.co/guide/en/serverless/current/intro.html">Elastic Cloud Serverless</a>.</p><p>Mit Elastic Cloud Serverless können Sie ein Projekt erstellen, bei dem Sie sich keine Gedanken um die Infrastruktur machen müssen, da Elastic dies intern übernimmt. Sie müssen sich nur um die Daten kümmern, die Sie indizieren möchten, und darum, wie lange Sie darauf zugreifen möchten.</p><p>Aus Nutzersicht entkoppelt Serverless Rechenleistung von Speicher und bietet automatische Skalierungsfunktionen sowohl für <a href="https://www.elastic.co/search-labs/blog/elasticsearch-serverless-tier-autoscaling">die Suche</a> als auch <a href="https://www.elastic.co/search-labs/blog/elasticsearch-ingest-autoscaling">für die Indizierung</a>. Dadurch können Sie nur die Ressourcen anbauen, die Sie tatsächlich benötigen.</p><p>Der Client nimmt folgende Anpassungen vor, um eine Verbindung zu Serverless herzustellen:</p><ul><li><p>Deaktiviert das Sniffing und ignoriert alle Sniffing-bezogenen Optionen.</p></li><li><p>Ignoriert alle in der Konfiguration übergebenen Knoten außer dem ersten und ignoriert jegliche Knotenfilter- und Auswahloptionen.</p></li><li><p>Aktiviert Komprimierung und `TLSv1_2_method` (genau wie bei der Konfiguration für Elastic Cloud).</p></li><li><p>Fügt allen Anfragen einen HTTP-Header `elastic-api-version` hinzu</p></li><li><p>Verwendet standardmäßig `CloudConnectionPool` anstelle von `WeightedConnectionPool`.</p></li><li><p>Deaktiviert die vom Anbieter bereitgestellten `content-type`- und `accept`-Header zugunsten der Standard-MIME-Typen.</p></li></ul><p>Um Ihr serverloses Projekt zu verbinden, müssen Sie den Parameter serverMode: serverless verwenden.</p>const { Client } = require('@elastic/elasticsearch')
const client = new Client({
  node: 'ELASTICSEARCH_ENDPOINT',
  auth: { apiKey: 'ELASTICSEARCH_API_KEY' },
  serverMode: "serverless",
});<h3>Wie Sie den Client in einer Function-as-a-Service-Umgebung ausführen</h3><p>In diesem Beispiel haben wir einen Node.js-Server verwendet, aber Sie können auch über eine Function-as-a-Service-Umgebung mit Funktionen wie AWS Lambda, GCP Run usw. eine Verbindung herstellen.</p>'use strict'

const { Client } = require('@elastic/elasticsearch')

const client = new Client({
  // client initialisation
})

exports.handler = async function (event, context) {
  // use the client
}<p>Ein weiteres Beispiel ist die Anbindung an Dienste wie Vercel, das ebenfalls serverlos ist. Sie können sich dieses <a href="https://github.com/elastic/elasticsearch-js/blob/main/docs/examples/proxy/README.md">vollständige Beispiel</a> ansehen, wie das geht, aber der relevanteste Teil des <a href="https://github.com/elastic/elasticsearch-js/blob/main/docs/examples/proxy/api/search.js">Suchendpunkts</a> sieht folgendermaßen aus:</p>const response = await client.search(
  {
    index: INDEX,
    // You could directly send from the browser
    // the Elasticsearch's query DSL, but it will
    // expose you to the risk that a malicious user
    // could overload your cluster by crafting
    // expensive queries.
    query: {
      match: { field: req.body.text },
    },
  },
  {
    headers: {
      Authorization: `ApiKey ${token}`,
    },
  }
);<p>Dieser Endpunkt befindet sich im Ordner /api und wird serverseitig ausgeführt, sodass der Client nur über den Parameter „text“ verfügt, der dem Suchbegriff entspricht.</p><p>Die Konsequenz aus der Verwendung von Function-as-a-Service ist, dass Funktionen, im Gegensatz zu einem Server, der rund um die Uhr läuft, nur die Maschine starten, auf der die Funktion ausgeführt wird, und dass die Maschine nach Beendigung der Funktion in den Ruhemodus wechselt, um weniger Ressourcen zu verbrauchen.</p><p>Diese Konfiguration kann praktisch sein, wenn die Anwendung nicht zu viele Anfragen erhält; andernfalls können die Kosten hoch sein. Sie müssen auch den <a href="https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtime-environment.html">Lebenszyklus der Funktionen</a> und die Laufzeiten berücksichtigen (die in manchen Fällen nur Sekunden betragen können).</p><h2>Fazit</h2><p>In diesem Artikel haben wir gelernt, wie man mit Fehlern umgeht, was in Produktionsumgebungen von entscheidender Bedeutung ist. Wir haben auch das Testen unserer Anwendung unter Verwendung von Mocking für den Elasticsearch-Dienst behandelt. Dies ermöglicht zuverlässige Tests unabhängig vom Zustand des Clusters und erlaubt es uns, uns auf unseren Code zu konzentrieren.</p><p>Zum Schluss demonstrierten wir, wie man einen vollständig serverlosen Stack einrichtet, indem man sowohl Elastic Cloud Serverless als auch eine Vercel-Anwendung bereitstellt.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii</guid>
    <category><![CDATA[Javascript]]></category>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Jeffrey Rengifo]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc58be329ffebcd60/6a17043e47d49c0bc62d88ab/70fb0ff949f6db9ac9b8a28ecb4329ab915ebf46-720x420.png" length="0" type="image/png"/>
    <pubDate>Mon, 19 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Wie man den Speicherplatz und die Nutzung von Elasticsearch optimiert]]></title>
    <description><![CDATA[Lernen Sie, wie Sie Fälle vermeiden und behandeln können, in denen die Elasticsearch-Festplatte zu voll ist (Überauslastung) und in denen die Festplattenkapazität nicht ausgelastet ist, um die Clusterkosten zu optimieren.]]></description>
    <content:encoded><![CDATA[<p>Die Verwaltung von Datenträgern ist in jeder Datenbank wichtig, und Elasticsearch bildet da keine Ausnahme. Wenn nicht genügend Speicherplatz zur Verfügung steht, stellt Elasticsearch die Zuweisung von Shards an den Knoten ein. Dies wird Sie letztendlich daran hindern, Daten in den Cluster zu schreiben, wodurch das Risiko eines Datenverlusts in Ihrer Anwendung entsteht. Wenn Sie hingegen zu viel Speicherplatz haben, bezahlen Sie für mehr Ressourcen, als Sie benötigen.</p><h2>Hintergrundinformationen zu Wasserzeichen</h2><p>In Ihrem Elasticsearch-Cluster gibt es verschiedene „Wasserzeichen“-Schwellenwerte, die Ihnen helfen, den verfügbaren Speicherplatz zu überwachen. Wenn der Speicherplatz auf einem Knoten fast aufgebraucht ist, wird als erstes der Schwellenwert „niedriger Speicherplatz“ überschritten. Der zweite Schwellenwert wird dann der „hohe Festplatten-Wasserzeichen-Schwellenwert“ sein. Schließlich wird das Stadium der „Scheibenflutung“ erreicht. Sobald dieser Schwellenwert überschritten ist, blockiert der Cluster das Schreiben in ALLE Indizes, die einen Shard (primär oder Replikat) auf dem Knoten haben, der den Schwellenwert überschritten hat. Lesevorgänge (Suchanfragen) bleiben weiterhin möglich.</p><h2>Wie man Fälle von zu voller Festplatte (Überauslastung) verhindert und damit umgeht</h2><p>Es gibt verschiedene Methoden, um mit Fällen umzugehen, in denen Ihre Elasticsearch-Festplatte zu voll ist:</p><ol><li><p><strong>Alte Daten</strong> <strong>löschen</strong> : Daten sollten in der Regel nicht unbegrenzt aufbewahrt werden. Eine Möglichkeit, einer zu vollen Festplatte vorzubeugen und das Problem zu lösen, besteht darin, sicherzustellen, dass Daten, sobald sie ein bestimmtes Alter erreichen, zuverlässig archiviert und gelöscht werden. Eine Möglichkeit hierfür ist die Verwendung <a href="https://www.elastic.co/docs/manage-data/lifecycle/index-lifecycle-management">von ILM</a>.</p></li><li><p><strong>Speicherkapazität hinzufügen:</strong> Wenn Sie die Daten nicht löschen können, sollten Sie möglicherweise weitere Datenknoten hinzufügen oder die Festplattengrößen erhöhen, um alle Daten zu erhalten, ohne die Leistung negativ zu beeinflussen. Wenn Sie die Speicherkapazität des Clusters erhöhen müssen, sollten Sie überlegen, ob Sie nur die Speicherkapazität allein oder auch RAM- und CPU-Ressourcen im entsprechenden Verhältnis hinzufügen müssen (siehe Abschnitt zum <a href="https://www.elastic.co/search-labs/blog/optimize-elasticsearch-disk-space-and-usage#the-relationship-between-disk-size,-ram-and-cpu">Verhältnis von Festplattengröße, RAM und CPU</a> weiter unten).</p></li></ol><h2>So fügen Sie Ihrem Elasticsearch-Cluster Speicherkapazität hinzu</h2><ol><li><p><strong>Erhöhen Sie die Anzahl der Datenknoten: </strong>Denken Sie daran, dass die neuen Knoten die gleiche Größe wie die vorhandenen Knoten und die gleiche Elasticsearch-Version haben sollten.</p></li><li><p><strong>Vergrößerung der vorhandenen Knoten: </strong>In Cloud-basierten Umgebungen ist es in der Regel einfach, die Festplattengröße und den Arbeitsspeicher/die CPU auf vorhandenen Knoten zu erhöhen.</p></li><li><p><strong>Erhöhen Sie nur die Festplattengröße: </strong>In Cloud-basierten Umgebungen ist es oft relativ einfach, die Festplattengröße zu erhöhen.</p></li><li><p><a href="https://www.elastic.co/docs/deploy-manage/tools/snapshot-and-restore"><strong>Schnappschuss</strong></a><a href="https://www.elastic.co/docs/deploy-manage/tools/snapshot-and-restore"> </a><a href="https://www.elastic.co/docs/deploy-manage/tools/snapshot-and-restore"><strong>Und</strong></a><a href="https://www.elastic.co/docs/deploy-manage/tools/snapshot-and-restore"> </a><a href="https://www.elastic.co/docs/deploy-manage/tools/snapshot-and-restore"><strong>Wiederherstellung</strong></a><strong>:</strong> Wenn Sie es zulassen, dass alte Daten auf Anfrage in einem automatisierten Prozess aus Backups wiederhergestellt werden, können Sie alte Indizes als Snapshots speichern, diese löschen und die Daten auf Anfrage temporär aus den Snapshots wiederherstellen. </p></li><li><p><strong>Reduzierung der Replikate pro Shard:</strong> Eine weitere Möglichkeit zur Datenreduzierung besteht darin, die Anzahl der Replikate jedes Shards zu verringern. Für eine hohe Verfügbarkeit ist es wünschenswert, pro Shard eine Replik zu haben. Wenn die Daten jedoch älter werden, kann man unter Umständen auch ohne Replikate arbeiten. Das funktioniert in der Regel, wenn die Daten persistent sind oder Sie über eine Datensicherung verfügen, die Sie bei Bedarf wiederherstellen können.</p></li><li><p><strong>Benachrichtigungen erstellen:</strong> Um zu verhindern, dass die Festplatte in Zukunft voll wird und um proaktiv handeln zu können, sollten Sie Benachrichtigungen auf Basis der Festplattennutzung erstellen, die Sie benachrichtigen, wenn die Festplatte sich zu füllen beginnt. </p></li></ol><h2>Wie man Fälle von unzureichender Festplattenauslastung verhindert und behandelt</h2><p>Wenn Ihre Festplattenkapazität nicht voll ausgelastet ist, gibt es verschiedene Möglichkeiten, das Speichervolumen in Ihrem Cluster zu reduzieren.</p><h3>Wie man das Speichervolumen eines Elasticsearch-Clusters reduziert</h3><p>Es gibt verschiedene Methoden, um das Speichervolumen eines Clusters zu reduzieren.</p><p><strong>1. Die Anzahl der Datenknoten reduzieren</strong></p><p>Wenn Sie den Datenspeicherbedarf reduzieren und gleichzeitig RAM- und CPU-Ressourcen im gleichen Verhältnis einsparen möchten, dann ist dies die einfachste Strategie. Die Stilllegung nicht benötigter Knotenpunkte dürfte die größten Kosteneinsparungen ermöglichen.</p><p>Vor der Außerbetriebnahme des Knotens sollten Sie Folgendes beachten:</p><ul><li><p>Stellen Sie sicher, dass der außer Betrieb zu nehmende Knoten nicht als MASTER-Knoten benötigt wird. Sie sollten immer mindestens drei Knoten mit der MASTER-Knotenrolle haben.</p></li><li><p>Die Datenfragmente müssen von dem außer Betrieb zu nehmenden Knoten migriert werden.</p></li></ul><p><strong>2. Ersetzen Sie die vorhandenen Knoten durch kleinere Knoten.</strong></p><p>Wenn Sie die Anzahl der Knoten nicht weiter reduzieren können (normalerweise wären 3 die Mindestkonfiguration), dann sollten Sie die vorhandenen Knoten verkleinern. Denken Sie daran, dass es ratsam ist, sicherzustellen, dass alle Datenknoten über den gleichen Arbeitsspeicher und die gleiche Festplattengröße verfügen, da der Shard-Ausgleich auf der Grundlage der Anzahl der Shards pro Knoten erfolgt.</p><p>Der Ablauf wäre wie folgt:</p><ul><li><p>Fügen Sie dem Cluster neue, kleinere Knoten hinzu.</p></li><li><p>Die Shards von den außer Betrieb zu nehmenden Knoten migrieren</p></li><li><p>Schalten Sie die alten Knoten ab.</p></li></ul><p><strong>3. Verringern Sie die Festplattengröße auf den Knoten.</strong></p><p>Wenn Sie NUR die Festplattengröße auf den Knoten reduzieren möchten, ohne den gesamten RAM oder die CPU des Clusters zu verändern, dann können Sie die Festplattengröße für jeden Knoten reduzieren. Die Reduzierung der Festplattengröße auf einem Elasticsearch-Knoten ist kein trivialer Prozess.</p><p>Am einfachsten ginge das in der Regel so:</p><ul><li><p>Shards vom Knoten migrieren</p></li><li><p>Stoppe den Knoten</p></li><li><p>Hängen Sie ein neues Datenvolume mit geeigneter Größe an den Knoten an.</p></li><li><p>Kopieren Sie alle Daten vom alten Datenträger auf den neuen Datenträger.</p></li><li><p>Altes Volume A abtrennen</p></li><li><p>Startknoten und Shards zurück zum Knoten migrieren</p></li></ul><p>Dies setzt voraus, dass auf den anderen Knoten ausreichend Kapazität vorhanden ist, um die zusätzlichen Shards des Knotens während dieses Prozesses vorübergehend zu speichern. In vielen Fällen können die Kosten für die Verwaltung dieses Prozesses die potenziellen Einsparungen bei der Festplattennutzung übersteigen. Aus diesem Grund ist es unter Umständen einfacher, den Knoten komplett durch einen neuen Knoten mit der gewünschten Festplattengröße zu ersetzen (siehe oben „Ersetzen vorhandener Knoten durch kleinere Knoten“).</p><p>Wenn man für unnötige Ressourcen bezahlt, können die Kosten offensichtlich durch eine Optimierung der Ressourcennutzung reduziert werden.</p><h2>Das Verhältnis zwischen Festplattengröße, RAM und CPU</h2><p>Das ideale Verhältnis von Festplattenkapazität zu Arbeitsspeicher in Ihrem Cluster hängt von Ihrem jeweiligen Anwendungsfall ab. Aus diesem Grund sollten Sie bei der Überlegung von Änderungen Ihrer Speicherkapazität auch berücksichtigen, ob Ihre aktuellen Verhältnisse von Festplatte, Arbeitsspeicher und CPU angemessen ausbalanciert sind und ob Sie infolgedessen auch Arbeitsspeicher und CPU im gleichen Verhältnis hinzufügen oder reduzieren müssen.</p><p>Der Bedarf an RAM und CPU hängt vom Umfang der <a href="https://opster.com/guides/elasticsearch/glossary/elasticsearch-indexing/">Indizierungsaktivität</a> , der Anzahl und Art der Abfragen sowie der Menge der zu durchsuchenden und zu aggregierenden Daten ab. Dies steht oft im Verhältnis zur Menge der auf dem Cluster gespeicherten Daten und sollte daher auch mit der Festplattengröße in Zusammenhang stehen.</p><p>Das Verhältnis zwischen Festplattenkapazität und Arbeitsspeicher kann je nach Anwendungsfall variieren. Hier einige Beispiele:</p><p></p><p>Indexaktivität</p><p>Aufbewahrung</p><p>Suchaktivität</p><p>Festplattenkapazität</p><p>RAM</p><p>Unternehmenssuch-App</p><p>Mäßige Holzaufnahme</p><p>Lang</p><p>Licht</p><p>2 TB</p><p>32 GB</p><p>App-Überwachung</p><p>Intensive Holzverarbeitung</p><p>Kurz</p><p>Licht</p><p>1 TB</p><p>32 GB</p><p>E-Commerce</p><p>Light-Datenindexierung</p><p>Unbestimmt</p><p>Schwer</p><p>500 GB</p><p>32 GB</p><p><em>Denken Sie daran, dass Änderungen an der Konfiguration von Node-Maschinen mit Vorsicht vorgenommen werden müssen, da dies zu Ausfallzeiten der Nodes führen kann und Sie sicherstellen müssen, dass Shards nicht auf Ihre anderen, bereits überlasteten Nodes migriert werden.</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/optimize-elasticsearch-disk-space-and-usage</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/optimize-elasticsearch-disk-space-and-usage</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <pubDate>Fri, 16 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Elasticsearch in JavaScript richtig anwenden, Teil 1]]></title>
    <description><![CDATA[Hier wird erklärt, wie man ein produktionsreifes Elasticsearch-Backend in JavaScript erstellt.  

Erkunden Sie, wie Sie Elasticsearch mit JavaScript verwenden, um einen Server mit verschiedenen Such-Endpunkten zu erstellen, der Elasticsearch-Dokumente gemäß den Best Practices für Client/Server abfragt.]]></description>
    <content:encoded><![CDATA[<p>Dies ist der erste Artikel einer Reihe, die die Verwendung von Elasticsearch mit JavaScript behandelt. In dieser Reihe lernen Sie die Grundlagen der Verwendung von Elasticsearch in einer JavaScript-Umgebung kennen und erhalten einen Überblick über die wichtigsten Funktionen und Best Practices zur Erstellung einer Such-App. Am Ende dieses Kurses werden Sie alles wissen, was Sie benötigen, um Elasticsearch mit JavaScript auszuführen.</p><p>In diesem ersten Teil werden wir Folgendes besprechen:</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#environment">Umfeld</a></p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#frontend,-backend,-or-serverless?">Frontend, Backend oder serverlos?</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#connecting-the-client">Verbindung des Clients</a></p></li></ul></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#indexing-documents">Dokumente indizieren</a></p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#elasticsearch-client">Elasticsearch-Client</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#semantic-mappings">Semantische Zuordnungen</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#bulk-helper">Schüttguthelfer</a></p></li></ul></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#searching-data">Datensuche</a></p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#lexical-query-(/search/lexic?q=%3Cquery-term%3E)">Lexikalische Abfrage</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#semantic-query-(/search/semantic?q=%3Cquery-term%3E)">Semantische Anfrage</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#hybrid-query-(/search/hybrid?q=%3Cquery-term%3E)">Hybridabfrage</a></p></li></ul></li></ul><p><em>Den Quellcode mit den Beispielen finden Sie </em><a href="https://github.com/Delacrobix/JS-client-best-practices_article"><em><strong>hier</strong></em></a><em><strong>.</strong></em></p><h3>Was ist der Elasticsearch Node.js-Client?</h3><p>Der <a href="https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/index.html">Elasticsearch Node.js-Client</a> ist eine JavaScript-Bibliothek, die die HTTP-REST-Aufrufe der Elasticsearch-API in JavaScript umsetzt. Dadurch wird die Handhabung einfacher und es stehen Hilfsfunktionen zur Verfügung, die Aufgaben wie das Indizieren von Dokumenten in Stapeln vereinfachen.</p><h2>Umfeld</h2><h3>Frontend, Backend oder serverlos?</h3><p>Um unsere Such-App mit dem JavaScript-Client zu erstellen, benötigen wir mindestens zwei Komponenten: einen Elasticsearch-Cluster und eine JavaScript-Laufzeitumgebung zum Ausführen des Clients.</p><p>Der JavaScript-Client unterstützt alle Elasticsearch-Lösungen (Cloud, On-Premise und Serverless), und es gibt keine wesentlichen Unterschiede zwischen ihnen, da der Client alle Varianten intern handhabt, sodass Sie sich keine Gedanken darüber machen müssen, welche Sie verwenden sollen.</p><p>Die JavaScript-Laufzeitumgebung muss jedoch vom <strong>Server</strong> und <strong>nicht direkt vom Browser ausgeführt werden.</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd3ec469c83e3a71a/6a17e3d5445de91da44d00b6/92ce6cfd923c8008fa44f617a58193642d9d5879-661x410.png" alt="Elasticsearch in einer JavaScript-Umgebung." /><p>Dies liegt daran, dass beim Aufruf von Elasticsearch über den Browser sensible Informationen wie der Cluster-API-Schlüssel, der Host oder die Abfrage selbst abgerufen werden können. Elasticsearch empfiehlt, <strong>den Cluster niemals direkt dem Internet auszusetzen </strong>und stattdessen eine Zwischenschicht zu verwenden, die all diese Informationen abstrahiert, sodass der Benutzer nur die Parameter sehen kann. <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/es-security-principles.html#security-protect-cluster-traffic">Hier</a> können Sie mehr zu diesem Thema lesen.</p><p>Wir schlagen vor, folgendes Schema zu verwenden:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4d7f215f2e70230a/6a17e3d6fbc5f83de6491a13/a08769f08ec73fe57bf2e961cfdfbb1cdd57919d-972x429.png" alt="Den Elasticsearch Node.js-Client einrichten." /><p>In diesem Fall sendet der Client lediglich die Suchbegriffe und einen Authentifizierungsschlüssel an Ihren Server, während Ihr Server die vollständige Kontrolle über die Abfrage und die Kommunikation mit Elasticsearch behält.</p><h3>Verbindung des Clients</h3><p>Erstellen Sie zunächst einen API-Schlüssel gemäß <a href="https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud">diesen Schritten</a>.</p><p>Im Anschluss an das vorherige Beispiel erstellen wir einen einfachen Express-Server und stellen über einen Client von einem Node.JS-Server aus eine Verbindung zu diesem her.</p><p>Wir werden das Projekt mit NPM initialisieren und den Elasticsearch-Client sowie <a href="https://expressjs.com/">Express installieren.</a> Letzteres ist eine Bibliothek zum Starten von Servern in Node.js. Mit Express können wir über HTTP mit unserem Backend interagieren.</p><p>Lasst uns das Projekt initialisieren:</p><p><code>npm init -y</code></p><p>Abhängigkeiten installieren:</p><p><code>npm install @elastic/elasticsearch express split2 dotenv</code></p><p>Ich erkläre es Ihnen genauer:</p><ul><li><p><a href="https://www.npmjs.com/package/@elastic/elasticsearch"><em><strong>@elastic/elasticsearch</strong></em></a>: Es handelt sich um den offiziellen Node.js-Client.</p></li><li><p><a href="https://www.npmjs.com/package/express"><em><strong>Express</strong></em></a>: Damit können wir einen schlanken Node.js-Server starten, um Elasticsearch bereitzustellen.</p></li><li><p><a href="https://www.npmjs.com/package/split2"><em><strong>split2</strong></em></a>: Teilt Textzeilen in einen Datenstrom auf. Nützlich, um unsere ndjson-Dateien zeilenweise zu verarbeiten.</p></li><li><p><a href="https://www.npmjs.com/package/dotenv"><em><strong>dotenv</strong></em></a>: Ermöglicht die Verwaltung von Umgebungsvariablen mithilfe einer .env-Datei. Datei</p></li></ul><p>Erstelle eine .env-Datei Fügen Sie in der Datei im Stammverzeichnis des Projekts die folgenden Zeilen hinzu:</p>ELASTICSEARCH_ENDPOINT="Your Elasticsearch endpoint"
ELASTICSEARCH_API_KEY="Your Elasticssearch API"<p>Auf diese Weise können wir diese Variablen mithilfe des Pakets <code>dotenv</code> importieren.</p><p>Erstelle eine <code>server.js</code> -Datei:</p>const express = require("express");
const bodyParser = require("body-parser");
const { Client } = require("@elastic/elasticsearch");
 
require("dotenv").config(); //environment variables setup

const ELASTICSEARCH_ENDPOINT = process.env.ELASTICSEARCH_ENDPOINT;
const ELASTICSEARCH_API_KEY = process.env.ELASTICSEARCH_API_KEY;
const PORT = 3000;


const app = express();

app.listen(PORT, () =&gt; {
  console.log("Server running on port", PORT);
});
app.use(bodyParser.json());


let esClient = new Client({
  node: ELASTICSEARCH_ENDPOINT,
  auth: { apiKey: ELASTICSEARCH_API_KEY },  
});

app.get("/ping", async (req, res) =&gt; {
  try {
    const result = await esClient.info();

    res.status(200).json({
      success: true,
      clusterInfo: result,
    });
  } catch (error) {
    console.error("Error getting Elasticsearch info:", error);

    res.status(500).json({
      success: false,
      clusterInfo: null,
      error: error.message,
    });
  }
});<p>Dieser Code richtet einen einfachen Express.js-Server ein, der auf Port 3000 lauscht und sich über einen API-Schlüssel zur Authentifizierung mit einem Elasticsearch-Cluster verbindet. Es beinhaltet einen /ping-Endpunkt, der bei einem GET-Aufruf mithilfe der <code>.info()</code> -Methode des Elasticsearch-Clients grundlegende Informationen vom Elasticsearch-Cluster abfragt. </p><p>Bei erfolgreicher Abfrage werden die Clusterinformationen im JSON-Format zurückgegeben; andernfalls wird eine Fehlermeldung zurückgegeben. Der Server verwendet außerdem die Middleware body-parser, um JSON-Anfragetexte zu verarbeiten.</p><p>Führen Sie die Datei aus, um den Server zu starten:</p><p><code>node server.js</code></p><p>Die Antwort sollte folgendermaßen aussehen:</p>Server running on port 3000<p>Und nun konsultieren wir den Endpunkt <code>/ping</code> , um den Status unseres Elasticsearch-Clusters zu überprüfen.</p>curl http://localhost:3000/ping
{
    "success": true,
    "clusterInfo": {
        "name": "instance-0000000000",
        "cluster_name": "61b7e19eec204d59855f5e019acd2689",
        "cluster_uuid": "BIfvfLM0RJWRK_bDCY5ldg",
        "version": {
            "number": "9.0.0",
            "build_flavor": "default",
            "build_type": "docker",
            "build_hash": "112859b85d50de2a7e63f73c8fc70b99eea24291",
            "build_date": "2025-04-08T15:13:46.049795831Z",
            "build_snapshot": false,
            "lucene_version": "10.1.0",
            "minimum_wire_compatibility_version": "8.18.0",
            "minimum_index_compatibility_version": "8.0.0"
        },
        "tagline": "You Know, for Search"
    }
}<h2>Dokumente indizieren</h2><p>Sobald die Verbindung hergestellt ist, können wir Dokumente mithilfe von Zuordnungen wie <a href="https://www.elastic.co/search-labs/blog/semantic-search-simplified-semantic-text">semantic_text</a> für die semantische Suche und text für Volltextabfragen indizieren. Mit diesen beiden Feldtypen können wir auch <a href="https://www.elastic.co/what-is/hybrid-search">eine hybride Suche</a> durchführen.</p><p>Wir erstellen eine neue <code>load.js</code> -Datei, um die Zuordnungen zu generieren und die Dokumente hochzuladen.</p><h3>Elasticsearch-Client</h3><p>Zuerst müssen wir den Client instanziieren und authentifizieren:</p>const { Client } = require("@elastic/elasticsearch");

const ELASTICSEARCH_ENDPOINT = "cluster/project_endpoint";
const ELASTICSEARCH_API_KEY = "apiKey";

const esClient = new Client({
  node: ELASTICSEARCH_ENDPOINT,
  auth: { apiKey: ELASTICSEARCH_API_KEY },
});<h3>Semantische Zuordnungen</h3><p>Wir erstellen einen Index mit Daten über Tierkliniken. Wir speichern die Informationen über den Besitzer, das Haustier und die Details des Besuchs.</p><p>Die Daten, in denen wir eine Volltextsuche durchführen möchten, wie zum Beispiel Namen und Beschreibungen, werden als Text gespeichert. Die Daten aus Kategorien, wie zum Beispiel die Tierart oder -rasse, werden als Schlüsselwörter gespeichert.</p><p>Zusätzlich kopieren wir die Werte aller Felder in ein semantisches Textfeld, um auch mit diesen Informationen eine semantische Suche durchführen zu können.</p>const INDEX_NAME = "vet-visits";

const createMappings = async (indexName, mapping) =&gt; {
  try {
    const body = await esClient.indices.create({
      index: indexName,
      body: {
        mappings: mapping,
      },
    });

    console.log("Index created successfully:", body);
  } catch (error) {
    console.error("Error creating mapping:", error);
  }
};

await createMappings(INDEX_NAME, {
  properties: {
    owner_name: {
      type: "text",
      copy_to: "semantic_field",
    },
    pet_name: {
      type: "text",
      copy_to: "semantic_field",
    },
    species: {
      type: "keyword",
      copy_to: "semantic_field",
    },
    breed: {
      type: "keyword",
      copy_to: "semantic_field",
    },
    vaccination_history: {
      type: "keyword",
      copy_to: "semantic_field",
    },
    visit_details: {
      type: "text",
      copy_to: "semantic_field",
    },
    semantic_field: {
      type: "semantic_text",
    },
  },
});<h3>Schüttguthelfer</h3><p>Ein weiterer Vorteil des Clients besteht darin, dass wir den <a href="https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/client-helpers.html#bulk-helper">Bulk-Helper</a> verwenden können, um die Indizierung in Batches durchzuführen. Der Bulk-Helper ermöglicht es uns, Dinge wie Parallelverarbeitung, Wiederholungsversuche und die Behandlung jedes Dokuments, das die Funktion durchläuft und erfolgreich oder fehlschlägt, einfach zu handhaben.</p><p>Ein attraktives Merkmal dieses Helfers ist, dass man mit Datenströmen arbeiten kann. Mit dieser Funktion können Sie eine Datei zeilenweise senden, anstatt die gesamte Datei im Speicher zu speichern und sie dann auf einmal an Elasticsearch zu senden.</p><p>Um die Daten in Elasticsearch hochzuladen, erstellen Sie eine Datei namens data.ndjson im Stammverzeichnis des Projekts und fügen Sie die folgenden Informationen hinzu (alternativ können Sie die Datei mit dem Datensatz <a href="https://github.com/Delacrobix/JS-client-best-practices_article/blob/main/data.ndjson">hier</a> herunterladen):</p>{"owner_name":"Alice Johnson","pet_name":"Buddy","species":"Dog","breed":"Golden Retriever","vaccination_history":["Rabies","Parvovirus","Distemper"],"visit_details":"Annual check-up and nail trimming. Healthy and active."}
{"owner_name":"Marco Rivera","pet_name":"Milo","species":"Cat","breed":"Siamese","vaccination_history":["Rabies","Feline Leukemia"],"visit_details":"Slight eye irritation, prescribed eye drops."}
{"owner_name":"Sandra Lee","pet_name":"Pickles","species":"Guinea Pig","breed":"Mixed","vaccination_history":[],"visit_details":"Loss of appetite, recommended dietary changes."}
{"owner_name":"Jake Thompson","pet_name":"Luna","species":"Dog","breed":"Labrador Mix","vaccination_history":["Rabies","Bordetella"],"visit_details":"Mild ear infection, cleaning and antibiotics given."}
{"owner_name":"Emily Chen","pet_name":"Ziggy","species":"Cat","breed":"Mixed","vaccination_history":["Rabies","Feline Calicivirus"],"visit_details":"Vaccination update and routine physical."}
{"owner_name":"Tomás Herrera","pet_name":"Rex","species":"Dog","breed":"German Shepherd","vaccination_history":["Rabies","Parvovirus","Leptospirosis"],"visit_details":"Follow-up for previous leg strain, improving well."}
{"owner_name":"Nina Park","pet_name":"Coco","species":"Ferret","breed":"Mixed","vaccination_history":["Rabies"],"visit_details":"Slight weight loss; advised new diet."}
{"owner_name":"Leo Martínez","pet_name":"Simba","species":"Cat","breed":"Maine Coon","vaccination_history":["Rabies","Feline Panleukopenia"],"visit_details":"Dental cleaning. Minor tartar buildup removed."}
{"owner_name":"Rachel Green","pet_name":"Rocky","species":"Dog","breed":"Bulldog Mix","vaccination_history":["Rabies","Parvovirus"],"visit_details":"Skin rash, antihistamines prescribed."}
{"owner_name":"Daniel Kim","pet_name":"Mochi","species":"Rabbit","breed":"Mixed","vaccination_history":[],"visit_details":"Nail trimming and general health check. No issues."}<p>Wir verwenden split2, um die Dateizeilen zu streamen, während der Bulk-Helper sie an Elasticsearch sendet.</p>const { createReadStream } = require("fs");
const split = require("split2");
 
const indexData = async (filePath, indexName) =&gt; {
  try {
    console.log(`Indexing data from ${filePath} into ${indexName}...`);

    const result = await esClient.helpers.bulk({
      datasource: createReadStream(filePath).pipe(split()),

      onDocument: () =&gt; {
        return {
          index: { _index: indexName },
        };
      },
      onDrop(doc) {
        console.error("Error processing document:", doc);
      },
    });

    console.log("Bulk indexing successful elements:", result.items.length);
  } catch (error) {
    console.error("Error indexing data:", error);
    throw error;
  }
};

await indexData("./data.ndjson", INDEX_NAME);<p>Der obige Code liest eine .ndjson-Datei. Mit der Methode <code>helpers.bulk</code> werden alle JSON-Objekte zeilenweise und in einem Massenindex in einen angegebenen Elasticsearch-Index indiziert. Es streamt die Datei mit <code>createReadStream</code> und <code>split2</code>, richtet Indexierungsmetadaten für jedes Dokument ein und protokolliert alle Dokumente, deren Verarbeitung fehlschlägt. Nach Abschluss des Vorgangs wird die Anzahl der erfolgreich indizierten Elemente protokolliert.</p><p>Alternativ zur <code>indexData</code> -Funktion können Sie die Datei auch direkt über die Benutzeroberfläche von Kibana hochladen und dabei die <a href="https://www.elastic.co/docs/manage-data/ingest/upload-data-files">Funktion „Datendateien hochladen“ verwenden.</a></p><p>Wir führen die Datei aus, um die Dokumente in unseren Elasticsearch-Cluster hochzuladen.</p><p><code>node load.js</code></p>Creating mappings for index vet-visits...
Index created successfully: { acknowledged: true, shards_acknowledged: true, index: 'vet-visits' }
Indexing data from ./data.ndjson into vet-visits...
Bulk indexing completed. Total documents: 10, Failed: 0<h2>Datensuche in Elasticsearch</h2><p>Wir kehren zu unserer <code>server.js</code> -Datei zurück und erstellen verschiedene Endpunkte, um lexikalische, semantische oder hybride Suchen durchzuführen.</p><p>Kurz gesagt, schließen sich diese Sucharten nicht gegenseitig aus, sondern hängen von der Art der Frage ab, die Sie beantworten möchten.</p><p>Abfragetyp</p><p>Anwendungsfall</p><p>Beispielaufgabe</p><p>Lexikalische Abfrage</p><p>Die in der Frage vorkommenden Wörter oder Wortstämme tauchen wahrscheinlich in den Indexdokumenten auf. Tokenische Ähnlichkeit zwischen Frage und Dokumenten.</p><p>Ich suche ein blaues Sport-T-Shirt.</p><p>Semantische Anfrage</p><p>Die in der Frage enthaltenen Wörter werden in den Dokumenten wahrscheinlich nicht vorkommen. Konzeptionelle Ähnlichkeit zwischen Frage und Dokumenten.</p><p>Ich suche Kleidung für kaltes Wetter.</p><p>Hybrid Search</p><p>Die Frage enthält lexikalische und/oder semantische Komponenten. Token- und semantische Ähnlichkeit zwischen Frage und Dokumenten.</p><p>Ich suche ein Kleid in Größe S für eine Strandhochzeit.</p><p>Die <em><strong>lexikalischen </strong></em>Bestandteile der Frage sind wahrscheinlich Teil von Titeln und Beschreibungen oder Kategorienamen, während die <em><strong>semantischen </strong></em>Bestandteile Konzepte sind, die mit diesen Bereichen in Zusammenhang stehen. <em><strong>Blau</strong></em> wird wahrscheinlich ein Kategoriename oder Teil einer Beschreibung sein, <em><strong>Strandhochzeit</strong></em> hingegen eher nicht, kann aber semantisch mit Leinenkleidung in Verbindung gebracht werden.</p><h3>Lexikalische Abfrage (/search/lexic?q=)&lt;query_term&gt;</h3><p>Die lexikalische Suche, auch Volltextsuche genannt, bedeutet die Suche auf der Grundlage der Ähnlichkeit von Wörtern; das heißt, nach einer Analyse werden die Dokumente zurückgegeben, die die gesuchten Wörter enthalten.</p><p><a href="https://www.elastic.co/demo-gallery/lexical-search">Hier</a> finden Sie unser praktisches Tutorial zur lexikalischen Suche.</p>app.get("/search/lexic", async (req, res) =&gt; {
  const { q } = req.query;

  const INDEX_NAME = "vet-visits";

  try {
    const result = await esClient.search({
      index: INDEX_NAME,
      size: 5,
      body: {
        query: {
          multi_match: {
            query: q,
            fields: ["owner_name", "pet_name", "visit_details"],
          },
        },
      },
    });

    res.status(200).json({
      success: true,
      results: result.hits.hits
    });
  } catch (error) {
    console.error("Error performing search:", error);

    res.status(500).json({
      success: false,
      results: null,
      error: error.message,
    });
  }
});<p>Wir testen mit: <em><strong>Krallenschneiden</strong></em></p>curl http://localhost:3000/search/lexic?q=nail%20trimming<p>Antwort:</p>{
    "success": true,
    "results": [
        {
            "_index": "vet-visits",
            "_id": "-RY6RJYBLe2GoFQ6-9n9",
            "_score": 2.7075968,
            "_source": {
                "pet_name": "Mochi",
                "owner_name": "Daniel Kim",
                "species": "Rabbit",
                "visit_details": "Nail trimming and general health check. No issues.",
                "breed": "Mixed",
                "vaccination_history": []
            }
        },
        {
            "_index": "vet-visits",
            "_id": "8BY6RJYBLe2GoFQ6-9n9",
            "_score": 2.560356,
            "_source": {
                "pet_name": "Buddy",
                "owner_name": "Alice Johnson",
                "species": "Dog",
                "visit_details": "Annual check-up and nail trimming. Healthy and active.",
                "breed": "Golden Retriever",
                "vaccination_history": [
                    "Rabies",
                    "Parvovirus",
                    "Distemper"
                ]
            }
        }
    ]
}<h3>Semantische Abfrage (/search/semantic?q=)&lt;query_term&gt;</h3><p>Die semantische Suche findet, anders als die lexikalische Suche, Ergebnisse, die der Bedeutung der Suchbegriffe ähneln, durch Vektorsuche.</p><p><a href="https://www.elastic.co/demo-gallery/semantic-search">Hier</a> finden Sie unser praktisches Tutorial zur semantischen Suche.</p>app.get("/search/semantic", async (req, res) =&gt; {
  const { q } = req.query;

  const INDEX_NAME = "vet-visits";

  try {
    const result = await esClient.search({
      index: INDEX_NAME,
      size: 5,
      body: {
        query: {
          semantic: {
            field: "semantic_field",
            query: q
          },
        },
      },
    });

    res.status(200).json({
      success: true,
      results: result.hits.hits,
    });
  } catch (error) {
    console.error("Error performing search:", error);

    res.status(500).json({
      success: false,
      results: null,
      error: error.message,
    });
  }
});<p>Wir testen mit: <em><strong>Wer hat sich eine Pediküre machen lassen?</strong></em></p>curl http://localhost:3000/search/semantic?q=Who%20got%20a%20pedicure?<p>Antwort:</p>{
    "success": true,
    "results": [
        {
            "_index": "vet-visits",
            "_id": "-RY6RJYBLe2GoFQ6-9n9",
            "_score": 4.861466,
            "_source": {
                "owner_name": "Daniel Kim",
                "pet_name": "Mochi",
                "species": "Rabbit",
                "breed": "Mixed",
                "vaccination_history": [],
                "visit_details": "Nail trimming and general health check. No issues."
            }
        },
        {
            "_index": "vet-visits",
            "_id": "8BY6RJYBLe2GoFQ6-9n9",
            "_score": 4.7152824,
            "_source": {
                "pet_name": "Buddy",
                "owner_name": "Alice Johnson",
                "species": "Dog",
                "visit_details": "Annual check-up and nail trimming. Healthy and active.",
                "breed": "Golden Retriever",
                "vaccination_history": [
                    "Rabies",
                    "Parvovirus",
                    "Distemper"
                ]
            }
        },
        {
            "_index": "vet-visits",
            "_id": "9RY6RJYBLe2GoFQ6-9n9",
            "_score": 1.6717153,
            "_source": {
                "pet_name": "Rex",
                "owner_name": "Tomás Herrera",
                "species": "Dog",
                "visit_details": "Follow-up for previous leg strain, improving well.",
                "breed": "German Shepherd",
                "vaccination_history": [
                    "Rabies",
                    "Parvovirus",
                    "Leptospirosis"
                ]
            }
        },
        {
            "_index": "vet-visits",
            "_id": "9xY6RJYBLe2GoFQ6-9n9",
            "_score": 1.5600781,
            "_source": {
                "pet_name": "Simba",
                "owner_name": "Leo Martínez",
                "species": "Cat",
                "visit_details": "Dental cleaning. Minor tartar buildup removed.",
                "breed": "Maine Coon",
                "vaccination_history": [
                    "Rabies",
                    "Feline Panleukopenia"
                ]
            }
        },
        {
            "_index": "vet-visits",
            "_id": "-BY6RJYBLe2GoFQ6-9n9",
            "_score": 1.2696637,
            "_source": {
                "pet_name": "Rocky",
                "owner_name": "Rachel Green",
                "species": "Dog",
                "visit_details": "Skin rash, antihistamines prescribed.",
                "breed": "Bulldog Mix",
                "vaccination_history": [
                    "Rabies",
                    "Parvovirus"
                ]
            }
        }
    ]
}<h3>Hybrid-Suchanfrage (/search/hybrid?q=)&lt;query_term&gt;</h3><p>Die Hybridsuche ermöglicht es uns, semantische und lexikalische Suche zu kombinieren und so das Beste aus beiden Welten zu erhalten: Sie erhalten die Präzision der Token-Suche zusammen mit der Bedeutungsnähe der semantischen Suche.</p>app.get("/search/hybrid", async (req, res) =&gt; {
  const { q } = req.query;

  const INDEX_NAME = "vet-visits";

  try {
    const result = await esClient.search({
      index: INDEX_NAME,
      body: {
        retriever: {
          rrf: {
            retrievers: [
              {
                standard: {
                  query: {
                    bool: {
                      must: {
                         multi_match: {
             query: q,
            fields: ["owner_name", "pet_name", "visit_details"],
          },
                      },
                    },
                  },
                },
              },
              {
                standard: {
                  query: {
                    bool: {
                      must: {
                        semantic: {
                          field: "semantic_field",
                          query: q,
                        },
                      },
                    },
                  },
                },
              },
            ],
          },
        },
        size: 5,
      },
    });

    res.status(200).json({
      success: true,
      results: result.hits.hits,
    });
  } catch (error) {
    console.error("Error performing search:", error);

    res.status(500).json({
      success: false,
      results: null,
      error: error.message,
    });
  }
});<p>Wir testen mit der Frage: „ <em><strong>Wer hat sich eine Pediküre oder eine Zahnbehandlung gegönnt?“</strong></em></p>curl http://localhost:3000/search/hybrid?q=who%20got%20a%20pedicure%20or%20dental%20treatment<p>Abwehr:</p>{
    "success": true,
    "results": [
        {
            "_index": "vet-visits",
            "_id": "9xY6RJYBLe2GoFQ6-9n9",
            "_score": 0.032522473,
            "_source": {
                "pet_name": "Simba",
                "owner_name": "Leo Martínez",
                "species": "Cat",
                "visit_details": "Dental cleaning. Minor tartar buildup removed.",
                "breed": "Maine Coon",
                "vaccination_history": [
                    "Rabies",
                    "Feline Panleukopenia"
                ]
            }
        },
        {
            "_index": "vet-visits",
            "_id": "-RY6RJYBLe2GoFQ6-9n9",
            "_score": 0.016393442,
            "_source": {
                "pet_name": "Mochi",
                "owner_name": "Daniel Kim",
                "species": "Rabbit",
                "visit_details": "Nail trimming and general health check. No issues.",
                "breed": "Mixed",
                "vaccination_history": []
            }
        },
        {
            "_index": "vet-visits",
            "_id": "8BY6RJYBLe2GoFQ6-9n9",
            "_score": 0.015873017,
            "_source": {
                "pet_name": "Buddy",
                "owner_name": "Alice Johnson",
                "species": "Dog",
                "visit_details": "Annual check-up and nail trimming. Healthy and active.",
                "breed": "Golden Retriever",
                "vaccination_history": [
                    "Rabies",
                    "Parvovirus",
                    "Distemper"
                ]
            }
        },
        {
            "_index": "vet-visits",
            "_id": "9RY6RJYBLe2GoFQ6-9n9",
            "_score": 0.015625,
            "_source": {
                "pet_name": "Rex",
                "owner_name": "Tomás Herrera",
                "species": "Dog",
                "visit_details": "Follow-up for previous leg strain, improving well.",
                "breed": "German Shepherd",
                "vaccination_history": [
                    "Rabies",
                    "Parvovirus",
                    "Leptospirosis"
                ]
            }
        },
        {
            "_index": "vet-visits",
            "_id": "8xY6RJYBLe2GoFQ6-9n9",
            "_score": 0.015384615,
            "_source": {
                "pet_name": "Luna",
                "owner_name": "Jake Thompson",
                "species": "Dog",
                "visit_details": "Mild ear infection, cleaning and antibiotics given.",
                "breed": "Labrador Mix",
                "vaccination_history": [
                    "Rabies",
                    "Bordetella"
                ]
            }
        }
    ]
}<h2>Fazit</h2><p>Im ersten Teil unserer Serie haben wir erklärt, wie man die Umgebung einrichtet und einen Server mit verschiedenen Suchendpunkten erstellt, um die Elasticsearch-Dokumente gemäß den Best Practices für Client/Server abzufragen. Schauen Sie sich <a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i">den zweiten Teil</a> unserer Serie an, in dem Sie Best Practices für die Produktion kennenlernen und erfahren, wie Sie den Elasticsearch Node.js-Client in serverlosen Umgebungen ausführen.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i</guid>
    <category><![CDATA[Javascript]]></category>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Jeffrey Rengifo]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt16d00c8a548b32e8/6a17e3d8fbc5f8c740491a19/72200540ed258779d87e53a72ea189f8a138540c-1600x901.png" length="0" type="image/png"/>
    <pubDate>Thu, 15 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Wie konfiguriert man die Anzahl der Replikate in einem Elasticsearch-Index?]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie die number_of_replicas in einem Elasticsearch-Index konfigurieren, um die Suchleistung zu verbessern und eine Widerstandsfähigkeit gegen Node-Ausfälle zu gewährleisten. 
]]></description>
    <content:encoded><![CDATA[<p>Elasticsearch ist als verteiltes System konzipiert, das große Datenmengen verarbeiten und eine hohe Verfügbarkeit gewährleisten kann. Eine der wichtigsten Funktionen, die dies ermöglichen, ist das Konzept der Indexreplikation, das durch die Einstellung <code>number_of_replicas</code> gesteuert wird. Dieser Artikel befasst sich detailliert mit dieser Einstellung, ihren Auswirkungen und wie man sie richtig konfiguriert.</p><h2>Die Rolle von Replikaten in Elasticsearch</h2><p>In Elasticsearch ist ein Index eine Sammlung von Dokumenten, die auf mehrere primäre Shards verteilt sind. Jeder primäre Shard ist ein in sich geschlossener Apache Lucene-Index, und die Dokumente innerhalb eines Index werden auf alle primären Shards verteilt. Um eine hohe Verfügbarkeit und Datenredundanz zu gewährleisten, ermöglicht Elasticsearch, dass jeder Shard eine oder mehrere Kopien, sogenannte Replikate, besitzt.

Die Einstellung <code>number_of_replicas</code> steuert die Anzahl der Replikat-Shards (Kopien), die Elasticsearch für jeden primären Shard in einem Index erstellt. Standardmäßig erstellt Elasticsearch für jeden primären Shard eine Replik, dies kann jedoch je nach den Anforderungen Ihres Systems geändert werden.</p><h2>Konfigurieren der Anzahl der Replikate</h2><p>Die Einstellung <code>number_of_replicas</code> kann bei der Indexerstellung konfiguriert oder später aktualisiert werden. So können Sie dies bei der Indexerstellung festlegen:</p>PUT /my_index
{
  "settings": {
    "number_of_replicas": 2
  }
}<p>In diesem Beispiel erstellt Elasticsearch zwei Replikate für jeden primären Shard im Index <code>my_index</code> .</p><p>Um die <code>number_of_replicas</code> -Einstellung für einen bestehenden Index zu aktualisieren, können Sie die <code>_settings</code> -API verwenden:</p>PUT /my_index/_settings
{
  "number_of_replicas": 3
}<p>Dieser Befehl aktualisiert den Index <code>my_index</code> , sodass für jeden primären Shard drei Replikate vorhanden sind.</p><h2>Auswirkungen der Einstellung number_of_replicas</h2><p>Die Einstellung <code>number_of_replicas</code> hat einen erheblichen Einfluss auf die Leistungsfähigkeit und Stabilität Ihres Elasticsearch- <a href="https://opster.com/guides/elasticsearch/glossary/elasticsearch-cluster/">Clusters</a>. Hier einige wichtige Punkte, die Sie beachten sollten:</p><ol><li><p><strong>Datenredundanz und Verfügbarkeit:</strong> Durch die Erhöhung von <code>number_of_replicas</code> wird die Verfügbarkeit Ihrer Daten verbessert, indem mehr Kopien jedes Shards erstellt werden. Wenn ein Knoten ausfällt, kann Elasticsearch weiterhin Daten von den Replikat-Shards auf den verbleibenden <a href="https://opster.com/guides/elasticsearch/glossary/elasticsearch-node/">Knoten</a> bereitstellen.</p></li><li><p><strong>Suchleistung:</strong> Replikat-Shards können Leseanfragen bedienen, daher kann eine größere Anzahl von Replikaten die Suchleistung verbessern, indem die Last auf mehr Shards verteilt wird.</p></li><li><p><strong>Schreibperformance:</strong> Allerdings muss jeder Schreibvorgang auf jeder Kopie eines Shards durchgeführt werden. Daher kann ein höherer Wert <code>number_of_replicas</code> die <a href="https://opster.com/guides/elasticsearch/glossary/elasticsearch-indexing/">Indexierungsleistung</a> verlangsamen, da er die Anzahl der Operationen erhöht, die für jeden Schreibvorgang durchgeführt werden müssen.</p></li><li><p><strong>Speicherbedarf:</strong> Mehr Replikate bedeuten mehr Speicherplatz. Sie sollten sicherstellen, dass Ihr Cluster über genügend Kapazität verfügt, um die zusätzlichen Replikate zu speichern.</p></li><li><p><strong>Ausfallsicherheit bei Knoten:</strong> Der <code>number_of_replicas</code> sollte unter Berücksichtigung der Anzahl der Knoten in Ihrem Cluster festgelegt werden. Wenn <code>number_of_replicas</code> gleich oder größer als die Anzahl der Knoten ist, kann Ihr Cluster den Ausfall mehrerer Knoten ohne Datenverlust tolerieren.</p></li></ol><h2>Bewährte Vorgehensweisen zum Festlegen der Anzahl der Replikate</h2><p>Die optimale Einstellung <code>number_of_replicas</code> hängt von den spezifischen Anforderungen Ihres Systems ab. Hier sind jedoch einige allgemeine Best Practices:</p><ul><li><p>Bei einem Cluster mit nur einem Knoten sollte <code>number_of_replicas</code> auf 0 gesetzt werden, da keine weiteren Knoten vorhanden sind, die Replikate aufnehmen könnten.</p></li><li><p>Bei einem Multi-Node-Cluster sollte <code>number_of_replicas</code> mindestens auf 1 gesetzt werden, um Datenredundanz und hohe Verfügbarkeit zu gewährleisten.</p></li><li><p>Wenn die Suchleistung Priorität hat, sollten Sie die Anzahl der Einträge <code>number_of_replicas</code> erhöhen. Man sollte jedoch den Zielkonflikt zwischen Schreibleistung und Speicherbedarf berücksichtigen.</p></li><li><p>Stellen Sie stets sicher, dass Ihr Cluster über ausreichend Kapazität zur Speicherung der zusätzlichen Replikate verfügt.</p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-index-number-of_replicas</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-index-number-of_replicas</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd041e871a8935448/6a17de320b0bedf404dd34ab/23b96aaa1a38b1f4747b4a87695d816f24c0cf70-720x421.jpg" length="0" type="image/jpeg"/>
    <pubDate>Wed, 14 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Löschen eines Feldes aus einem Dokument in Elasticsearch]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie Felder aus Elasticsearch-Dokumenten mithilfe der Update-API, von Skripten oder durch Neuindizierung für einzelne und massenhafte Entfernungen löschen können.]]></description>
    <content:encoded><![CDATA[<p>In Elasticsearch ist das Löschen eines Feldes aus einem Dokument eine häufige Anforderung. Dies kann nützlich sein, wenn Sie unnötige oder veraltete Informationen aus Ihrem Index entfernen möchten. In diesem Artikel werden wir verschiedene Methoden zum Löschen eines Feldes aus einem Dokument in Elasticsearch besprechen und Beispiele sowie Schritt-für-Schritt-Anleitungen geben. </p><h2>Methode 1: Verwendung der Update-API</h2><p>Die <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/update-document">Update-API</a> ermöglicht es Ihnen, ein Dokument zu aktualisieren, indem Sie ein Skript bereitstellen, das die Quelle des Dokuments ändert. Mit dieser API können Sie ein Feld aus einem Dokument löschen, indem Sie das Feld auf Null setzen. Hier ist eine Schritt-für-Schritt-Anleitung dazu:</p><p>1. Ermitteln Sie den Index, den Dokumenttyp (falls Sie Elasticsearch 6.x oder eine ältere Version verwenden) und die Dokument-ID des Dokuments, das Sie aktualisieren möchten.</p><p>2. Verwenden Sie die Update-API mit einem Skript, das das Feld auf null setzt oder, noch besser, es aus dem Quelldokument entfernt. Das folgende Beispiel zeigt, wie das Feld „field_to_delete“ aus einem Dokument mit der ID „1“ im Index „my_index“ gelöscht wird:</p>POST /my_index/_update/1
{
  "script": "ctx._source.remove('field_to_delete')"
}<p>3. Führe die Anfrage aus. Im Erfolgsfall gibt Elasticsearch eine Antwort zurück, die anzeigt, dass das Dokument aktualisiert wurde.</p><p>Hinweis: Diese Methode entfernt das Feld nur aus dem angegebenen Dokument. Das Feld wird weiterhin in der Zuordnung und in anderen Dokumenten im Index vorhanden sein.</p><h2>Methode 2: Reindexierung mit einer modifizierten Quelle</h2><p>Wenn Sie ein Feld aus allen Dokumenten in einem Index löschen möchten, können Sie die <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-reindex">Reindex-API</a> verwenden, um einen neuen Index mit der modifizierten Quelle zu erstellen. So machen Sie das:</p><p>1. Erstellen Sie einen neuen Index mit den gleichen Einstellungen und Zuordnungen wie der ursprüngliche Index. Mit der Get Index API können Sie die Einstellungen und Zuordnungen des ursprünglichen Index abrufen.</p><p>2. Verwenden Sie die Reindex-API, um Dokumente vom ursprünglichen Index in den neuen Index zu kopieren und dabei das Feld aus der Quelle zu entfernen. Das folgende Beispiel zeigt, wie das Feld „field_to_delete“ aus allen Dokumenten im Index „my_index“ gelöscht wird:</p>POST /_reindex
{
  "source": {
    "index": "my_index"
  },
  "dest": {
    "index": "new_index"
  },
  "script": {
    "source": "ctx._source.remove('field_to_delete')"
  }
}<p>
3. Überprüfen Sie, ob der neue Index die korrekten Dokumente enthält, nachdem das Feld entfernt wurde.</p><p>4. Wenn alles in Ordnung ist, können Sie den ursprünglichen Index löschen und gegebenenfalls einen Alias für den neuen Index hinzufügen, der den Namen des ursprünglichen Index trägt.</p><h2>Methode 3: Aktualisierung des Mappings und der Neuindexierung</h2><p>Wenn Sie ein Feld aus der Zuordnung und alle Dokumente in einem Index löschen möchten, können Sie die Zuordnung aktualisieren und anschließend die Dokumente neu indizieren. So geht's:</p><p>1. Erstellen Sie einen neuen Index mit den gleichen Einstellungen wie der ursprüngliche Index.</p><p>2. Rufen Sie die Zuordnungen des ursprünglichen Index mithilfe der Get Mapping API ab.</p><p>3. Ändern Sie die Zuordnungen, indem Sie das Feld entfernen, das Sie löschen möchten.</p><p>4. Wenden Sie die geänderten Zuordnungen mithilfe der Put Mapping API auf den neuen Index an.</p><p>5. Verwenden Sie die Reindex-API, um Dokumente vom ursprünglichen Index in den neuen Index zu kopieren, wie in Methode 2 beschrieben.</p><p>6. Überprüfen Sie, ob der neue Index die korrekten Dokumente enthält, wobei das Feld entfernt wurde, und ob das Feld in der Zuordnung nicht vorhanden ist.</p><p>7. Wenn alles gut aussieht, können Sie den ursprünglichen Index löschen und gegebenenfalls einen Alias mit dem Namen des ursprünglichen Index zum neuen Index hinzufügen.</p><h2>Fazit</h2><p>In diesem Artikel haben wir drei Methoden zum Löschen eines Feldes aus einem Dokument in Elasticsearch besprochen: die Verwendung der Update-API, die Neuindizierung mit einer geänderten Quelle und die Aktualisierung des Mappings mit anschließender Neuindizierung. Jede Methode hat ihre eigenen Anwendungsfälle und Vor- und Nachteile. Wählen Sie daher diejenige, die am besten zu Ihren Anforderungen passt. Denken Sie immer daran, Ihre Änderungen zu testen und die Ergebnisse zu überprüfen, bevor Sie sie in Produktionsumgebungen anwenden.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-delete-field-from-document</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-delete-field-from-document</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8deb617c89943b69/6a17e26c4b055d209e43212f/89278eb7309b7f3018c61be2b514d1fd25b9564d-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Fri, 09 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[So verbinden Sie zwei Indizes in Elasticsearch]]></title>
    <description><![CDATA[Erläuterung der Verwendung der Begriffe Abfrage, Logstash Elasticsearch-Filter, Anreicherungsprozessor und ES|QL zum Verbinden zweier Indizes in Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>In Elasticsearch ist das Verbinden zweier Indizes nicht so einfach wie in herkömmlichen relationalen SQL-Datenbanken. Mit bestimmten Techniken und Funktionen von Elasticsearch können jedoch ähnliche Ergebnisse erzielt werden.</p><p>In der Vergangenheit haben viele Leute den<a href="https://www.elastic.co/de/docs/reference/elasticsearch/mapping-reference/nested"> Feldtyp</a> <a href="https://www.elastic.co/de/docs/reference/elasticsearch/mapping-reference/nested"><code>nested</code></a>als Mechanismus verwendet, um verschiedene Indizes miteinander zu verbinden. Allerdings war dies aufgrund teurer Abfragen und unvollständiger Unterstützung in Kibana, insbesondere bei Lens-Visualisierungen, eingeschränkt.</p><p>Dieser Artikel befasst sich eingehend mit dem Zusammenführen zweier Indizes in Elasticsearch und konzentriert sich dabei auf die folgenden Ansätze: </p><ol><li><p>Verwenden der <code>terms</code> -Abfrage</p></li><li><p>Verwenden des <code>enrich</code> -Prozessors in Aufnahmepipelines</p></li><li><p>Logstash <code>elasticsearch</code> Filter-Plugin</p></li><li><p>ES|QL <code>ENRICH</code></p></li><li><p>ES|QL <code>LOOKUP JOIN</code></p></li></ol><h2>Verwenden der Begriffsabfrage</h2><p>Die <a href="https://www.elastic.co/de/docs/reference/query-languages/query-dsl/query-dsl-terms-query">Termabfrage</a> ist eine der effektivsten Möglichkeiten, zwei Indizes in Elasticsearch zu verbinden. Mit dieser Abfrage können Sie Dokumente abrufen, die einen oder mehrere genaue Begriffe in einem bestimmten Feld enthalten. Hier besprechen wir, wie man es zum Verbinden zweier Indizes verwendet.</p><p>Zuerst müssen Sie die erforderlichen Daten aus dem ersten Index abrufen. Dies kann mithilfe einer einfachen GET-Anfrage und dem Abrufen der Werte aus dem Attribut <code>_source</code> erfolgen.</p># Simple GET request
GET first_index/_search<p>Sobald Sie die Daten aus dem ersten Index haben, können Sie diese zum Abfragen des zweiten Index verwenden. Dies geschieht mithilfe der <code>terms</code> -Abfrage, bei der Sie das Feld und die Werte angeben, die Sie abgleichen möchten.</p><p>Hier ist ein Beispiel:</p>GET second_index/_search
{
  "query": {
    "terms": {
      "field_in_second_index": ["value1_from_first_index", "value2_from_first_index"]
    }
  }
}<p>
In diesem Beispiel ist <code>field_in_second_index</code> das Feld im zweiten Index, das Sie mit den Werten aus dem ersten Index abgleichen möchten. <code>value1_from_first_index</code> und <code>value2_from_first_index</code> sind die Werte aus dem ersten Index, die im zweiten Index abgeglichen werden sollen.</p><p>Die Begriffsabfrage bietet außerdem Unterstützung bei der Ausführung der beiden oben genannten Schritte in einem Durchgang mithilfe einer Technik namens <a href="https://www.elastic.co/de/docs/reference/query-languages/query-dsl/query-dsl-terms-query#query-dsl-terms-lookup">„Begriffssuche“</a>. Elasticsearch kümmert sich um das transparente Abrufen der abzugleichenden Werte aus einem anderen Index. Wenn Sie beispielsweise einen Teamindex mit einer Spielerliste haben:</p>PUT teams/_doc/team1
{
  "players":   ["john", "bill", "michael"]
}
PUT teams/_doc/team2
{
  "players":   ["aaron", "joe", "donald"]
}<p>Es ist möglich, einen Personenindex für alle Personen abzufragen, die in Team1 spielen, wie unten gezeigt:</p>GET people/_search?pretty
{
  "query": {
    "terms": {
        "name" : {
            "index" : "teams",
            "id" : "team1",
            "path" : "players"
        }
    }
  }
}<p>Im obigen Beispiel ruft Elasticsearch die Spielernamen transparent aus dem Dokument mit der ID team1 im Teamindex ab (d. h. „John“, „Bill“ und „Michael“) und suchen Sie alle Dokumente im Personenindex, die einen dieser Werte in ihrem Namensfeld enthalten.</p><p>Für alle, die es interessiert: Die entsprechende SQL-Abfrage wäre:</p><h2>Verwenden des Anreicherungsprozessors</h2><p>Der <a href="https://www.elastic.co/de/docs/reference/enrich-processor/enrich-processor"><code>enrich</code></a><a href="https://www.elastic.co/de/docs/reference/enrich-processor/enrich-processor"> -Prozessor</a> ist ein weiteres leistungsstarkes Tool, mit dem zwei Indizes in Elasticsearch verbunden werden können. Dieser Prozessor bereichert die Daten eingehender Dokumente, indem er Daten aus einem vordefinierten Anreicherungsindex hinzufügt.</p><p>So können Sie den Anreicherungsprozessor verwenden, um zwei Indizes zu verknüpfen:</p><p>1. Zuerst müssen Sie eine Anreicherungsrichtlinie erstellen. Diese Richtlinie definiert, welcher Index für die Anreicherung verwendet werden soll, welches Feld abgeglichen werden soll und welche Felder für die Anreicherung eingehender Dokumente verwendet werden sollen.</p><p>Hier ist ein Beispiel:</p>PUT _enrich/policy/my_enrich_policy
{
  "match": {
    "indices": "first_index",
    "match_field": "field_in_first_index",
    "enrich_fields": ["field_to_enrich"]
  }
}<p>2. Sobald die Richtlinie erstellt ist, müssen Sie sie ausführen, um den angereicherten Index aus Ihrer neu erstellten Richtlinie zu erstellen:</p>PUT _enrich/policy/my_enrich_policy/_execute<p>Dadurch wird ein neuer versteckter angereicherter Index erstellt, der während der Anreicherung verwendet wird. Abhängig von der Größe des Quellindex kann dieser Vorgang einige Zeit dauern. Stellen Sie sicher, dass die Anreicherungsrichtlinie vollständig erstellt ist, bevor Sie mit dem nächsten Schritt fortfahren.</p><p>3. Nachdem die Anreicherungsrichtlinie erstellt wurde, können Sie den Anreicherungsprozessor in einer Aufnahmepipeline verwenden, um die Daten eingehender Dokumente anzureichern:</p>PUT _ingest/pipeline/my_pipeline
{
  "processors": [
    {
      "enrich": {
        "policy_name": "my_enrich_policy",
        "field": "field_in_second_index",
        "target_field": "enriched_field"
      }
    }
  ]
}<p>In diesem Beispiel ist <code>field_in_second_index</code> das Feld im zweiten Index, das mit <code>match_field</code> aus dem ersten Index übereinstimmen muss. <code>enriched_field</code> ist das neue Feld im zweiten Index, das die angereicherten Daten aus <code>enrich_fields</code> im ersten Index enthalten wird.</p><p>Ein Nachteil dieses Ansatzes besteht darin, dass die Anreicherungsrichtlinie erneut ausgeführt werden muss, wenn sich die Daten in <code>first_index</code> ändern. Der angereicherte Index wird nicht automatisch mit dem Quellindex aktualisiert oder synchronisiert, aus dem er erstellt wurde. Wenn <code>first_index</code> jedoch relativ stabil ist, funktioniert dieser Ansatz gut.</p><h2>Logstash Elasticsearch-Filter-Plugin</h2><p>Wenn Sie Logstash verwenden, besteht eine weitere Option, die dem oben beschriebenen <code>enrich</code> -Prozessor ähnelt, darin, das <code>elasticsearch</code> -Filter-Plugin zu verwenden, um dem Ereignis basierend auf einer angegebenen Abfrage relevante Felder hinzuzufügen. Die Konfiguration für unsere Logstash-Pipeline würde sich in einer <code>.conf</code> -Datei befinden, beispielsweise <code>my-pipeline.conf</code>.</p><p>Stellen wir uns vor, unsere Pipeline zieht Protokolle aus Elasticsearch mithilfe des <a href="https://www.elastic.co/de/docs/reference/logstash/plugins/plugins-inputs-elasticsearch"><code>elasticsearch</code></a><a href="https://www.elastic.co/de/docs/reference/logstash/plugins/plugins-inputs-elasticsearch"> -Eingabe-Plugins</a> und verwendet eine Abfrage, um die Auswahl einzugrenzen:</p>input {
  # Read all documents from Elasticsearch matching the given query
  elasticsearch {
    hosts =&gt; "localhost"
    query =&gt; '{ "query": { "match": { "statuscode": 200 } }, "sort": [ "_doc" ] }'
  }
}<p>Wenn wir diese Nachrichten mit Informationen aus einem bestimmten Index anreichern möchten, können wir das<a href="https://www.elastic.co/de/docs/reference/logstash/plugins/plugins-filters-elasticsearch"> Filter-Plugin</a> <a href="https://www.elastic.co/de/docs/reference/logstash/plugins/plugins-filters-elasticsearch"><code>elasticsearch</code></a>im Abschnitt <code>filter</code> verwenden, um unsere Protokolle anzureichern:</p>filter {
   elasticsearch {
      hosts =&gt; ["localhost"]
      index =&gt; "index_name"
      query =&gt; "type:start AND operation:%{[opid]}"
      fields =&gt; { "@timestamp" =&gt; "started" }
   }
}<p>Der obige Code findet die Dokumente ab Index <code>index_name</code> , wobei <code>type</code> der Start ist und das Operationsfeld mit dem angegebenen <code>opid</code> übereinstimmt, und kopiert dann den Wert des Felds <code>@timestamp</code> in ein neues Feld mit dem Namen <code>started</code>.</p><p>Die angereicherten Dokumente würden dann an die entsprechende Ausgabequelle gesendet, in diesem Fall an Elasticsearch unter Verwendung des <a href="https://www.elastic.co/de/docs/reference/logstash/plugins/plugins-outputs-elasticsearch"><code>elasticsearch</code></a><a href="https://www.elastic.co/de/docs/reference/logstash/plugins/plugins-outputs-elasticsearch"> -Ausgabe-Plugins</a>:</p>output {
    elasticsearch {
        hosts =&gt; "localhost"
        data_stream =&gt; "true"
    }
}<p>Wenn Sie Logstash bereits verwenden, kann diese Option nützlich sein, um Ihre Anreicherungslogik an einem einzigen Ort zu konsolidieren und bei eingehenden neuen Ereignissen zu verarbeiten. Wenn dies jedoch nicht der Fall ist, wird Ihre Lösung komplexer und Sie müssen eine weitere Komponente ausführen und warten.</p><h2>ES|QL ENRICH</h2><p>Die Einführung von <a href="https://www.elastic.co/de/docs/explore-analyze/query-filter/languages/esql">ES|QL</a>, das in Version 8.14 allgemein verfügbar wurde, ist eine von Elasticsearch unterstützte Piped-Abfragesprache, die das Filtern, Transformieren und Analysieren von Daten ermöglicht. Mithilfe des Verarbeitungsbefehls ENRICH können wir mithilfe einer Anreicherungsrichtlinie Daten aus vorhandenen Indizes hinzufügen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbeb8992bde773461/6a17f6b663baff00c9741dd4/03aadddc08afffff3f6526c9c052999c97fa09dd-1600x989.png" alt="esql bereichern" /><p>Wenn man dieselbe Richtlinie <code>my_enrich_policy</code> aus dem ursprünglichen Beispiel des Anreicherungsprozessors verwendet, würde das ES|QL-Beispiel folgendermaßen aussehen:</p><p>Es ist auch möglich, die Übereinstimmungs- und Anreicherungsfelder zu überschreiben, die in unserem Beispiel <code>field_in_first_index</code> bzw. <code>field_to_enrich</code> sind:</p><p>Die offensichtliche Einschränkung besteht darin, dass Sie zuerst eine Anreicherungsrichtlinie angeben müssen, ES|QL bietet jedoch die Flexibilität, die Felder nach Bedarf anzupassen.</p><h2>ES|QL LOOKUP JOIN</h2><p>Elasticsearch 8.18 führt eine neue Möglichkeit zum Verbinden von Indizes in Elasticsearch ein, nämlich den Befehl <code>LOOKUP JOIN</code> . Dieser Befehl funktioniert als LEFT OUTER JOIN im SQL-Stil und verwendet den neuen <a href="https://www.elastic.co/de/docs/reference/elasticsearch/index-settings/index-modules#index-mode-setting">Lookup-Indexmodus</a> auf der rechten Seite des Joins.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt783ffb3f9802f92d/6a17f6b8e9ea870608a9c788/1d73495979c4d6bb675c4c966ea86d9a72dc1c48-510x605.png" alt="ES|QL LOOKUP JOIN" /><p>Wenn wir unser vorheriges Beispiel noch einmal betrachten, lautet die neue Abfrage wie folgt, wobei <code>match_field</code> sowohl in <code>first_index</code> als auch in <code>second_index</code> vorhanden sein muss:</p><p>Der Vorteil von LOOKUP JOIN gegenüber den anderen Ansätzen besteht darin, dass keine <code>enrich</code> -Richtlinie erforderlich ist und daher auch keine zusätzliche Verarbeitung im Zusammenhang mit der Einrichtung der Richtlinie erforderlich ist. Im Gegensatz zu den anderen in diesem Artikel besprochenen Ansätzen ist es nützlich, wenn mit sich häufig ändernden Anreicherungsdaten gearbeitet wird.</p><h2>Fazit</h2><p>Zusammenfassend lässt sich sagen, dass Elasticsearch zwar keine herkömmlichen Join-Operationen unterstützt, aber verschiedene Funktionen bietet, mit denen ähnliche Ergebnisse erzielt werden können. Insbesondere haben wir erläutert, wie Sie Join-Operationen mithilfe der folgenden Methoden durchführen können:</p><ol><li><p>Die <code>terms</code> -Abfrage</p></li><li><p>Der <code>enrich</code> -Prozessor in Ingest-Pipelines</p></li><li><p>Logstash <code>elasticsearch</code> Filter-Plugin</p></li><li><p>ES|QL <code>ENRICH</code></p></li><li><p>ES|QL <code>LOOKUP JOIN</code></p></li></ol><p>Es ist wichtig zu beachten, dass diese Methoden ihre Grenzen haben und je nach den spezifischen Anforderungen und der Art der Daten mit Bedacht eingesetzt werden sollten.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-join-two-indexes</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-join-two-indexes</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Carly Richmond]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt74822b3b7cb2a41a/6a17f6b97f6f156288c09cc7/0d4736d10fa3e12e6233cd59993299c7bd48911b-680x450.png" length="0" type="image/png"/>
    <pubDate>Wed, 07 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Elasticsearch-Scoring und die Explain-API verstehen]]></title>
    <description><![CDATA[Lernen Sie die Bewertungsmechanismen von Elasticsearch und die praktische Bewertungsfunktion kennen, um mit der Explain API die Suchrelevanz zu prüfen und das Dokumentenranking zu verbessern.]]></description>
    <content:encoded><![CDATA[<p>Elasticsearch ist eine leistungsstarke Suchmaschine, die schnelle und relevante Suchergebnisse liefert, indem sie für jedes Dokument im Index eine Punktzahl berechnet. Diese Punktzahl ist ein entscheidender Faktor für die Reihenfolge der Suchergebnisse. In diesem Artikel werden wir uns mit dem Scoring-Mechanismus von Elasticsearch befassen und die Explain API untersuchen, die zum Verständnis des Scoring-Prozesses beiträgt.</p><h2>Bewertungsmechanismen in Elasticsearch</h2><p>Elasticsearch verwendet standardmäßig ein Bewertungsmodell namens Practical Scoring Function (BM25). Dieses Modell basiert auf der probabilistischen Information-Retrieval-Theorie und berücksichtigt Faktoren wie Termfrequenz, inverse Dokumentfrequenz und Feldlängennormalisierung. Lassen Sie uns diese Faktoren kurz besprechen:</p><ol><li><p><strong>Termfrequenz (TF):</strong> Dies gibt an, wie oft ein Begriff in einem Dokument vorkommt. Eine höhere Termfrequenz deutet auf eine stärkere Beziehung zwischen dem Begriff und dem Dokument hin.</p></li><li><p><strong>Inverse Dokumenthäufigkeit (IDF):</strong> Dieser Faktor misst die Bedeutung eines Begriffs innerhalb der gesamten Dokumentensammlung. Ein Begriff, der in vielen Dokumenten vorkommt, gilt als weniger wichtig, während ein Begriff, der in weniger Dokumenten vorkommt, als wichtiger gilt.</p></li><li><p><strong>Feldlängennormalisierung</strong>: Dieser Faktor berücksichtigt die Länge des Feldes, in dem der Term vorkommt. Kürzere Felder werden stärker gewichtet, da der Begriff in einem kürzeren Feld als bedeutsamer angesehen wird.</p></li></ol><h2>Verwendung der Explain-API</h2><p>Die Explain API in Elasticsearch ist ein wertvolles Werkzeug zum Verständnis des Scoring-Prozesses. Es bietet eine detaillierte Erklärung, wie die Punktzahl für ein bestimmtes Dokument berechnet wurde. Um die Explain-API zu verwenden, müssen Sie eine GET-Anfrage an den folgenden Endpunkt senden:</p>GET /&lt;index&gt;/_explain/&lt;document_id&gt;<p>Im Anfragetext müssen Sie die Abfrage angeben, für die Sie die Bewertung verstehen möchten. Hier ein Beispiel:</p>{
  "query": {
    "match": {
      "title": "elasticsearch"
    }
  }
}<p>Die Antwort der Explain API enthält eine detaillierte Aufschlüsselung des Bewertungsprozesses, einschließlich der einzelnen Faktoren (TF, IDF und Feldlängennormalisierung) und deren Beitrag zur Endwertung. Hier ist eine Beispielantwort:</p>{
  "_index": "example_index",
  "_type": "_doc",
  "_id": "1",
  "matched": true,
  "explanation": {
    "value": 1.2,
    "description": "weight(title:elasticsearch in 0) [PerFieldSimilarity], result of:",
    "details": [
      {
        "value": 1.2,
        "description": "score(doc=0,freq=1.0 = termFreq=1.0\n), product of:",
        "details": [
          {
            "value": 2.2,
            "description": "idf, computed as log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5)) from:",
            "details": [
              {
                "value": 1,
                "description": "docFreq",
                "details": []
              },
              {
                "value": 1,
                "description": "docCount",
                "details": []
              }
            ]
          },
          {
            "value": 0.5,
            "description": "tfNorm, computed as (freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength)) from:",
            "details": [
              {
                "value": 1,
                "description": "termFreq=1.0",
                "details": []
              },
              {
                "value": 1.2,
                "description": "parameter k1",
                "details": []
              },
              {
                "value": 0.75,
                "description": "parameter b",
                "details": []
              },
              {
                "value": 1,
                "description": "avgFieldLength",
                "details": []
              },
              {
                "value": 1,
                "description": "fieldLength",
                "details": []
              }
            ]
          }
        ]
      }
    ]
  }
}<p>In diesem Beispiel zeigt die Antwort, dass der Wert von 1,2 das Produkt aus dem IDF-Wert (2,2) und dem tfNorm-Wert (0,5) ist. Die detaillierte Erklärung hilft, die Faktoren zu verstehen, die zur Bewertung beitragen, und kann für die Feinabstimmung der Suchrelevanz nützlich sein.</p><h2>Fazit</h2><p>Die Bewertung durch Elasticsearch ist ein entscheidender Aspekt bei der Bereitstellung relevanter Suchergebnisse. Indem Sie die Bewertungsmechanismen verstehen und die Explain API nutzen, können Sie Einblicke in die Faktoren gewinnen, die die Suchergebnisse beeinflussen, und Ihre Suchanfragen im Hinblick auf bessere Relevanz und Leistung optimieren.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-scoring-and-explain-api</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-scoring-and-explain-api</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbe7de1872f1527e3/6a17de303e9e452974ba1374/a70c5403064d5bbceff66a17373332362227f13c-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Mon, 05 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Elasticsearch-Suche anhand zweier Felder]]></title>
    <description><![CDATA[Entdecken Sie Techniken zur Suche in zwei Feldern, darunter Multi-Match-Abfragen, Bool-Abfragen und Feld-Boosting zur Abfragezeit.]]></description>
    <content:encoded><![CDATA[<p>Die Suche über mehrere Felder hinweg in Elasticsearch ist in vielen Anwendungen eine gängige Anforderung. In diesem Artikel werden wir fortgeschrittene Techniken zur Durchführung von Suchen anhand zweier Felder untersuchen, darunter Mehrfachübereinstimmungsabfragen, Boolesche Abfragen und die Feld-Boosting-Methode zur Abfragezeit. Diese Techniken helfen Ihnen dabei, genauere und relevantere Suchergebnisse für Ihre Nutzer zu erstellen.</p><h2>Erweiterte Techniken zur Durchführung von Suchen in zwei Feldern</h2><h3>1. Mehrfachabfrage</h3><p>Eine Mehrfachabfrage ermöglicht es Ihnen, in mehreren Feldern nach einer einzelnen Suchzeichenfolge zu suchen. Dies ist nützlich, wenn Sie Dokumente finden möchten, die die angegebene Suchanfrage in einem der beiden Felder enthalten. Hier ist ein Beispiel für eine Mehrfachabfrage, die nach dem Begriff „Beispiel“ in den Feldern „Titel“ oder „Beschreibung“ sucht:</p>{
  "query": {
    "multi_match": {
      "query": "example",
      "fields": ["title", "description"]
    }
  }
}<h3>2. Bool-Abfrage</h3><p>Eine Bool-Abfrage ermöglicht es Ihnen, mehrere Abfragen mithilfe boolescher Logik zu kombinieren. Sie können die „should“-Klausel verwenden, um nach Dokumenten zu suchen, die der Suchanfrage in einem der beiden Felder entsprechen. Hier ist ein Beispiel für eine Boolesche Abfrage, die nach dem Begriff „Beispiel“ in den Feldern „Titel“ und „Beschreibung“ sucht:</p>{
  "query": {
    "bool": {
      "should": [
        {"match": {"title": "example"}},
        {"match": {"description": "example"}}
      ]
    }
  }
}<h3>3. Feld-Boosting zur Abfragezeit</h3><p>Manchmal möchten Sie bei der Suche einem Feld mehr Gewicht beimessen als einem anderen. Dies lässt sich erreichen, indem man dem Feld zur Abfragezeit einen Boost-Faktor zuweist. Ein höherer Boost-Wert gewichtet das Feld stärker, wodurch es mit größerer Wahrscheinlichkeit das endgültige Suchergebnis beeinflusst. Hier ist ein Beispiel für eine Mehrfachabfrage mit einem Boost-Faktor für das Feld „Titel“:</p>{
  "query": {
    "multi_match": {
      "query": "example",
      "fields": ["title^3", "description"]
    }
  }
}<p>In diesem Beispiel hat das Feld „Titel“ einen Boost-Faktor von 3, wodurch es bei der Bestimmung des Such-Scores dreimal wichtiger ist als das Feld „Beschreibung“.</p><h3>4. Kombinieren von Abfragen mit unterschiedlichen Gewichtungsfaktoren</h3><p>Sie können auch mehrere Abfragen mit unterschiedlichen Gewichtungsfaktoren mithilfe einer booleschen Abfrage kombinieren. Dies ermöglicht es Ihnen, die Wichtigkeit jedes Feldes in den Suchergebnissen feinabzustimmen. Hier ist ein Beispiel für eine Boolesche Abfrage mit unterschiedlichen Gewichtungsfaktoren für die Felder „Titel“ und „Beschreibung“:</p>{
  "query": {
    "bool": {
      "should": [
        {"match": {"title": {"query": "example", "boost": 3}}},
        {"match": {"description": {"query": "example", "boost": 1}}}
      ]
    }
  }
}<p>In diesem Beispiel hat das Feld „Titel“ einen Boost-Faktor von 3, während das Feld „Beschreibung“ einen Boost-Faktor von 1 hat.</p><h2>Fazit</h2><p>Die Suche anhand zweier Felder in Elasticsearch kann mithilfe fortgeschrittener Techniken wie Multi-Match-Abfragen, Booleschen Abfragen und Query-Time Field Boosting erreicht werden. Durch die Kombination dieser Techniken können Sie genauere und relevantere Suchergebnisse für Ihre Nutzer erstellen. Experimentieren Sie mit verschiedenen Abfragekombinationen und Gewichtungsfaktoren, um die optimale Suchkonfiguration für Ihren spezifischen Anwendungsfall zu finden.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-search-by-two-fields</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-search-by-two-fields</guid>
    <category><![CDATA[Grundlagen]]></category>
    <category><![CDATA[Query DSL]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltda47d75430c4fa7c/6a17f5cae3179149242d5963/d5d04bbcfc3925f48f3487ea4c7e0dd2205316d0-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Wed, 30 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Wie Sie Better Binary Quantization (BBQ) in Ihren Anwendungsfall implementieren können]]></title>
    <description><![CDATA[Erfahren Sie, warum Sie Better Binary Quantization (BBQ) in Ihrem Anwendungsfall einsetzen sollten und wie Sie dabei vorgehen.]]></description>
    <content:encoded><![CDATA[<p>Die Vektorsuche bildet die Grundlage für die Implementierung der semantischen Suche nach Text oder der Ähnlichkeitssuche nach Bildern, Videos oder Audio. Bei der Vektorsuche handelt es sich bei den Vektoren um mathematische Darstellungen von Daten, die sehr groß und manchmal langsam sein können. Die bessere binäre Quantisierung (im Folgenden als BBQ bezeichnet) funktioniert als Komprimierungsmethode für Vektoren. Es ermöglicht Ihnen, die richtigen Übereinstimmungen zu finden und gleichzeitig die Vektoren zu verkleinern, damit sie schneller durchsucht und verarbeitet werden können. Dieser Artikel behandelt BBQ und rescore_vector, ein Feld, das nur für quantisierte Indizes verfügbar ist und Vektoren automatisch neu bewertet.</p><p>Alle vollständigen Abfragen und Ausgaben, die in diesem Artikel erwähnt werden, finden Sie in unserem <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/how-and-why-bbq">Elasticsearch Labs-Code-Repository</a>.</p><h2>Warum sollten Sie Better Binary Quantization (BBQ) in Ihrem Anwendungsfall einsetzen?</h2>Hinweis: Um ein tieferes Verständnis der Mathematik hinter BBQ zu erhalten, lesen Sie bitte den <a href="https://www.elastic.co/de/search-labs/blog/bbq-implementation-into-use-case#further-learning">Abschnitt „Weiterführende Informationen“</a> weiter unten. Für die Zwecke dieses Blogs liegt der Schwerpunkt auf der Implementierung.<p>Die mathematischen Hintergründe sind zwar faszinierend, aber unerlässlich, wenn Sie vollständig verstehen wollen, warum Ihre Vektorsuchen präzise bleiben. Letztendlich dreht sich alles um Komprimierung, da sich herausgestellt hat, dass man mit den aktuellen Vektorsuchalgorithmen durch die Lesegeschwindigkeit der Daten begrenzt ist. Wenn Sie also all diese Daten im Arbeitsspeicher unterbringen können, erzielen Sie im Vergleich zum Lesen vom Speicher eine erhebliche Geschwindigkeitssteigerung (<a href="https://sre.google/static/pdf/rule-of-thumb-latency-numbers-letter.pdf">der Arbeitsspeicher ist etwa 200-mal schneller als SSDs</a>).</p><p>Es gibt ein paar Dinge zu beachten:</p><ul><li><p>Graphenbasierte Indizes wie <a href="https://arxiv.org/pdf/1603.09320">HNSW</a> (Hierarchical Navigable Small World) sind für die Vektorabfrage am schnellsten.</p><ul><li><p>HNSW: Ein ungefährer Suchalgorithmus für den nächsten Nachbarn, der eine mehrschichtige Graphstruktur erstellt, um effiziente hochdimensionale Ähnlichkeitssuchen zu ermöglichen.</p></li></ul></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt760bd95c206bfa8f/6a17e2ad505ac393f7ad8a95/590f3b3c72a76023a38a0436cd9ff90a9f80e936-1964x1262.png" alt="HNSW: Ein ungefährer Suchalgorithmus für den nächsten Nachbarn, der eine mehrschichtige Graphstruktur erstellt, um effiziente hochdimensionale Ähnlichkeitssuchen zu ermöglichen." /><ul><li><p>Die Geschwindigkeit von HNSW wird grundsätzlich durch die Datenlesegeschwindigkeit aus dem Speicher oder im schlimmsten Fall aus dem Speicher begrenzt.</p><ul><li><p>Idealerweise möchten Sie alle Ihre gespeicherten Vektoren in den Speicher laden können.</p></li></ul></li><li><p>Einbettungsmodelle erzeugen im Allgemeinen Vektoren mit Float32-Präzision, 4 Bytes pro Gleitkommazahl.</p></li><li><p>Und schließlich kann es, je nachdem, wie viele Vektoren und/oder Dimensionen Sie haben, sehr schnell passieren, dass Ihnen nicht genügend Speicher zur Verfügung steht, um alle Ihre Vektoren zu speichern.</p></li></ul><p>Wenn man dies als gegeben voraussetzt, erkennt man, dass schnell ein Problem entsteht, wenn man Millionen oder sogar Milliarden von Vektoren mit jeweils potenziell Hunderten oder sogar Tausenden von Dimensionen verarbeitet. Der Abschnitt „ <a href="https://www.elastic.co/de/search-labs/blog/bbq-implementation-into-use-case#approximate-numbers-on-the-compression-ratios">Ungefähre Zahlen zu den Kompressionsverhältnissen</a>“ enthält einige grobe Zahlen.</p><h2>Was brauchen Sie für den Anfang?</h2><p>Für den Anfang benötigen Sie Folgendes:</p><ul><li><p>Wenn Sie Elastic Cloud oder vor Ort verwenden, benötigen Sie eine höhere Version von Elasticsearch als 8.18. Während BBQ in 8.16 eingeführt wurde, verwenden Sie in diesem Artikel <code>vector_rescore</code>, das in 8.18 eingeführt wurde.</p></li><li><p>Darüber hinaus müssen Sie sicherstellen, dass in Ihrem Cluster ein <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/ml-settings.html">Knoten für maschinelles Lernen (ML)</a> vorhanden ist. (Hinweis: Zum Laden des Modells ist ein ML-Knoten mit mindestens 4 GB erforderlich, für die vollständige Produktionsarbeitslast werden Sie jedoch wahrscheinlich viel größere Knoten benötigen.)</p></li><li><p>Wenn Sie Serverless verwenden, müssen Sie eine Instanz auswählen, die für Vektoren optimiert ist.</p></li><li><p>Darüber hinaus benötigen Sie Grundkenntnisse im Umgang mit Vektordatenbanken. Wenn Sie mit den Konzepten der Vektorsuche in Elastic noch nicht vertraut sind, sollten Sie sich zunächst die folgenden Ressourcen ansehen:</p><ul><li><p><a href="https://www.elastic.co/de/search-labs/blog/elastic-vector-database-practical-example">Navigieren in einer Elastic Vector-Datenbank</a></p></li><li><p><a href="https://www.elastic.co/de/blog/retrieval-augmented-generation-explained">Die großen Ideen hinter der Retrieval Augmented Generation</a></p></li></ul></li></ul><h2>Verbesserte Binärquantisierung (BBQ)-Implementierung</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt18df00df95ff2ca7/6a17e2af414c6411989450df/4d388078495566f0527e931e0c2e38facdce83c6-1503x748.png" alt="Elasticsearch BBQ-Implementierung." /><p>Um diesen Blog einfach zu halten, verwenden Sie integrierte Funktionen, wenn diese verfügbar sind. In diesem Fall verfügen Sie über das Vektor-Einbettungsmodell <a href="https://www.elastic.co/de/guide/en/machine-learning/8.17/ml-nlp-e5.html"><code>.multilingual-e5-small</code></a> , das direkt in Elasticsearch auf einem Machine-Learning-Knoten ausgeführt wird. Beachten Sie, dass Sie das Modell <code>text_embedding</code> durch den Embedder Ihrer Wahl ersetzen können (<a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/infer-service-openai.html">OpenAI</a>, <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/infer-service-google-ai-studio.html">Google AI Studio</a>, <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/infer-service-cohere.html">Cohere</a> und viele mehr). Wenn Ihr bevorzugtes Modell noch nicht integriert ist, können Sie auch <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/bring-your-own-vectors.html">Ihre eigenen dichten Vektoreinbettungen mitbringen</a>.)</p><p>Zuerst müssen Sie einen Inferenzendpunkt erstellen, um Vektoren für einen bestimmten Textabschnitt zu generieren. Sie führen alle diese Befehle von der Kibana <a href="https://www.elastic.co/de/guide/en/kibana/8.18/console-kibana.html">Dev Tools-Konsole</a> aus. Dieser Befehl lädt <code>.multilingual-e5-small</code> herunter. Wenn es noch nicht vorhanden ist, wird Ihr Endpunkt eingerichtet. Dies kann eine Minute dauern. Sie können die erwartete Ausgabe in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/01-create-an-inference-endpoint-output.json">01-create-an-inference-endpoint-output.json</a> im Ordner „Outputs“ sehen. </p>PUT _inference/text_embedding/my_e5_model
{
  "service": "elasticsearch",
  "service_settings": {
    "num_threads": 1,
    "model_id": ".multilingual-e5-small",
    "adaptive_allocations": {
      "enabled": true,
      "min_number_of_allocations": 1
    }
  }
}<p>Sobald dies zurückgegeben wurde, ist Ihr Modell eingerichtet und Sie können mit dem folgenden Befehl testen, ob das Modell wie erwartet funktioniert. Sie können die erwartete Ausgabe in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/02-embed-text-output.json">02-embed-text-output.json</a> im Ordner „Outputs“ sehen.</p>POST _inference/text_embedding/my_e5_model
{
  "input": "my awesome piece of text"
}<p>Wenn bei Ihnen Probleme auftreten, weil Ihr trainiertes Modell keinem Knoten zugewiesen wird, müssen Sie Ihr Modell möglicherweise manuell starten.</p>POST _ml/trained_models/.multilingual-e5-small/deployment/_start<p>Erstellen wir nun eine neue Zuordnung mit 2 Eigenschaften, einem Standardtextfeld (<code>my_field</code>) und einem dichten Vektorfeld (<code>my_vector</code>) mit 384 Dimensionen, um der Ausgabe des Einbettungsmodells zu entsprechen. Sie werden auch <code>index_options.type to bbq_hnsw</code> überschreiben. Sie können die erwartete Ausgabe in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/03-create-byte-qauntized-index-output.json">03-create-byte-qauntized-index-output.json</a> im Ordner „Outputs“ sehen.</p>PUT bbq-my-byte-quantized-index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text"
      },
      "my_vector": {
        "type": "dense_vector",
        "dims": 384,
        "index_options": {
          "type": "bbq_hnsw"
        }
      }
    }
  }
}<p>Um sicherzustellen, dass Elasticsearch Ihre Vektoren generiert, können Sie eine <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/ingest.html">Ingest-Pipeline</a> verwenden. Diese Pipeline erfordert drei Dinge: den Endpunkt (<code>model_id</code>), die <code>input_field</code> , für die Sie Vektoren erstellen möchten, und die <code>output_field</code> , in der diese Vektoren gespeichert werden. Der erste Befehl unten erstellt eine Inferenz-Ingest-Pipeline, die den <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/current/inference-apis.html">Inferenzdienst </a>im Hintergrund verwendet, und der zweite testet, ob die Pipeline ordnungsgemäß funktioniert. Sie können die erwartete Ausgabe in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/04-create-and-simulate-ingest-pipeline-output.json">04-create-and-simulate-ingest-pipeline-output.json</a> im Ordner „Outputs“ sehen. </p>PUT _ingest/pipeline/my_inference_pipeline
{
  "processors": [
    {
      "inference": {
        "model_id": "my_e5_model",
        "input_output": [
          {
            "input_field": "my_field",
            "output_field": "my_vector"
          }
        ]
      }
    }
  ]
}

POST _ingest/pipeline/my_inference_pipeline/_simulate
{
  "docs": [
    {
      "_source": {
        "my_field": "my awesome text field"
      }
    }
  ]
}<p>Sie können nun mit den ersten beiden Befehlen unten einige Dokumente hinzufügen und mit dem dritten Befehl testen, ob Ihre Suchvorgänge funktionieren. Sie können die erwartete Ausgabe in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/05-bbq-index-output.json">05-bbq-index-output.json</a> im Ordner „Outputs“ überprüfen. </p>PUT bbq-my-byte-quantized-index/_doc/1?pipeline=my_inference_pipeline
{
    "my_field": "my awesome text field"
}

PUT bbq-my-byte-quantized-index/_doc/2?pipeline=my_inference_pipeline
{
    "my_field": "some other sentence"
}

GET bbq-my-byte-quantized-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<p>Wie in <a href="https://www.elastic.co/de/search-labs/blog/better-binary-quantization-lucene-elasticsearch#lucene-benchmarking">diesem Beitrag</a> empfohlen, sind Neubewertung und Überabtastung ratsam, wenn Sie auf nicht triviale Datenmengen skalieren, da sie dazu beitragen, eine hohe Rückrufgenauigkeit aufrechtzuerhalten und gleichzeitig von den Komprimierungsvorteilen zu profitieren. Ab Elasticsearch Version 8.18 können Sie dies auf diese Weise mit <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/knn-search.html#dense-vector-knn-search-rescoring">rescore_vector</a> tun. Die erwartete Ausgabe befindet sich in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/06-bbq-search-8-18-output.json">06-bbq-search-8-18-output.json</a> im Ordner „Outputs“.</p>GET bbq-my-byte-quantized-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "rescore_vector": {
              "oversample": 3
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<p>Wie schneiden diese Werte im Vergleich zu denen ab, die Sie für Rohdaten erhalten würden? Wenn Sie alles oben Gesagte noch einmal machen, aber mit <code>index_options.type: hnsw</code>, werden Sie sehen, dass die Ergebnisse sehr vergleichbar sind. Sie können die erwartete Ausgabe in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/07-raw-vector-output.json">07-raw-vector-output.json</a> im Ordner „Outputs“ sehen.</p>PUT my-raw-vector-index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text"
      },
      "my_vector": {
        "type": "dense_vector",
        "dims": 384,
        "index_options": {
          "type": "hnsw"
        }
      }
    }
  }
}

PUT my-raw-vector-index/_doc/1?pipeline=my_inference_pipeline
{
    "my_field": "my awesome text field"
}

PUT my-raw-vector-index/_doc/2?pipeline=my_inference_pipeline
{
    "my_field": "some other sentence"
}

GET my-raw-vector-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<h2>Ungefähre Zahlen zu den Kompressionsverhältnissen</h2><p>Bei der Arbeit mit der Vektorsuche können Speicher- und Arbeitsspeicheranforderungen schnell zu einer erheblichen Herausforderung werden. Die folgende Aufschlüsselung veranschaulicht, wie verschiedene Quantisierungstechniken den Speicherbedarf von Vektordaten drastisch reduzieren.</p><p>Vektoren (V)</p><p>Abmessungen (D)</p><p>roh (V x D x 4)</p><p>int8 (V x (D x 1 + 4))</p><p>int4 (V x (D x 0,5 + 4))</p><p>Grill (V x (D x 0,125 + 4))</p><p>10.000.000</p><p>384</p><p>14,31 GB</p><p>3,61 GB</p><p>1,83 GB</p><p>0,58 GB</p><p>50.000.000</p><p>384</p><p>71,53 GB</p><p>18,07 GB</p><p>9,13 GB</p><p>2,89 GB</p><p>100.000.000</p><p>384</p><p>143,05 GB</p><p>36,14 GB</p><p>18,25 GB</p><p>5,77 GB</p><h2>Fazit</h2><p>BBQ ist eine Optimierung, die Sie zur Komprimierung Ihrer Vektordaten anwenden können, ohne die Genauigkeit zu beeinträchtigen. Dabei werden Vektoren in Bits umgewandelt, sodass Sie die Daten effektiv durchsuchen und Ihre KI-Workflows skalieren können, um die Suche zu beschleunigen und die Datenspeicherung zu optimieren.</p><h2>Weiterführendes Lernen</h2><p>Wenn Sie mehr über BBQ erfahren möchten, sehen Sie sich unbedingt die folgenden Ressourcen an:</p><ul><li><p><a href="https://www.elastic.co/de/search-labs/blog/better-binary-quantization-lucene-elasticsearch">Binäre Quantisierung (BBQ) in Lucene und Elasticsearch</a></p></li><li><p><a href="https://www.elastic.co/de/search-labs/blog/bit-vectors-elasticsearch-bbq-vs-pq">Bessere binäre Quantisierung (BBQ) vs. Produktquantisierung</a></p></li><li><p><a href="https://www.elastic.co/de/search-labs/blog/optimized-scalar-quantization-elasticsearch">Optimierte skalare Quantisierung: Noch bessere binäre Quantisierung</a></p></li><li><p><a href="https://www.youtube.com/watch?v=04NzMt2Nigc">Bessere binäre Quantisierung (BBQ): Von Bytes bis BBQ, das Geheimnis einer besseren Vektorsuche von Ben Trent</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/bbq-implementation-into-use-case</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/bbq-implementation-into-use-case</guid>
    <category><![CDATA[Vektordatenbank]]></category>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Sachin Frayne,Jessica Garson]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3dd0495b536b2615/6a17e2b0414c6488459450e3/66842055367cdd795532b01c167f2a4b03dc65e3-1200x628.png" length="0" type="image/png"/>
    <pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Elasticsearch-Heap-Speichernutzung und JVM-Garbage-Collection]]></title>
    <description><![CDATA[Untersuchung der Heap-Speichernutzung von Elasticsearch und der JVM-Garbage-Collection, einschließlich Best Practices und Lösungsansätzen für Probleme, wenn die Heap-Speichernutzung zu hoch ist oder die JVM-Leistung nicht optimal ist.]]></description>
    <content:encoded><![CDATA[<p>Die Heap-Größe ist die Menge an RAM, die der Java Virtual Machine eines Elasticsearch-Knotens zugewiesen wird.</p><p>Ab Version 7.11 passt Elasticsearch die JVM-Heap-Größe standardmäßig automatisch an die Rollen und den Gesamtspeicher eines Knotens an. Für die meisten Produktionsumgebungen wird die Verwendung der Standarddimensionierung empfohlen. Wenn Sie jedoch die Größe Ihres JVM-Heaps manuell festlegen möchten, sollten Sie in der Regel -Xms und -Xmx auf den gleichen Wert setzen, der 50 % Ihres gesamten verfügbaren RAMs betragen sollte, maximal jedoch (ungefähr) 31 GB.</p><p>Eine größere Heap-Größe stellt Ihrem Knoten mehr Speicher für Indizierungs- und Suchvorgänge zur Verfügung. Allerdings benötigt Ihr Knoten auch Speicher für das Caching, daher sorgt die Verwendung von 50 % für ein gesundes Gleichgewicht zwischen den beiden. Aus demselben Grund sollten Sie im Produktivbetrieb vermeiden, andere speicherintensive Prozesse auf demselben Knoten wie Elasticsearch auszuführen.</p><p>Typischerweise folgt die Haufennutzung einem Sägezahnmuster und schwankt zwischen etwa 30 und 70 % der maximal genutzten Haufengröße. Dies liegt daran, dass die JVM den Heap-Nutzungsprozentsatz stetig erhöht, bis der Garbage-Collection-Prozess wieder Speicher freigibt. Eine hohe Heap-Speicherbelegung tritt auf, wenn der Garbage-Collection-Prozess nicht hinterherkommt. Ein Indikator für eine hohe Heap-Speicherbelegung ist, wenn die Garbage Collection nicht in der Lage ist, die Heap-Speicherbelegung auf etwa 30 % zu reduzieren.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt03908d8eea824755/6a17dbe63e03d71e314f2b3e/0a17a67cc589a3c1fbf9e918eadc119df7bd7619-858x278.png" alt="" /><p>Im obigen Bild ist ein normales Sägezahnmuster des JVM-Heaps zu sehen.</p><p>Sie werden auch feststellen, dass es zwei Arten von Müllabfuhr gibt, die junge und die alte Müllabfuhr.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0d527a7905c78a45/6a17dbe84b055d09484320c2/8df5c24c4894404de4617be7a13683c9027d607d-875x281.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt681db7f60d9dbe40/6a17dbe97f6f152b9bc099f0/e01eb2537310b052580411153b8eddc187d97687-890x264.png" alt="" /><p>In einer gesunden JVM sollte die Speicherbereinigung idealerweise die folgenden Bedingungen erfüllen:</p><ul><li><p>Young GC wird schnell verarbeitet (innerhalb von 50 ms).</p></li><li><p>Young GC wird nicht häufig ausgeführt (etwa alle 10 Sekunden).</p></li><li><p>Der alte GC wird schnell verarbeitet (innerhalb von 1 Sekunde).</p></li><li><p>Die alte Garbage Collection wird nicht häufig ausgeführt (einmal alle 10 Minuten oder seltener).</p></li></ul><h3><strong>Wie lässt sich das Problem beheben, wenn die Heap-Speichernutzung zu hoch ist oder die JVM-Leistung nicht optimal ist?</strong></h3><p>Es kann verschiedene Gründe geben, warum die Heap-Speicherbelegung ansteigen kann:</p><h4><strong>Übersharding</strong></h4><p>Das Dokument zum Thema Oversharding finden Sie <a href="https://www.elastic.co/docs/deploy-manage/production-guidance/optimize-performance/size-shards#sizing-shard-guidelines">hier</a>.</p><h4><strong>Große Aggregationsgrößen</strong></h4><p>Um große Aggregationsgrößen zu vermeiden, halten Sie die Anzahl der Aggregations-Buckets (Größe) in Ihren Abfragen so gering wie möglich.</p>GET /_search
{
   "aggs" : {
       "products" : {
           "terms" : {
               "field" : "product",
               "size" : 5
                          }
       }
   }
}<p>Sie können die Protokollierung langsamer Abfragen (Slow Logs) verwenden und sie auf einem bestimmten Index mit den folgenden Mitteln implementieren.</p>PUT /my_index/_settings
{
   "index.search.slowlog.threshold.query.warn": "10s",
   "index.search.slowlog.threshold.query.info": "5s",
   "index.search.slowlog.threshold.query.debug": "2s",
   "index.search.slowlog.threshold.query.trace": "500ms",
   "index.search.slowlog.threshold.fetch.warn": "1s",
   "index.search.slowlog.threshold.fetch.info": "800ms",
   "index.search.slowlog.threshold.fetch.debug": "500ms",
   "index.search.slowlog.threshold.fetch.trace": "200ms",
   "index.search.slowlog.level": "info"
}<p>Anfragen, deren Beantwortung lange dauert, sind wahrscheinlich ressourcenintensiv.</p><h4><strong>Übermäßige Größe des Massenindex</strong></h4><p>Wenn Sie große Anfragen senden, kann dies zu einem hohen Heap-Verbrauch führen. Versuchen Sie, die Größe der Massenindexierungsanfragen zu reduzieren.</p><h4><strong>Kartierungsprobleme</strong></h4><p>Insbesondere wenn Sie „fielddata: true“ verwenden, kann dies einen erheblichen Teil Ihres JVM-Heaps beanspruchen.</p><h4><strong>Die Haufengröße wurde falsch eingestellt.</strong></h4><p>Die Heap-Größe kann manuell definiert werden durch:</p><p>Festlegen der Umgebungsvariablen:</p>ES_JAVA_OPTS="-Xms2g -Xmx2g"<p>Bearbeiten der Datei jvm.options in Ihrem Elasticsearch-Konfigurationsverzeichnis:</p>-Xms2g
-Xmx2g<p>Die Einstellung der Umgebungsvariablen hat Vorrang vor der Dateieinstellung.</p><p>Der Knoten muss neu gestartet werden, damit die Einstellung übernommen wird.</p><h4><strong>Das neue JVM-Verhältnis wurde falsch eingestellt</strong></h4><p>Im Allgemeinen ist es NICHT notwendig, dies festzulegen, da Elasticsearch diesen Wert standardmäßig setzt. Dieser Parameter definiert das Verhältnis des verfügbaren Speicherplatzes für Objekte der „neuen Generation“ und der „alten Generation“ in der JVM.</p><p>Wenn Sie feststellen, dass old GC sehr häufig vorkommt, können Sie versuchen, diesen Wert in der Datei jvm.options in Ihrem Elasticsearch-Konfigurationsverzeichnis explizit festzulegen.</p>-XX:NewRatio=3<h3><strong>Was sind die besten Vorgehensweisen für die Verwaltung der Heap-Speicherbelegung und der JVM-Garbage-Collection in einem großen Elasticsearch-Cluster?</strong></h3><p>Die besten Vorgehensweisen für die Verwaltung der Heap-Speicherbelegung und der JVM-Garbage-Collection in einem großen Elasticsearch-Cluster bestehen darin, sicherzustellen, dass die Heap-Größe auf maximal 50 % des verfügbaren RAMs eingestellt ist und dass die JVM-Garbage-Collection-Einstellungen für den jeweiligen Anwendungsfall optimiert sind. Es ist wichtig, die Heap-Größe und die Garbage-Collection-Metriken zu überwachen, um sicherzustellen, dass der Cluster optimal läuft. Insbesondere ist es wichtig, die JVM-Heap-Größe, die Garbage-Collection-Zeit und die Garbage-Collection-Pausen zu überwachen. Darüber hinaus ist es wichtig, die Anzahl der Müllabfuhrzyklen und die für die Müllabfuhr aufgewendete Zeit zu überwachen. Durch die Überwachung dieser Kennzahlen können potenzielle Probleme mit der Heap-Größe oder den Einstellungen für die Speicherbereinigung erkannt und gegebenenfalls Korrekturmaßnahmen ergriffen werden.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-heap-size-jvm-garbage-collection</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-heap-size-jvm-garbage-collection</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Wie man die Anzahl der primären Shards in Elasticsearch erhöht]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie die Anzahl der primären Shards in Elasticsearch mithilfe der Split- und Reindex-APIs für ein optimales Shard-Skalieren erhöhen können.]]></description>
    <content:encoded><![CDATA[<p>Es ist nicht möglich, die Anzahl der primären Shards eines bestehenden Index zu erhöhen. Das bedeutet, dass ein Index neu erstellt werden muss, wenn Sie die Anzahl der primären Shards erhöhen möchten. In solchen Situationen werden üblicherweise zwei Methoden verwendet: die _reindex API und die _split API.</p><p>Die _split-API ist oft eine schnellere Methode als die _reindex-API. <strong>Die Indizierung</strong> <strong>muss vor beiden Operationen gestoppt werden</strong> , da sich sonst die Dokumentanzahlen in source_index und target_index unterscheiden.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt46dd6abe0e6fe1eb/6a17e368148009d6a7b486d3/aa0ae010c2f5691ca00440fb453ed6b47bacd24f-1200x628.png" alt="Erhöhung der Anzahl der Shards in Elasticsearch durch Neuerstellung eines Index" /><h2>Methode 1 – Verwendung der Split-API</h2><p>Die Split-API wird verwendet, um einen neuen Index mit der gewünschten Anzahl primärer Shards zu erstellen, indem die Einstellungen kopiert und ein vorhandener Index zugeordnet werden. Die gewünschte Anzahl primärer Shards kann bei der Erstellung festgelegt werden. Vor der Implementierung der Split-API sollten folgende Einstellungen überprüft werden:</p><ol><li><p>Der Quellindex muss schreibgeschützt sein. Dies bedeutet, dass der Indexierungsprozess gestoppt werden muss.</p></li><li><p>Die Anzahl der primären Shards im Zielindex muss ein Vielfaches der Anzahl der primären Shards im Quellindex sein. Wenn der Quellindex beispielsweise 5 primäre Shards hat, können die primären Shards des Zielindex auf 10, 15, 20 usw. festgelegt werden.</p></li></ol><p>Hinweis: Wenn nur die Nummer des primären Shards geändert werden muss, ist die Split-API vorzuziehen, da sie wesentlich schneller ist als die Reindex-API.</p><h3>Implementierung der Split-API</h3><p>Erstellen Sie einen Testindex:</p>POST test_split_source/_doc
{
  "test": "test"
}<p>Der Quellindex muss schreibgeschützt sein, um aufgeteilt werden zu können:</p>PUT test_split_source/_settings
{
  "index.blocks.write": true
}<p>Einstellungen und Zuordnungen werden automatisch aus dem Quellindex kopiert:</p>POST /test_split_source/_split/test_split_target
{
  "settings": {
    "index.number_of_shards": 3
  }
}<p>Den Fortschritt können Sie mit folgendem Link überprüfen:</p>GET _cat/recovery/test_split_target?v&amp;h=index,shard,time,stage,files_percent,files_total<p>Da Einstellungen und Zuordnungen aus den Quellindizes kopiert werden, ist der Zielindex schreibgeschützt. Aktivieren wir nun den Schreibvorgang für den Zielindex:</p>PUT test_split_target/_settings
{
    "index.blocks.write": null
}<p>Prüfen Sie die Anzahl der Dokumente (docs.count) im Quell- und Zielindex, bevor Sie den ursprünglichen Index löschen:</p>GET _cat/indices/test_split*?v&amp;h=index,pri,rep,docs.count<p>Indexname und Aliasname dürfen nicht identisch sein. Sie müssen den Quellindex löschen und den Namen des Quellindex als Alias zum Zielindex hinzufügen:</p>DELETE test_split_source
PUT /test_split_target/_alias/test_split_source<p>Nachdem Sie den Alias <strong>test_split_source</strong> zum Index <strong>test_split_target</strong> hinzugefügt haben, sollten Sie ihn wie folgt testen:</p>GET test_split_source
POST test_split_source/_doc
{
  "test": "test"
}<h2>Methode 2 – Verwendung der Reindex-API</h2><p>Durch die Erstellung eines neuen Index mit der Reindex-API kann eine beliebige Anzahl primärer Shards angegeben werden. Nach der Erstellung eines neuen Index mit der gewünschten Anzahl primärer Shards können alle Daten im Quellindex in diesen neuen Index neu indiziert werden.</p><p>Zusätzlich zu den Split-API-Funktionen können die Daten mithilfe der ingest_pipeline im Reindex-AP manipuliert werden. Bei der Ingest-Pipeline werden nur die angegebenen Felder, die dem Filter entsprechen, mithilfe der Abfrage in den Zielindex indiziert. Der Dateninhalt kann mithilfe eines einfachen Skripts geändert werden, und mehrere Indizes können zu einem einzigen Index zusammengeführt werden.</p><h3>Implementierung der Reindex-API</h3><p>Erstellen Sie einen Test-Reindex:</p>POST test_reindex_source/_doc
{
    "test": "test"
}<p>Kopieren Sie die Einstellungen und Zuordnungen aus dem Quellindex:</p>GET test_reindex_source<p>Erstellen Sie einen Zielindex mit Einstellungen, Zuordnungen und der gewünschten Shard-Anzahl:</p>PUT test_reindex_target
{
  "mappings" : {},
  "settings": {
    "number_of_shards": 10,
    "number_of_replicas": 0,
    "refresh_interval": -1
  }
}<p>*Hinweis: Die Einstellung number_of_replicas: 0 und refresh_interval: -1 erhöht die Geschwindigkeit der Neuindizierung.</p><p>Starten Sie den Reindexierungsprozess. Durch die Einstellung requests_per_second=-1 und slices=auto wird die Reindexierungsgeschwindigkeit angepasst.</p>POST _reindex?requests_per_second=-1&amp;slices=auto&amp;wait_for_completion=false
{
  "source": {
    "index": "test_reindex_source"
  },
  "dest": {
    "index": "test_reindex_target"
  }
}<p>Die task_id wird Ihnen beim Ausführen der Reindex-API angezeigt. Kopiere das und überprüfe es mit der _tasks-API:</p>GET _tasks/&lt;task_id&gt;<p>Aktualisieren Sie die Einstellungen, nachdem die Neuindizierung abgeschlossen ist:</p>PUT test_reindex_target/_settings
{
  "number_of_replicas": 1,
  "refresh_interval": "1s"
}<p>Prüfen Sie vor dem Löschen des ursprünglichen Index die Anzahl der Dokumente (docs.count) im Quell- und Zielindex; sie sollte identisch sein.</p>GET _cat/indices/test_reindex_*?v&amp;h=index,pri,rep,docs.count<p>Der Indexname und der Aliasname dürfen nicht identisch sein. Löschen Sie den Quellindex und fügen Sie den Namen des Quellindex als Alias zum Zielindex hinzu:</p>DELETE test_reindex_source
PUT /test_reindex_target/_alias/test_reindex_source<p>Nachdem Sie den Alias test_split_source zum Index test_split_target hinzugefügt haben, testen Sie ihn mit folgendem Befehl:</p>GET test_reindex_source<h2>Zusammenfassung</h2><p>Wenn Sie die Anzahl der primären Shards eines bestehenden Index erhöhen möchten, müssen Sie die Einstellungen und Zuordnungen für einen neuen Index neu erstellen. Hierfür gibt es zwei Hauptmethoden: die Reindex-API und die Split-API. Die aktive Indizierung muss vor Anwendung beider Methoden beendet werden.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-increase-primary-shard-count</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-increase-primary-shard-count</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta8aa774fc00d7233/6a17e223dbb4ff68b3fb5611/7034b76019a0cba52c25eda29fceb18afc96ed0b-720x420.png" length="0" type="image/png"/>
    <pubDate>Thu, 17 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[So migrieren Sie Daten zwischen verschiedenen Versionen von Elasticsearch und zwischen Clustern]]></title>
    <description><![CDATA[Erkunden von Methoden zum Übertragen von Daten zwischen Elasticsearch-Versionen und -Clustern.]]></description>
    <content:encoded><![CDATA[<p>Wenn Sie einen Elasticsearch-Cluster aktualisieren möchten, ist es manchmal einfacher, einen neuen, separaten Cluster zu erstellen und Daten vom alten Cluster auf den neuen zu übertragen. Dies bietet den Benutzern den Vorteil, dass sie alle ihre Daten und Konfigurationen auf dem neuen Cluster mit allen ihren Anwendungen testen können, ohne dass das Risiko von Ausfallzeiten oder Datenverlust besteht.</p><p>Die Nachteile dieses Ansatzes bestehen darin, dass er eine gewisse Duplizierung der Hardware erfordert und bei dem Versuch, alle Daten reibungslos zu übertragen und zu synchronisieren, zu Schwierigkeiten führen kann.</p><p>Ein ähnliches Verfahren kann auch erforderlich sein, wenn Sie Anwendungen von einem Rechenzentrum in ein anderes migrieren müssen.</p><p>In diesem Artikel besprechen und beschreiben wir drei Möglichkeiten zur Datenübertragung zwischen Elasticsearch-Clustern.</p><p><strong>Wie migriere ich Daten zwischen Elasticsearch-Clustern?</strong></p><p>Es gibt drei Möglichkeiten, Daten zwischen Elasticsearch-Clustern zu übertragen:</p><ol><li><p><a href="https://www.elastic.co/de/search-labs/blog/elasticsearch-migrate-data-versions-clusters#1.-reindexing-data-from-a-remote-cluster">Neuindizierung von einem Remote-Cluster</a></p></li><li><p><a href="https://www.elastic.co/de/search-labs/blog/elasticsearch-migrate-data-versions-clusters#2.-transferring-data-using-snapshots">Übertragen von Daten mithilfe von Snapshots</a></p></li><li><p><a href="https://www.elastic.co/de/search-labs/blog/elasticsearch-migrate-data-versions-clusters#3.-transferring-data-using-logstash">Datenübertragung mit Logstash</a></p></li></ol><p>Die Verwendung von Snapshots ist normalerweise die schnellste und zuverlässigste Methode zur Datenübertragung. Bedenken Sie jedoch, dass Sie einen Snapshot nur auf einem Cluster mit gleicher oder höherer Version wiederherstellen können und niemals mit einem Unterschied von mehr als einer Hauptversion. Das bedeutet, dass Sie einen 6.x-Snapshot auf einem 7.x-Cluster wiederherstellen können, aber nicht auf einem 8.x-Cluster.</p><p>Wenn Sie um mehr als eine Hauptversion erhöhen müssen, müssen Sie neu indizieren oder Logstash verwenden.</p><p>Sehen wir uns nun jede der drei Optionen zum Übertragen von Daten zwischen Elasticsearch-Clustern im Detail an.</p><h2>1. Neuindizierung von Daten aus einem Remote-Cluster</h2><p>Bevor Sie mit der Neuindizierung beginnen, denken Sie daran, dass Sie für alle Indizes im neuen Cluster entsprechende Zuordnungen einrichten müssen. Dazu müssen Sie die Indizes entweder direkt mit den entsprechenden Zuordnungen erstellen oder Indexvorlagen verwenden.</p><h3>Neuindizierung von Remote – Konfiguration erforderlich</h3><p>Um eine Neuindizierung aus der Ferne durchzuführen, sollten Sie die folgende Konfiguration zur Datei elasticseearch.yml für den Cluster hinzufügen, der die Daten empfängt. In Linux-Systemen befindet sich diese Datei normalerweise hier: /etc/elasticsearch/elasticsearch.yml. Die hinzuzufügende Konfiguration lautet wie folgt:</p>reindex.remote.whitelist: "192.168.1.11:9200"<p>Wenn Sie SSL verwenden, sollten Sie jedem Knoten das CA-Zertifikat hinzufügen und Folgendes in den Befehl für jeden Knoten in elasticsearch.yml aufnehmen:</p>reindex.ssl.certificate_authorities: “/path/to/ca.pem”<p>Alternativ können Sie allen Elasticsearch-Knoten die folgende Zeile hinzufügen, um die SSL-Verifizierung zu deaktivieren. Dieser Ansatz ist jedoch weniger empfehlenswert, da er nicht so sicher ist wie die vorherige Option:</p>reindex.remote.whitelist: "192.168.1.11:9200"
reindex.ssl.verification_mode: none
systemctl restart elasticsearch service <p>Sie müssen diese Änderungen auf jedem Knoten vornehmen und einen rollierenden Neustart durchführen. Weitere Informationen hierzu finden Sie in <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.17/restart-cluster.html#restart-cluster-rolling">unserem Handbuch</a>.</p><h3>Befehl zur Neuindizierung</h3><p>Nachdem Sie den Remote-Host in der Datei elasticsearch.yml definiert und ggf. die SSL-Zertifikate hinzugefügt haben, können Sie mit dem folgenden Befehl mit der Neuindizierung der Daten beginnen:</p>POST _reindex
{
  "source": {
    "remote": {
      "host": "http://192.168.1.11:9200",
      "username": "elastic",
      "password": "123456",
     "socket_timeout": "1m",
      "connect_timeout": "1m"

    },
    "index": "companydatabase"
  },
  "dest": {
    "index": "my-new-index-000001"
  }
}<p>Dabei können Timeout-Fehler auftreten. Daher kann es sinnvoll sein, großzügige Werte für Timeouts festzulegen, anstatt sich auf Standardwerte zu verlassen.</p><p>Sehen wir uns nun einige andere häufige Fehler an, die bei der Neuindizierung aus der Ferne auftreten können.</p><h3>Häufige Fehler bei der Neuindizierung von Remote</h3><h4>1. Neuindizierung nicht auf der Whitelist</h4>{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "[192.168.1.11:9200] not whitelisted in reindex.remote.whitelist"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "[192.168.1.11:9200] not whitelisted in reindex.remote.whitelist"
  },
  "status": 400
}<p>Wenn dieser Fehler auftritt, bedeutet dies, dass Sie die IP-Adresse des Remote-Hosts oder den DNS-Knotennamen in Elasticsearch nicht wie oben beschrieben definiert haben oder vergessen haben, die Elasticsearch-Dienste neu zu starten.</p><p>Um dies für den Elasticsearch-Cluster zu beheben, müssen Sie den Remote-Host zu allen Elasticsearch-Knoten hinzufügen und die Elasticsearch-Dienste neu starten.</p><h4>2. SSL-Handshake-Ausnahme</h4>{
  "error": {
    "root_cause": [
      {
        "type": "s_s_l_handshake_exception",
        "reason": "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"
      }
    ],
    "type": "s_s_l_handshake_exception",
    "reason": "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target",
    "caused_by": {
      "type": "validator_exception",
      "reason": "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target",
      "caused_by": {
        "type": "sun_cert_path_builder_exception",
        "reason": "unable to find valid certification path to requested target"
      }
    }
  },
  "status": 500
}<p>Dieser Fehler bedeutet, dass Sie vergessen haben, reindex.ssl.certificate_authorities wie oben beschrieben zu elasticsearch.yml hinzuzufügen. So fügen Sie es hinzu:</p>#elasticsearch.yml
reindex.ssl.certificate_authorities: "/path/to/ca.pem"<h2>2. Daten mit Snapshots übertragen</h2><p>Denken Sie daran, dass Sie, wie oben erwähnt, einen Snapshot nur auf einem Cluster einer gleichen oder höheren Version wiederherstellen können und niemals mit einem Unterschied von mehr als einer Hauptversion</p><p>Wenn Sie um mehr als eine Hauptversion erhöhen müssen, müssen Sie neu indizieren oder Logstash verwenden.</p><p>Für die Datenübertragung per Snapshot sind folgende Schritte erforderlich:</p><p>Schritt 1. Hinzufügen des Repository-Plugins zum ersten Elasticsearch-Cluster – Um Daten über Snapshots zwischen Clustern zu übertragen, müssen Sie sicherstellen, dass sowohl vom neuen als auch vom alten Cluster auf das Repository zugegriffen werden kann. Cloud-Speicher-Repositories wie AWS, Google und Azure sind hierfür grundsätzlich ideal. Um Schnappschüsse zu machen, lesen Sie bitte <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/current/snapshot-restore.html">unsere Anleitung</a> und befolgen Sie die darin beschriebenen Schritte.</p><p>Schritt 2. Starten Sie den Elasticsearch-Dienst neu (Rolling Restart).</p><p>Schritt 3. Erstellen Sie ein Repository für den ersten Elasticsearch-Cluster.</p><p>Schritt 4: Fügen Sie das Repository-Plugin zum zweiten Elasticsearch-Cluster hinzu.</p><p>Schritt 5 – Repository als schreibgeschützt zum zweiten Elasticsearch-Cluster hinzufügen – Sie müssen ein Repository hinzufügen, indem Sie dieselben Schritte wiederholen, die Sie zum Erstellen des ersten Elasticsearch-Clusters ausgeführt haben.</p><p>Wichtiger Hinweis: Wenn Sie den zweiten Elasticsearch-Cluster mit demselben AWS S3-Repository verbinden, sollten Sie das Repository als schreibgeschütztes Repository definieren:</p>PUT _snapshot/my_s3_repository
{
  "type": "s3",
  "settings": {
    "bucket": "my-analytic-data",
    "endpoint": "s3.eu-de.cloud-object-storage.appdomain.cloud",
    "readonly": "true"
  }
}<p>Dies ist wichtig, da Sie das Risiko einer Vermischung von Elasticsearch-Versionen im selben Snapshot-Repository vermeiden möchten.</p><p>Schritt 6 – Wiederherstellen der Daten im zweiten Elasticsearch-Cluster – Nachdem Sie die oben genannten Schritte ausgeführt haben, können Sie die Daten wiederherstellen und in den neuen Cluster übertragen. Befolgen Sie die in <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/current/snapshot-restore.html">diesem Artikel</a> beschriebenen Schritte, um Daten im neuen Cluster wiederherzustellen. </p><h2>3. Datenübertragung mit Logstash</h2><p>Bevor Sie mit der Datenübertragung mit Logstash beginnen, denken Sie daran, dass Sie für alle Indizes im neuen Cluster entsprechende Zuordnungen einrichten müssen. Dazu müssen Sie die Indizes entweder direkt erstellen oder Indexvorlagen verwenden.</p><p>Um Daten zwischen zwei Elasticsearch-Clustern zu übertragen, können Sie einen temporären Logstash-Server einrichten und ihn zum Übertragen Ihrer Daten zwischen zwei Clustern verwenden. Für kleine Cluster sollte eine Instanz mit 2 GB RAM ausreichen. Für größere Cluster können Sie Vierkern-CPUs mit 8 GB RAM verwenden.</p><p>Eine Anleitung zur Installation von Logstash <a href="https://www.elastic.co/de/guide/en/logstash/current/installing-logstash.html">finden Sie hier</a>.</p><h3>Logstash-Konfiguration zum Übertragen von Daten von einem Cluster zu einem anderen</h3><p>Eine grundlegende Konfiguration zum Kopieren eines einzelnen Indexes von Cluster A nach Cluster B ist:</p>iinput
{
elasticsearch
      {
        hosts =&gt; ["192.168.1.11:9200"]
        index =&gt; "index_name"
       docinfo =&gt; true      
      }
}

output 
{
  elasticsearch {
        hosts =&gt; "https://192.168.1.12:9200"
        index =&gt; "index_name"
        
  }
}<p>Für eine sichere Elasticsearch können Sie die folgende Konfiguration verwenden:</p>input
{
  elasticsearch
      {
        hosts =&gt; ["192.168.1.11:9200"]
        index =&gt; "index_name"
        docinfo =&gt; true 
        user =&gt; "elastic"
        password =&gt; "elastic_password"
        ssl =&gt; true
        ssl_certificate_verification =&gt; false
            
      }
}

output 
{
  elasticsearch {
        hosts =&gt; "https://192.168.1.12:9200"
        index =&gt; "index_name"
        user =&gt; "elastic"
        password =&gt; "elastic_password"
        ssl =&gt; true
        ssl_certificate_verification =&gt; false
  }
}<h3>Index-Metadaten</h3><p>Die obigen Befehle schreiben in einen einzelnen benannten Index. Wenn Sie mehrere Indizes übertragen und die Indexnamen beibehalten möchten, müssen Sie der Logstash-Ausgabe die folgende Zeile hinzufügen:</p>index =&gt; "%{[@metadata][_index]}"<p>Wenn Sie die ursprüngliche ID des Dokuments beibehalten möchten, müssen Sie außerdem Folgendes hinzufügen:</p>document_id =&gt; "%{[@metadata][_id]}"<p>Bedenken Sie, dass die Datenübertragung durch das Festlegen der Dokument-ID erheblich langsamer wird. Behalten Sie die Original-ID daher nur bei, wenn es unbedingt erforderlich ist.</p><h2>Synchronisierung von Updates</h2><p>Alle oben beschriebenen Methoden dauern relativ lange und Sie stellen möglicherweise fest, dass Daten im ursprünglichen Cluster aktualisiert wurden, während Sie auf den Abschluss des Vorgangs gewartet haben.</p><p>Es gibt verschiedene Strategien, um die Synchronisierung aller Aktualisierungen zu ermöglichen, die während des Datenübertragungsprozesses aufgetreten sind. Sie sollten sich vor dem Starten dieses Prozesses einige Gedanken über diese Probleme machen. Insbesondere müssen Sie über Folgendes nachdenken:</p><ul><li><p>Über welche Methode können Sie Daten identifizieren, die seit Beginn des Datenübertragungsprozesses aktualisiert/hinzugefügt wurden (z. B. ein Feld „last_update_time“ in den Daten)?</p></li><li><p>Mit welcher Methode können Sie die letzten Daten übertragen?</p></li><li><p>Besteht die Gefahr, dass Datensätze dupliziert werden? Normalerweise ist dies der Fall, es sei denn, die von Ihnen verwendete Methode setzt die Dokument-ID während der Neuindizierung auf einen bekannten Wert.</p></li></ul><p>Nachfolgend werden die verschiedenen Methoden zum Aktivieren der Synchronisierung von Updates beschrieben.</p><h3>1. Einsatz von Warteschlangensystemen</h3><p>Einige Aufnahme-/Aktualisierungssysteme verwenden Warteschlangen, die es Ihnen ermöglichen, in den letzten x Tagen empfangene Datenänderungen „wiederzugeben“. Dies kann eine Möglichkeit bieten, alle durchgeführten Änderungen zu synchronisieren. </p><h3>2. Neuindizierung von Remote</h3><p>Wiederholen Sie den Neuindizierungsprozess für alle Elemente, bei denen „last_update_time“ &gt; x Tage her ist. Sie können dies tun, indem Sie der Neuindizierungsanforderung einen „Abfrage“-Parameter hinzufügen.</p><h3>3. Logstash</h3><p>In der Logstash-Eingabe können Sie eine Abfrage hinzufügen, um alle Elemente zu filtern, bei denen „last_update_time“ &gt; x Tage her ist. Dieser Vorgang führt jedoch zu Duplikaten in Nicht-Zeitreihendaten, sofern Sie die Dokument-ID nicht festgelegt haben.</p><h3>4. Schnappschüsse</h3><p>Es ist nicht möglich, nur einen Teil eines Index wiederherzustellen. Sie müssten daher eine der anderen oben beschriebenen Datenübertragungsmethoden (oder ein Skript) verwenden, um alle Änderungen zu aktualisieren, die seit der Durchführung des Datenübertragungsprozesses stattgefunden haben.</p><p>Allerdings ist die Wiederherstellung von Snapshots ein viel schnellerer Prozess als die Neuindizierung/Logstash. Daher ist es möglicherweise möglich, Aktualisierungen für einen kurzen Zeitraum auszusetzen, während Snapshots übertragen werden, um das Problem insgesamt zu vermeiden.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-migrate-data-versions-clusters</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-migrate-data-versions-clusters</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc041ebca11476c6/6a16f70560084b31b93c4344/01fde3b1d714f12bf8673140c9f2f940d443de31-1440x823.jpg" length="0" type="image/jpeg"/>
    <pubDate>Mon, 14 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[So automatisieren Sie Synonyme und laden diese mithilfe unserer Synonym-API hoch.]]></title>
    <description><![CDATA[Erfahren Sie, wie LLMs verwendet werden können, um Synonyme automatisch zu identifizieren und zu generieren, sodass Begriffe programmatisch in die Elasticsearch-Synonym-API geladen werden können.]]></description>
    <content:encoded><![CDATA[<p>Die Verbesserung der Qualität der Suchergebnisse ist unerlässlich für ein effizientes Nutzererlebnis. Eine Möglichkeit zur Optimierung von Suchanfragen besteht darin, die abgefragten Begriffe automatisch durch Synonyme zu erweitern. Dies ermöglicht eine breitere Interpretation von Anfragen, berücksichtigt sprachliche Variationen und verbessert so die Ergebnisübereinstimmung.</p><p>Dieser Blogbeitrag untersucht, wie große Sprachmodelle (LLMs) verwendet werden können, um Synonyme automatisch zu identifizieren und zu generieren, sodass diese Begriffe programmatisch in die Synonym-API von Elasticsearch geladen werden können.</p><h2>Wann verwendet man Synonyme?</h2><p>Die Verwendung von Synonymen kann im Vergleich zur Vektorsuche eine schnellere und kostengünstigere Lösung sein. Die Implementierung ist einfacher, da sie keine tiefgreifenden Kenntnisse über Einbettungen oder einen komplexen Vektor-Ingestionsprozess erfordert.</p><p>Darüber hinaus ist der Ressourcenverbrauch geringer, da die Vektorsuche für die Einbettungsindizierung und den Abruf eine größere Speicherkapazität und einen größeren Arbeitsspeicher benötigt.</p><p>Ein weiterer wichtiger Aspekt ist die Regionalisierung der Suche. Mithilfe von Synonymen ist es möglich, Begriffe an die jeweilige Sprache und die lokalen Gepflogenheiten anzupassen. Dies ist in Situationen nützlich, in denen Einbettungen möglicherweise nicht mit regionalen Ausdrücken oder länderspezifischen Begriffen übereinstimmen. Beispielsweise können manche Wörter oder Akronyme je nach Region unterschiedliche Bedeutungen haben, werden aber von den lokalen Nutzern selbstverständlich als Synonyme behandelt. In Brasilien ist das recht üblich. „Abacaxi“ und „ananás“ bezeichnen die gleiche Frucht (Ananas), wobei der zweite Begriff in einigen Regionen des Nordostens gebräuchlicher ist. Ähnlich verhält es sich mit dem im Südosten bekannten „pão francês“, das im Nordosten als „pão careca“ bekannt ist.</p><h2>Wie kann man LLMs verwenden, um Synonyme zu generieren?</h2><p>Um Synonyme automatisch zu erhalten, können wir LLMs verwenden, die den Kontext eines Begriffs analysieren und passende Variationen vorschlagen. Dieser Ansatz ermöglicht die dynamische Erweiterung von Synonymen und gewährleistet so eine umfassendere und genauere Suche, ohne auf ein festes Wörterbuch angewiesen zu sein.</p><p>In dieser Demonstration verwenden wir ein LLM, um Synonyme für E-Commerce-Produkte zu generieren. Viele Suchanfragen liefern aufgrund von Variationen in den Suchbegriffen nur wenige oder gar keine Ergebnisse. Mit Synonymen können wir dieses Problem lösen. Eine Suche nach „Smartphone“ kann beispielsweise verschiedene Modelle von Mobiltelefonen umfassen, um sicherzustellen, dass die Nutzer die Produkte finden, die sie suchen.</p><h3>Voraussetzungen</h3><p>Bevor wir beginnen, müssen wir die Umgebung einrichten und die erforderlichen Abhängigkeiten definieren. Wir werden die von Elastic bereitgestellte Lösung nutzen, um <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/run-elasticsearch-locally.html">Elasticsearch und Kibana lokal in Docker auszuführen</a>. Der Code wird in Python, Version 3.9.6, mit folgenden Abhängigkeiten geschrieben:</p>pip install openai==1.59.8 elasticsearch==8.15.1<h3>Erstellung des Produktindex</h3><p>Zunächst erstellen wir einen Index der Produkte ohne Synonymunterstützung. Dies ermöglicht es uns, Abfragen zu validieren und sie dann mit einem Index zu vergleichen, der Synonyme enthält.</p><p>Um den Index zu erstellen, laden wir einen Produktdatensatz per Massenimport mit folgendem Befehl in den Kibana DevTools:</p>POST _bulk
{"index": {"_index": "products", "_id": 10001}}
{"category": "Electronics", "name": "iPhone 14 Pro"}
{"index": {"_index": "products", "_id": 10007}}
{"category": "Electronics", "name": "MacBook Pro 16-inch"}
{"index": {"_index": "products", "_id": 10013}}
{"category": "Electronics", "name": "Samsung Galaxy Tab S8"}
{"index": {"_index": "products", "_id": 10037}}
{"category": "Electronics", "name": "Apple Watch Series 8"}
{"index": {"_index": "products", "_id": 10049}}
{"category": "Electronics", "name": "Kindle Paperwhite"}
{"index": {"_index": "products", "_id": 10067}}
{"category": "Electronics", "name": "Samsung QLED 4K TV"}
{"index": {"_index": "products", "_id": 10073}}
{"category": "Electronics", "name": "HP Spectre x360 Laptop"}
{"index": {"_index": "products", "_id": 10079}}
{"category": "Electronics", "name": "Apple AirPods Pro"}
{"index": {"_index": "products", "_id": 10115}}
{"category": "Electronics", "name": "Amazon Echo Show 10"}
{"index": {"_index": "products", "_id": 10121}}
{"category": "Electronics", "name": "Apple iPad Air"}
{"index": {"_index": "products", "_id": 10127}}
{"category": "Electronics", "name": "Apple AirPods Max"}
{"index": {"_index": "products", "_id": 10151}}
{"category": "Electronics", "name": "Sony WH-1000XM4 Headphones"}
{"index": {"_index": "products", "_id": 10157}}
{"category": "Electronics", "name": "Google Pixel 6 Pro"}
{"index": {"_index": "products", "_id": 10163}}
{"category": "Electronics", "name": "Apple MacBook Air"}
{"index": {"_index": "products", "_id": 10181}}
{"category": "Electronics", "name": "Google Pixelbook Go"}
{"index": {"_index": "products", "_id": 10187}}
{"category": "Electronics", "name": "Sonos Beam Soundbar"}
{"index": {"_index": "products", "_id": 10199}}
{"category": "Electronics", "name": "Apple TV 4K"}
{"index": {"_index": "products", "_id": 10205}}
{"category": "Electronics", "name": "Samsung Galaxy Watch 4"}
{"index": {"_index": "products", "_id": 10211}}
{"category": "Electronics", "name": "Apple MacBook Pro 16-inch"}
{"index": {"_index": "products", "_id": 10223}}
{"category": "Electronics", "name": "Amazon Echo Dot (4th Gen)"}<h3>Synonyme mit LLM generieren</h3><p>In diesem Schritt verwenden wir ein LLM, um dynamisch Synonyme zu generieren. Um dies zu erreichen, werden wir die OpenAI-API integrieren und ein geeignetes Modell sowie eine entsprechende Eingabeaufforderung definieren. Der LLM erhält die Produktkategorie und den Produktnamen, wobei darauf geachtet wird, dass die Synonyme kontextuell relevant sind.</p>import json
import logging

from openai import OpenAI

def call_gpt(prompt, model):
    try:
        logging.info("generate synonyms by llm...")
        response = client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": prompt}],
            temperature=0.7,
            max_tokens=1000
        )
        content = response.choices[0].message.content.strip()
        return content
    except Exception as e:
        logging.error(f"Failed to use model: {e}")
        return None

def generate_synonyms(category, products):
   synonyms = {}

   for product in products:
       prompt = f"You are an expert in generating synonyms for products. Based on the category and product name provided, generate synonyms or related terms. Follow these rules:\n"
       prompt += "1. **Format**: The first word should be the main item (part of the product name, excluding the brand), followed by up to 3 synonyms separated by commas.\n"
       prompt += "2. **Exclude the brand**: Do not include the brand name in the synonyms.\n"
       prompt += "3. **Maximum synonyms**: Generate a maximum of 3 synonyms per product.\n\n"
       prompt += f"The category is: **{category}**, and the product is: **{product}**. Return only the synonyms in the requested format, without additional explanations."

       response = call_gpt(prompt, "gpt-4o")
       synonyms[product] = response

   return synonyms<p>Aus dem erstellten Produktindex rufen wir alle Artikel der Kategorie „Elektronik“ ab und senden deren Namen an das LLM. Die erwartete Ausgabe sieht in etwa so aus:</p>{
  "iPhone 14 Pro": ["iPhone", "smartphone", "mobile", "handset"],
  "MacBook Pro 16-inch": ["MacBook", "Laptop", "Notebook", "Ultrabook"],
  "Samsung Galaxy Tab S8": ["Tab", "Tablet", "Slate", "Pad"],
  "Bose QuietComfort 35 Headphones": ["Headphones", "earphones", "earbuds", "headset"]
}<p>Mit den generierten Synonymen können wir diese mithilfe der Synonyms API in Elasticsearch registrieren.</p><h3>Synonyme mit der Synonyms-API verwalten</h3><p>Die Synonyms-API bietet eine effiziente Möglichkeit, Synonymgruppen direkt im System zu verwalten. Jedes Synonymset besteht aus Synonymregeln, nach denen eine Gruppe von Wörtern bei Suchanfragen als gleichwertig behandelt wird.</p><p><strong>Beispiel für die Erstellung eines Synonymsets</strong></p>PUT _synonyms/my-synonyms-set
{
  "synonyms_set": [
    {
      "id": "rule-1",
      "synonyms": "hello, hi"
    },
    {
      "synonyms": "bye, goodbye"
    }
  ]
}<p>
Dadurch entsteht eine Menge namens „meine-Synonyme-Menge“, in der „hello“ und „hi“ sowie „bye“ und „goodbye“ als gleichwertig behandelt werden.</p><h2>Implementierung der Synonymerstellung für den Produktkatalog</h2><p>Nachfolgend ist die Methode aufgeführt, die für den Aufbau eines Synonymsets und dessen Einfügen in Elasticsearch zuständig ist. Die Synonymregeln werden auf der Grundlage der vom LLM vorgeschlagenen Synonymzuordnung generiert. Jede Regel hat eine ID, die dem Produktnamen im Slug-Format entspricht, und die vom LLM berechnete Liste der Synonyme.</p>import json
import logging

from elasticsearch import Elasticsearch
from slugify import slugify

es = Elasticsearch(
    "http://localhost:9200",
    api_key="your_api_key"
)

def mount_synonyms(results):
   synonyms_set = [{"id": slugify(product), "synonyms": synonyms} for product, synonyms in
                   results.items()]

   try:
       response = es.synonyms.put_synonym(id="products-synonyms-set",
                                                 synonyms_set=synonyms_set)

       logging.info(json.dumps(response.body, indent=4))
       return response.body
   except Exception as e:
       logging.error(f"Error create synonyms: {str(e)}")
       return None<p>Nachfolgend die Anfragenutzlast zum Erstellen des Synonymsets:</p>{
   "synonyms_set":[
      {
         "id": "iphone-14-pro",
         "synonyms": "iPhone, smartphone, mobile, handset"
      },
      {
         "id": "macbook-pro-16-inch",
         "synonyms": "MacBook, Laptop, Notebook, Computer"
      },
      {
         "id": "samsung-galaxy-tab-s8",
         "synonyms": "Tablet, Slate, Pad, Device"
      },
      {
         "id": "garmin-forerunner-945",
         "synonyms": "Forerunner, smartwatch, fitness watch, GPS watch"
      },
      {
         "id": "bose-quietcomfort-35-headphones",
         "synonyms": "Headphones, Earphones, Headset, Cans"
      }
   ]
}<p>Nachdem im Cluster ein Synonymset erstellt wurde, können wir zum nächsten Schritt übergehen, nämlich der Erstellung eines neuen Index mit Synonymunterstützung unter Verwendung des definierten Sets.</p><p>Der vollständige Python-Code mit den von LLM generierten Synonymen und der durch die Synonyms-API definierten Erstellung von Synonymsätzen ist unten aufgeführt:</p>import json
import logging

from elasticsearch import Elasticsearch
from openai import OpenAI
from slugify import slugify

logging.basicConfig(level=logging.INFO)

client = OpenAI(
   api_key="your-key",
)

es = Elasticsearch(
    "http://localhost:9200",
    api_key="your_api_key"
)


def call_gpt(prompt, model):
   try:
       logging.info("generate synonyms by llm...")
       response = client.chat.completions.create(
           model=model,
           messages=[{"role": "user", "content": prompt}],
           temperature=0.7,
           max_tokens=1000
       )
       content = response.choices[0].message.content.strip()
       return content
   except Exception as e:
       logging.error(f"Failed to use model: {e}")
       return None


def generate_synonyms(category, products):
   synonyms = {}

   for product in products:
       prompt = f"You are an expert in generating synonyms for products. Based on the category and product name provided, generate synonyms or related terms. Follow these rules:\n"
       prompt += "1. **Format**: The first word should be the main item (part of the product name, excluding the brand), followed by up to 3 synonyms separated by commas.\n"
       prompt += "2. **Exclude the brand**: Do not include the brand name in the synonyms.\n"
       prompt += "3. **Maximum synonyms**: Generate a maximum of 3 synonyms per product.\n\n"
       prompt += f"The category is: **{category}**, and the product is: **{product}**. Return only the synonyms in the requested format, without additional explanations."

       response = call_gpt(prompt, "gpt-4o")
       synonyms[product] = response

   return synonyms


def get_products(category):
   query = {
       "size": 50,
       "_source": ["name"],
       "query": {
           "bool": {
               "filter": [
                   {
                       "term": {
                           "category.keyword": category
                       }
                   }
               ]
           }
       }
   }
   response = es.search(index="products", body=query)

   if response["hits"]["total"]["value"] &gt; 0:
       product_names = [hit["_source"]["name"] for hit in response["hits"]["hits"]]
       return product_names
   else:
       return []


def mount_synonyms(results):
   synonyms_set = [{"id": slugify(product), "synonyms": synonyms} for product, synonyms in
                   results.items()]

   try:
       es_client = get_client_es()
       response = es_client.synonyms.put_synonym(id="products-synonyms-set",
                                                 synonyms_set=synonyms_set)

       logging.info(json.dumps(response.body, indent=4))
       return response.body
   except Exception as e:
       logging.error(f"Erro update synonyms: {str(e)}")
       return None


if __name__ == '__main__':
   category = "Electronics"
   products = get_products("Electronics")
   llm_synonyms = generate_synonyms(category, products)
   mount_synonyms(llm_synonyms)<h3>Erstellen eines Index mit Synonymunterstützung</h3><p>Es wird ein neuer Index erstellt, in dem alle Daten aus dem Index <code>products</code> neu indiziert werden. Dieser Index verwendet <code>synonyms_filter</code>, der den zuvor erstellten <code>products-synonyms-set</code> anwendet.</p><p>Nachfolgend die Indexzuordnung, die für die Verwendung von Synonymen konfiguriert ist:</p>PUT products_02
{
  "settings": {
    "analysis": {
      "filter": {
        "synonyms_filter": {
          "type": "synonym",
          "synonyms_set": "products-synonyms-set",
          "updateable": true
        }
      },
      "analyzer": {
        "synonyms_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "synonyms_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "ID": {
        "type": "long"
      },
      "category": {
        "type": "keyword"
      },
      "name": {
        "type": "text",
        "analyzer": "standard",
        "search_analyzer": "synonyms_analyzer"
      }
    }
  }
}<h3>Neuindizierung des Index <code>products</code></h3><p>Nun werden wir die <strong>Reindex-API</strong> verwenden, um die Daten vom Index <code>products</code> in den neuen Index <code>products_02</code> zu migrieren, der auch Synonymunterstützung beinhaltet. Der folgende Code wurde in den Kibana DevTools ausgeführt:
</p>POST _reindex
{
  "source": {
    "index": "products"
  },
  "dest": {
    "index": "products_02"
  }
}<p>Nach der Migration wird der Index <code>products_02</code> gefüllt sein und kann Suchanfragen mithilfe des konfigurierten Synonymsets validieren.</p><h3>Suche mit Synonymen validieren</h3><p>Lassen Sie uns die Suchergebnisse der beiden Indizes vergleichen. Wir werden die gleiche Abfrage auf beiden Indizes ausführen und überprüfen, ob die Synonyme verwendet werden, um Ergebnisse abzurufen.</p><h4>Suche im Index <code>products</code> (ohne Synonyme)</h4><p>Wir werden Kibana verwenden, um Suchvorgänge durchzuführen und die Ergebnisse zu analysieren. Im Menü „Analytics &gt; Discovery“ erstellen wir eine Datenansicht, um die Daten aus den von uns erstellten Indizes zu visualisieren.</p><p>Klicken Sie innerhalb von Discovery auf Datenansicht und definieren Sie einen Namen und ein Indexmuster. Für den Index "<strong>Produkte</strong>" verwenden wir das Muster "<strong>Produkte</strong> ". Anschließend wiederholen wir den Vorgang, um eine neue Datenansicht für den Index "<strong>products_02</strong>" zu erstellen, wobei wir das Muster "<strong>products_02 "</strong> verwenden.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte826fd932cfeb9df/6a17fdffec0f8912aa5a6841/3ad4a6891a3905e96532a312932fdf3a8216aec2-1600x599.png" alt="" /><p>Nachdem die Datenansichten konfiguriert sind, können wir zu Analytics &gt; Discovery zurückkehren und die Validierungen starten.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltba3729c60068e8a0/6a17fe01e9ea87ba2aa9c82a/422c4b2b51abae6580cad25085d1b8a365fc6b9e-1294x850.png" alt="" /><p>Hier erhalten wir nach Auswahl der DataView-Produkte und einer Suche nach dem Begriff „Tablet“ keine Ergebnisse, obwohl wir wissen, dass es Produkte wie „Kindle Paperwhite“ und „Apple iPad Air“ gibt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2c6a383dd4cb0157/6a17fe02577262671d1bce0c/e4ae3a785fdd93f48d7c7d204185ded149126f2c-1600x862.png" alt="" /><h4>Suche im Index <code>products_02</code> (unterstützt Synonyme)</h4><p>Bei der Durchführung derselben Abfrage in der Datenansicht "<strong>products_synonyms</strong>", die Synonyme unterstützt, wurden die Produkte erfolgreich abgerufen. Dies beweist, dass die konfigurierte Synonymgruppe korrekt funktioniert und sicherstellt, dass verschiedene Variationen der Suchbegriffe die erwarteten Ergebnisse liefern.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt986b4706e2f70014/6a17fe043e9e454edbba16d3/e609749c39e90d5c82fa846af6124679dd62bcb8-1600x526.png" alt="" /><p>Das gleiche Ergebnis lässt sich erzielen, indem man dieselbe Abfrage direkt in den Kibana DevTools ausführt. Suchen Sie einfach im Index products_02 mithilfe der Elasticsearch Search API:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbe829a3c4d7aac60/6a17fe05e8fbce03d73a1bd7/504d0d1f96dcfbceb309063dc0716bcee64ad2f8-1600x870.png" alt="" /><h2>Fazit</h2><p>Die Implementierung von Synonymen in Elasticsearch verbesserte die Genauigkeit und Abdeckung der Produktkatalogsuche. Der entscheidende Unterschied bestand in der Verwendung eines <strong>LLM</strong>, das Synonyme automatisch und kontextbezogen generierte, wodurch die Notwendigkeit vordefinierter Listen entfiel. Das Modell analysierte Produktnamen und Kategorien und stellte dabei relevante Synonyme für den E-Commerce sicher.</p><p>Darüber hinaus vereinfachte die <strong>Synonyms-API</strong> die Wörterbuchverwaltung, sodass Synonymsätze dynamisch geändert werden können. Mit diesem Ansatz wurde die Suche flexibler und besser an unterschiedliche Suchanfragen der Nutzer anpassbar.</p><p>Dieser Prozess kann durch neue Daten und Modellanpassungen kontinuierlich verbessert werden, wodurch ein immer effizienteres Forschungserlebnis gewährleistet wird.</p><h2>Referenzen</h2><p><strong>Elasticsearch lokal ausführen</strong></p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/run-elasticsearch-locally.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/run-elasticsearch-locally.html</a></p><p><strong>Synonyms API</strong></p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/synonyms-apis.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/synonyms-apis.html</a></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-synonyms-automate</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-synonyms-automate</guid>
    <category><![CDATA[Relevanz]]></category>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Andre Luiz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0f0247b9bc1d1ccd/6a17fe07ec0f891c745a6845/05a3cfeaa387561d5334ca3f1609035ddfff7481-1200x628.png" length="0" type="image/png"/>
    <pubDate>Thu, 27 Mar 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Mit Live-Log zum Erfolg: Der neu spezialisierte Logsdb-Indexmodus von Elasticsearch]]></title>
    <description><![CDATA[Die neueste Innovation von Elasticsearch im Bereich Protokollverwaltung, logsdb, reduziert den Speicherbedarf von Protokolldaten um bis zu 65 % und ermöglicht es Observability- und Sicherheitsteams, die Sichtbarkeit zu erweitern, ohne ihr Budget zu überschreiten, während alle Daten zugänglich und durchsuchbar bleiben.]]></description>
    <content:encoded><![CDATA[<h2>Der neue Indexmodus von Elasticsearch, logsdb, reduziert den Log-Speicherbedarf um bis zu 65 %.</h2><p>Heute geben wir die allgemeine Verfügbarkeit des neuen Indexmodus von Elasticsearch, logsdb, bekannt, der <strong>den Speicherbedarf von Protokolldaten im Vergleich zu aktuellen Versionen von Elasticsearch ohne logsdb um bis zu 65 % reduziert</strong> . Diese dramatische Verbesserung ermöglicht es Beobachtungs- und Sicherheitsteams, die Sichtbarkeit zu erweitern, ohne ihr Budget zu überschreiten, und gleichzeitig alle Daten für die Analyse sofort zugänglich zu halten.</p><p>Logsdb optimiert die Datenreihenfolge, eliminiert Duplikate durch die dynamische Rekonstruktion nicht gespeicherter Feldwerte mit <code>synthetic _source</code> und verbessert die Komprimierung mithilfe fortschrittlicher Algorithmen und Codecs. Dabei wird die spaltenorientierte Speicherung in Elasticsearch für eine effiziente Log-Speicherung und -abfrage genutzt.</p><h2>Verbessern Sie die Analytik und senken Sie die Kosten, indem Sie die Speichereffizienz mit dem logsdb-Indexmodus steigern</h2><p>Logs liefern entscheidende Signale zur Erkennung und Behebung von Beobachtbarkeits- und Sicherheitsproblemen — und ihr Nutzen nimmt zu, da Fortschritte in der KI die Analyse textbasierter Daten erleichtern. Daher sind effiziente Speicherung und leistungsstarker Zugriff wichtiger denn je.</p><p>Leider führt das wachsende Log-Volumen, das durch Infrastrukturen und Anwendungen erzeugt wird, zu steigenden Kosten und zwingt zu Kompromissen, die die Analyse behindern: die Erfassung einschränken, die Aufbewahrung reduzieren oder neue Daten in isolierte Archivstufen verschieben.</p><p>Logsdb geht diese Herausforderungen direkt an. Mit größerer Speichereffizienz können Sie mehr Daten erfassen und den Aufwand für komplizierte Datenfilterung vermeiden. Sie können Logs länger aufbewahren, um das Threat-Hunting, die Incident-Response und die Einhaltung von Compliance-Anforderungen zu unterstützen. Und da alle Daten stets durchsuchbar sind, können Sie schnelle Einblicke gewinnen, unabhängig davon, wie groß Ihr Datensatz wird.</p><h2>Technische Innovation hinter dem logsdb-Indexmodus</h2><p>Der logsdb-Indexmodus reduziert den Festplattenbedarf von Log-Daten erheblich durch intelligente Indexsortierung, synthetische _source und erweiterte Komprimierung. Durch die Implementierung kann der Speicherbedarf für Log-Daten um bis zu 65 % reduziert werden, im Vergleich zu neueren Versionen von Elasticsearch ohne logsdb. Obwohl logsdb derzeit bei der Indizierung mehr CPU verwendet, senkt die effiziente Speicherung die Gesamtkosten für die meisten Kunden. Für Kunden, die eine langfristige Speicherung benötigen, erwarten wir eine Reduzierung der Gesamtbetriebskosten (TCO) um bis zu 50 %.</p><p><strong>Durch die intelligente Indexsortierung</strong> wird die Speichereffizienz um bis zu 30 % verbessert und die Abfragelatenz bei einigen Protokolldatensätzen verringert, indem ähnliche Daten nahe beieinander lokalisiert werden. Standardmäßig sortiert es Indizes nach Hostname und @Zeitstempel. Wenn Ihre Daten geeignetere Felder enthalten, können Sie diese stattdessen angeben.</p><p><strong>Erweiterte Komprimierung</strong> reduziert den Speicherbedarf für textlastige Daten wie Protokolle durch Zstandard-Komprimierung (Zstd), Delta-Kodierung, Lauflängenkodierung und andere intelligente Codecs, die automatisch ausgewählt werden, erheblich. Doc-Werte, die in einem für Komprimierung und Leistung optimierten Spaltenformat gespeichert werden, ermöglichen eine effiziente Speicherung und Abfrage von Feldwerten zum Sortieren, Aggregieren und Skripten.</p><p>Mithilfe <strong>von Synthetic _source</strong> können Unternehmen ihren Speicherbedarf um weitere 20–40 % senken, indem sie das _source-Feld verwerfen und es bei Bedarf ganz oder teilweise rekonstruieren. Obwohl die Funktion manchmal mehr Rechenleistung für die Indizierung und Abfrage erfordert, zeigen Tests, dass sie messbare Nettoeffizienzverbesserungen liefert. Synthetic _source basiert auf fast zwei Jahren Produktionseinsatz mit Metriken und bietet zahlreiche Verbesserungen für Protokolle, einschließlich der Unterstützung für fast alle Feldtypen.</p><p>Die resultierenden Speicherplatzeinsparungen werden durch die Phasen des Index-Lebenszyklus weitergegeben. Eine Speicherreduzierung von 65 % in der Hot-Tier-Ebene führt zu einer entsprechenden Reduzierung in den Hot-, Cold- und Frozen-Tiers und verringert auch den Speicherbedarf für Snapshots im Bucket-Speicher.</p><h2>Keine Kompromisse bei der Transparenz: Bewahren Sie alle Logs für die Beobachtbarkeit und Sicherheit auf</h2><p>Logs sind die Basis für die Transparenz von Infrastruktur und Anwendungen und bieten das einfachste und wesentlichste Signal für das Monitoring und die Fehlerbehebung. Allerdings steigen die Kosten, wenn die Logging-Mengen zunehmen. Diese Herausforderung zwingt Kunden dazu, komplexe Filter- und Verwaltungsrichtlinien zu implementieren, Daten vorzeitig zu löschen und relevante Logs in Speichern abzulegen, die einen Tag oder länger benötigen, um vor der Analyse wiederhergestellt zu werden. Ohne einen vollständigen, leicht durchsuchbaren und zugänglichen Datensatz ist es erheblich schwieriger, Probleme zu identifizieren und zu beheben.</p><p>Der Logsdb-Indexmodus basiert auf bahnbrechenden Elasticsearch-Funktionen wie <a href="https://www.elastic.co/de/elasticsearch/elasticsearch-searchable-snapshots">durchsuchbaren Snapshots</a> und <a href="https://www.elastic.co/de/blog/automatic-import-ai-data-integration-builder">automatischem Import</a> , um diese Schwachstellen für Betriebs- und Sicherheitsteams zu beheben:</p><p><strong>Kosten senken: </strong>Logsdb reduziert den Speicherbedarf von Protokollen um bis zu 65 %, sodass Unternehmen ihre Speicherkosten senken und gleichzeitig mehr Daten speichern können. Dies führt zu Kosteneinsparungen auf allen Speicherebenen – von „Hot“ bis „Frozen“ – und einer höheren Produktivität für die Beobachtungs- und Sicherheitsteams, die diese Daten verwenden.</p><p><strong>Bewahren Sie wertvolle Daten auf: </strong>Logsdb speichert alle Ihre Protokolldaten und verbessert die Betriebseffizienz, ohne auf zusätzliche Tools oder komplizierte Filter angewiesen zu sein. Mit Funktionen wie „synthetic_source“ bewahren Sie den Wert der Daten, ohne das gesamte Quelldokument zu speichern.</p><p><strong>Erweitern Sie die Sichtbarkeit:</strong> Logsdb bietet effizienten Zugriff auf alle Daten auf einer Plattform, ohne separate Silos für Beobachtbarkeit, Sicherheit und historische Daten. Für Site Reliability Engineers (SREs) beschleunigt es die Problemlösung, indem es die Analyse von Protokollen neben Metriken, Traces und Geschäftsdaten ermöglicht. Ebenso beschleunigt es für Security Operations Center (SOC)-Teams die Untersuchung und Behebung, indem es blinde Flecken beseitigt.</p><p><strong>Optimieren Sie den Datenzugriff:</strong> Mit Logsdb können SRE-Teams verwertbare Daten zur Fehlerbehebung, Trendanalyse und Analyse effizient speichern. Ebenso können SOC-Teams alle ihre Daten schnell und ohne exorbitante Kosten zu Untersuchungszwecken und zur Bedrohungssuche durchsuchen.</p><h2>Logsdb ist bereit für Ihre Umgebung</h2><p>Der Indexmodus „Logsdb“ von Elasticsearch ist für Kunden mit Elastic Cloud Hosted und Self-Managed ab Version 8.17 allgemein verfügbar und für Protokolle in <a href="https://www.elastic.co/de/elasticsearch/serverless">Elastic Cloud Serverless</a> standardmäßig aktiviert.</p><p>Grundlegende logsdb-Funktionen (einschließlich intelligenter Indexsortierung und erweiterter Komprimierung) sind für Unternehmen mit Standard-, Gold- und Platinum-Lizenzen verfügbar. Vollständige logsdb-Funktionen, die die Speicheranforderungen weiter reduzieren (einschließlich synthetic _source), stehen serverlosen Kunden und Unternehmen mit einer Enterprise-Lizenz zur Verfügung.</p><h2>Elasticsearch logsdb in Aktion</h2><p>Logsdb ermöglicht es Ihnen, alle Ihre Log-Daten zu behalten und die Betriebseffizienz zu verbessern, ohne das Erfassen einzuschränken oder Daten zu verwerfen oder zu isolieren. Mit Funktionen wie intelligenter Indexsortierung, erweiterter Komprimierung und synthetic _source können Sie die benötigten Daten innerhalb eines für Sie passenden Budgets speichern und analysieren.</p><p>Möchten Sie es selbst erleben? <a href="https://cloud.elastic.co/registration">Testen Sie Elastic kostenlos</a>.</p><p><em>Die Entscheidung über die Veröffentlichung der in diesem Blogeintrag beschriebenen Leistungsmerkmale und Features sowie deren Zeitpunkt liegt allein bei Elastic. Es ist möglich, dass noch nicht verfügbare Leistungsmerkmale oder Features nicht rechtzeitig oder überhaupt nicht veröffentlicht werden.</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-logsdb-index-mode</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-logsdb-index-mode</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Mark Settle,George Kobar,Amena Siddiqi]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt982a3c761d66169f/6a17de7c7b54f9788d8b37ff/d3daacafea7a1d78c825a18f8281460c7106d3a5-721x420.png" length="0" type="image/png"/>
    <pubDate>Thu, 12 Dec 2024 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Implementierung der semantischen Suche: Erstellen einer Rezeptsuche mit Elasticsearch]]></title>
    <description><![CDATA[Implementierung der semantischen Suche im Kontext von E-Commerce-Websites.]]></description>
    <content:encoded><![CDATA[<h2>Einleitung</h2><p>Viele E-Commerce-Websites sind daran interessiert, das Sucherlebnis für Rezepte zu verbessern. Die semantische Suche ermöglicht es Kunden bei korrekter Anwendung, die benötigten Zutaten schnell anhand natürlicher Suchanfragen zu finden, wie zum Beispiel „etwas für den Valentinstag“ oder „Thanksgiving-Gerichte“.</p><p>In diesem Artikel zeigen wir, wie man Elasticsearch zur Implementierung einer semantischen Suche nutzt, die solche Anfragen unterstützt. Wir werden einen Index konfigurieren, um den Katalog der Zutaten und Produkte eines Supermarkts zu speichern, und demonstrieren, wie dieser Index zur Verbesserung der Rezeptsuche verwendet werden kann. Im Verlauf des Artikels erklären wir, wie diese Datenstruktur erstellt wird und wie Techniken der natürlichen Sprachverarbeitung angewendet werden, um relevante Ergebnisse zu liefern, die der Absicht des Kunden entsprechen.</p><p>Der gesamte in diesem Artikel vorgestellte Code wurde in Python entwickelt und ist auf <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/building-a-recipe-search-with-elasticsearch">GitHub</a> verfügbar. Sie können auf das Repository zugreifen, um den Quellcode einzusehen, gegebenenfalls Anpassungen vorzunehmen und die Lösungen direkt in Ihrer Entwicklungsumgebung zu implementieren.</p><h2>Beginn der Implementierung der semantischen Suche</h2><p>Um mit der Implementierung der semantischen Suche zu beginnen, müssen wir zunächst das natürliche Sprachmodell definieren. Elastic bietet sein eigenes Modell <a href="https://www.elastic.co/guide/en/machine-learning/8.15/ml-nlp-elser.html"><strong>ELSER</strong></a> an, unterstützt aber auch die Integration von NLP-Modellen verschiedener Anbieter, wie beispielsweise Hugging Face. Diese Flexibilität ermöglicht es Ihnen, die Option zu wählen, die Ihren Bedürfnissen am besten entspricht.</p><p>In diesem Artikel verwenden wir <strong>ELSER</strong>, das die Komplexität der Bereitstellung und Verwaltung von NLP-Modellen reduziert. Darüber hinaus bietet Elastic die Funktion <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search-semantic-text.html"><strong>semantic_text</strong></a> an, die den Prozess erheblich vereinfacht. Mit <strong>semantic_text</strong> wird der gesamte Einbettungsgenerierungsprozess unkompliziert und automatisiert. Sie müssen lediglich einen Inferenzpunkt definieren und das Feld angeben, das die Einbettungen in Ihrer Indexzuordnung aufnehmen soll. Während der Dokumentenindizierung werden Einbettungen generiert und automatisch dem angegebenen Feld zugeordnet.</p><h3>Einrichtungsschritte</h3><p>Nachfolgend sind die Schritte zum Erstellen eines Index mit semantischer Suchunterstützung aufgeführt. Wenn Sie diese Anweisungen befolgen, wird Ihr Index konfiguriert und ist bereit für semantische Suchen:</p><ol><li><p><strong>Erstelle den </strong><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-elser.html"><strong>Inferenzpunkt</strong></a>.</p></li><li><p><a href="https://github.com/andreluiz1987/semantic-search-market/blob/main/infra.py"><strong>Erstellen Sie den Index</strong></a> und setzen Sie das Beschreibungsfeld auf semantic_text, damit er die Einbettungen empfangen kann.</p></li><li><p><a href="https://github.com/andreluiz1987/semantic-search-market/blob/main/ingestion.py"><strong>Die Daten werden im Lebensmittelkatalogindex indexiert</strong></a> , der einen Produktkatalog speichert. Dieser Katalog wurde aus einem <a href="https://www.kaggle.com/datasets/bhavikjikadara/grocery-store-dataset?select=GroceryDataset.csv">hier</a> verfügbaren Datensatz erstellt.</p></li></ol><h2>Anwendung der semantischen Suche in Supermärkten</h2><p>Nachdem wir den Index nun mit Produktdaten aus Lebensmittelgeschäften gefüllt haben, testen und validieren wir Suchanfragen, um die Suchergebnisse mithilfe der semantischen Suche zu verbessern. Unser Ziel ist es, ein intelligenteres Sucherlebnis zu bieten, das den Kontext und die Absicht des Nutzers versteht und relevantere und genauere Ergebnisse liefert.</p><h3>Durch semantische Suche gelöste Herausforderungen</h3><p>Anhand des Produktkatalogs wollen wir untersuchen, wie die semantische Suche das Sucherlebnis in Supermärkten verändern kann, indem sie Vokabel- und Kontextprobleme angeht, mit denen die traditionelle lexikalische Suche oft zu kämpfen hat.</p><h4><strong>1. Interpretation kulinarischer Absichten</strong></h4><p><strong>Problem 01</strong>: Ein Kunde sucht möglicherweise nach „Meeresfrüchte zum Grillen“, aber ein lexikalisches Suchsystem versteht die Absicht hinter der Suchanfrage möglicherweise nicht vollständig. Es kann vorkommen, dass nicht alle zum Grillen geeigneten Meeresfrüchteprodukte erkannt werden und nur diejenigen zurückgegeben werden, die den genauen Begriff „Meeresfrüchte“ oder „Grill“ im Produktnamen enthalten.</p><p>Zunächst führen wir eine lexikalische Suche durch und analysieren die Ergebnisse. Anschließend werden wir das Gleiche mit einer semantischen Suche durchführen und die Ergebnisse für denselben Suchbegriff vergleichen.</p><p><strong>lexikalische Abfrage</strong></p> response = client.search(
        index="grocery-catalog",
        size=5,
        source_excludes="description_embedding",
        query={
            "multi_match": {
                "query": "seafood for grilling",
                "fields": [
                    "name",
                    "description"]
            }
        }
    )<p><strong>Ergebnisse:</strong></p><p>Suchtyp</p><p>Name</p><p>Punktzahl</p><p>Lexikalisch</p><p>Nordwestfisch Alaskan Bairdi Schneekrabbe</p><p>10,453125</p><p>Lexikalisch</p><p>Herr Yoshidas, Sauce Original Gourmet</p><p>7,2289705</p><p>Lexikalisch</p><p>Premium-Meeresfrüchte-Probierpaket – 20 Stück</p><p>7.1924105</p><p>Lexikalisch</p><p>Amerikanischer Roter Schnapper - Ganz, mit Kopf, ausgenommen</p><p>6,998647</p><p>Lexikalisch</p><p>Hummerscheren und -arme, nachhaltig wild gefangen</p><p>6,438654</p><p>Die lexikalische Suche ergab einige Meeresfrüchte, die sich zum Grillen eignen, wie zum Beispiel Amerikanischer Roter Schnapper und Nordwestfisch Alaskan Bairdi Schneekrabbe. Die lexikalische Suche lieferte jedoch weniger relevante Produkte an die Spitze der Liste, wie zum Beispiel die Mr. Yoshida Sauce, die keine Meeresfrüchte-, sondern eine Fleischsauce ist. Dies lässt darauf schließen, dass der lexikalische Algorithmus Schwierigkeiten hatte, den Kontext von „zum Grillen“ vollständig zu verstehen.</p><p><strong>Lösung für semantische Suche</strong></p><p>Wir verwenden eine Abfrage, die den Begriff „Meeresfrüchte“ mit Zubereitungskontexten wie „Grillen“ kombiniert, um eine umfassende Liste von Optionen zurückzugeben, wie zum Beispiel Fischfilets, Garnelen und Jakobsmuscheln, die sich ideal zum Grillen eignen – selbst wenn die Wörter „Grill“ oder „Meeresfrüchte“ nicht direkt im Produktnamen vorkommen. Dadurch wird sichergestellt, dass die Suchergebnisse besser mit den Absichten des Kunden übereinstimmen.</p><p><strong>semantische Suche:</strong></p>es_client.search(
   index="grocery-catalog-elser",
   size=size,
   source_excludes="description_embedding",
   query={
       "semantic": {
           "field": "description_embedding",
           "query": "seafood for grilling"

       }
   })<p>Suchtyp</p><p>Name</p><p>Punktzahl</p><p>Semantisch</p><p>Ganzer, ausgenommener Wolfsbarsch mit Kopf</p><p>16.175909</p><p>Semantisch</p><p>Alaska-Schwarzkabeljau (Sablefisch)</p><p>15,855331</p><p>Semantisch</p><p>Amerikanischer Roter Schnapper - Ganz, mit Kopf</p><p>15,454779</p><p>Semantisch</p><p>Nordwestfisch Alaskan Bairdi Schneekrabbe</p><p>15,855331</p><p>Semantisch</p><p>Amerikanischer Roter Schnapper - Ganz, mit Kopf</p><p>15,3892355</p><p>Die semantische Suche lieferte nicht nur Produkte, die direkt mit dem Begriff „Meeresfrüchte“ in Verbindung standen, sondern verstand auch den Kontext von „Grillen“ und brachte ganze Fische und Filets zum Vorschein, die zum Grillen geeignet sind. Entscheidend ist hierbei die Präzision der Ergebnisse, die auch ganze Fischsorten wie Branzino und Alaska Black Cod umfassten, die beide häufig zum Grillen verwendet werden.</p><p><strong>Problem 02 </strong>: Viele Kunden suchen nach schnellen und einfachen Abendessenlösungen nach einem langen Arbeitstag und verwenden dabei Begriffe wie „einfache Abendessen für die Woche“. Die traditionelle lexikalische Suche erfasst das Konzept der Schnellgerichte möglicherweise nicht vollständig, da sie sich oft nur auf Produkte konzentriert, die das Wort „einfach“ in ihrem Namen enthalten.</p><p>Wie schon in der vorherigen Aufgabe beginnen wir mit einer lexikalischen Suche. Anschließend werden wir eine Lösung mittels semantischer Suche anwenden.</p><p><strong>lexikalische Abfrage</strong></p> response = client.search(
        index="grocery-catalog",
        size=5,   
        source_excludes="description_embedding",
        query={
            "multi_match": {
                "query": "easy weeknight meals",
                "fields": [
                    "name",
                    "description"]
            }
        }
    )<p><strong>Ergebnisse:</strong></p><p>Suchtyp</p><p>Name</p><p>Punktzahl</p><p>Lexikalisch</p><p>Avery Easy Peel Adressetiketten, 4200 Stück</p><p>8,017723</p><p>Lexikalisch</p><p>Omeals Selbsterhitzende Not-/Portable Mahlzeiten 32</p><p>6,592727</p><p>Lexikalisch</p><p>Poke-Brot mit Gelbflossenthunfischwürfeln</p><p>5,836883</p><p>Lexikalisch</p><p>Hefty Super Weight 12 oz Schaumstoff</p><p>5,8116536</p><p>Lexikalisch</p><p>Vanity Fair Alltagsservietten, 2-lagig, 110 Stück</p><p>5,752989</p><p>Die lexikalische Suche lieferte deutlich weniger relevante Ergebnisse, darunter Artikel, die in keinem Zusammenhang mit Mahlzeiten stehen, wie zum Beispiel Avery Easy Peel Adressetiketten und Vanity Fair Everyday Servietten. Diese Produkte erfüllen nicht das Bedürfnis des Nutzers nach schnellen Mahlzeiten. Während die lexikalische Suche ein nützliches Produkt (Omeals Selbstheizende Notfallmahlzeiten) lieferte, enthielten andere Ergebnisse, wie Servietten und Etiketten, in ihren Beschreibungen lediglich die Wörter „einfach“ oder „Wochentag“, ohne wirklich auf die Absicht des Nutzers nach einer schnellen Mahlzeitenlösung einzugehen.</p><p><strong>Lösung für semantische Suche</strong></p><p>Wir haben eine Abfrage implementiert, die die Absicht hinter schnellen und einfachen Mahlzeiten versteht. Es assoziiert Produkte, die schnell zubereitet werden können, wie vorgekochtes Fleisch, Tiefkühlnudeln oder Fertiggerichte, auch wenn sie das Wort „einfach“ nicht explizit im Namen tragen. Dieser Ansatz stellt sicher, dass die Kunden die am besten geeigneten Optionen für ein schnelles Abendessen unter der Woche finden und somit dem Bedürfnis nach Bequemlichkeit gerecht werden.</p><p><strong>semantische Suche</strong></p>es_client.search(
   index="grocery-catalog-elser",
   size=size,
   source_excludes="description_embedding",
   query={
       "semantic": {
           "field": "description_embedding",
           "query": "easy weeknight meals"

       }
   })<p><strong>Ergebnisse:</strong></p><p>Suchtyp</p><p>Name</p><p>Punktzahl</p><p>Semantisch</p><p>Omeals Selbsterhitzende Not-/Portable Mahlzeiten 32</p><p>14.610006</p><p>Semantisch</p><p>Nissin, Cup Noodles, Garnelen, 71 g</p><p>13,751424</p><p>Semantisch</p><p>Namaste Glutenfreie Waffel- und Pfannkuchenmischung</p><p>13,73376</p><p>Semantisch</p><p>Idaho-Kartoffeln, Golden Grill Hashbrown-Kartoffeln</p><p>12,549422</p><p>Semantisch</p><p>Nissin Cup Noodles, Hühnchen, 24er-Packung</p><p>12.034527</p><p>Die semantische Suche ergab Produkte, die eindeutig mit schnellen und praktischen Mahlzeiten in Verbindung stehen, wie zum Beispiel Instantnudeln (Cup Noodles), vorgekochte Kartoffeln und Pfannkuchenmischungen, die typische Optionen für ein einfaches Abendessen unter der Woche sind. Dies beweist, dass die semantische Suche das Konzept hinter dem Ausdruck „einfache Gerichte für die Woche“ erfassen kann und die Absicht des Nutzers erkennt, schnelle und bequeme Mahlzeiten zu finden. Interessanterweise können auch Produkte aus anderen Kategorien, wie zum Beispiel „Limonade“, einbezogen werden, wenn dies im Kontext relevant ist (z. B. Getränke zu Mahlzeiten).</p><h4><strong>2. Regionale Begriffe und Vokabelvariationen</strong></h4><p><strong>Problem</strong>: Ein Kunde sucht möglicherweise nach „Soda“, während ein anderer Kunde für dasselbe Produkt „Pop“ verwendet. Die traditionelle lexikalische Suche erkennt nicht, dass sich beide Begriffe auf denselben Gegenstand beziehen.</p><p><strong>lexikalische Abfrage</strong></p> response = client.search(
        index="grocery-catalog",
        size=5,
        source_excludes="description_embedding",
        query={
            "multi_match": {
                "query": "refreshing pop drink low sugar",
                "fields": [
                    "name",
                    "description"]
            }
        }
    )<p><strong>Ergebnisse:</strong></p><p>Suchtyp</p><p>Name</p><p>Punktzahl</p><p>Lexikalisch</p><p>Prime Hydration+ Sticks Elektrolyt-Getränkemischung</p><p>14,492869</p><p>Lexikalisch</p><p>Capri Sun, 100 % Saft, Probierpackung</p><p>12.340851</p><p>Lexikalisch</p><p>Joyburst Energy Drink, Frose Rose, 12</p><p>11,839179</p><p>Lexikalisch</p><p>Kellogg's Pop-Tarts, Zuckerguss-Zimt</p><p>9,97788</p><p>Lexikalisch</p><p>Kind Mini-Riegel, Probierpackung, 0,7</p><p>9,336912</p><p>Die lexikalische Suche konzentriert sich auf exakte Wortübereinstimmungen. Während Produkte wie Prime Hydration und Capri Sun zurückgegeben wurden, führte die direkte Übereinstimmung mit dem Begriff „Pop“ auch zu irrelevanten Ergebnissen, wie zum Beispiel Kellogg's Pop-Tarts, das ein Snack und kein Getränk ist. Dies verdeutlicht, wie die lexikalische Suche weniger effektiv sein kann, wenn ein Begriff mehrere Bedeutungen hat oder mehrdeutig sein kann.</p><p><strong>Lösung für semantische Suche</strong></p><p>Bei semantischen Anfragen können wir das Problem der Vokabelvariationen überwinden, das bei der lexikalischen Suche nicht gelöst werden kann. Durch die Erweiterung der Suchbegriffe können wir Ergebnisse erzielen, die auf dem Kontext basieren und relevantere und umfassendere Antworten liefern.</p><p><strong>Abfrage:</strong></p>es_client.search(
   index="grocery-catalog-elser",
   size=size,
   source_excludes="description_embedding",
   query={
       "semantic": {
           "field": "description_embedding",
           "query": "refreshing pop drink low sugar"

       }
   })<p><strong>Ergebnisse:</strong></p><p>Suchtyp</p><p>Name</p><p>Punktzahl</p><p>Semantisch</p><p>Olipop 12 oz Präbiotika-Limonade (verschiedene Sorten)</p><p>14,776867</p><p>Semantisch</p><p>Bai Antioxidant Cocofusion, Probierpackung, 18</p><p>14,663253</p><p>Semantisch</p><p>Monster Energy Drink, Zero Ultra, 24</p><p>14,486348</p><p>Semantisch</p><p>Joyburst Energy Variety, 355 ml</p><p>14.007214</p><p>Semantisch</p><p>Joyburst Energy Drink, Frose Rose, 12</p><p>13,641038</p><p>Die semantische Suche liefert Produkte, die direkt dem Konzept von „Pop“ als Synonym für „Soda“ entsprechen (wie z. B. Olipop Prebiotics Soda), auch wenn der genaue Begriff „Pop“ nicht im Produktnamen enthalten ist. Die Suche erkannte die Absicht des Nutzers – ein erfrischendes Getränk mit wenig Zucker – und konnte relevante Produkte zurückgeben, darunter Optionen wie präbiotische Limonaden (Olipop) und zuckerfreie Energy-Drinks (Monster Energy Drink).</p><h2>Fazit</h2><p>Die Implementierung der semantischen Suche im Kontext von Lebensmittelgeschäften hat sich als äußerst effektiv erwiesen, um komplexe Anfragen wie „Meeresfrüchte zum Grillen“ und „einfache Gerichte für die Woche“ zu verstehen. Dieser Ansatz ermöglichte es uns, die Absicht der Nutzer genauer zu interpretieren und ihnen hochrelevante Produkte zurückzugeben.</p><p>Durch den Einsatz von Elasticsearch und die Vereinfachung des Prozesses mit ELSER konnten wir die semantische Suche schnell und effizient implementieren, die Suchergebnisse deutlich verbessern und ein agileres und zielgerichteteres Einkaufserlebnis ermöglichen. Dadurch wurde nicht nur der Suchprozess optimiert, sondern auch die Relevanz der den Kunden angebotenen Ergebnisse erhöht.</p><h2>Referenzen</h2><p>Modell ELSER:</p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/put-inference-api.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/put-inference-api.html</a></p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-elser.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-elser.html</a></p><p></p><p>Semantischer Text:</p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-text.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-text.html</a></p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search.html</a></p><p></p><p>Datensatz:</p><p><a href="https://www.kaggle.com/datasets/bhavikjikadara/grocery-store-dataset?select=GroceryDataset.csv">https://www.kaggle.com/datasets/bhavikjikadara/grocery-store-dataset?select=GroceryDataset.csv</a></p><p></p><p>Semantische Suche:</p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search.html</a></p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search-semantic-text.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search-semantic-text.html</a></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/semantic-search-elasticsearch-ecommerce</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/semantic-search-elasticsearch-ecommerce</guid>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Andre Luiz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5c545fc80b6d79d6/6a170214839dfad776dcfd6f/d968e646240cd3ef7c79b5124d562a5f951d812b-1440x840.png" length="0" type="image/png"/>
    <pubDate>Thu, 07 Nov 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>