Ditegra GmbH Logo
Smart Solutions
Case Studies
Agency
Jobs
Contact
  • EN
  • DE
  1. Knowledge
  2. Elasticsearch

Table of contents

  • Prepare Local Environment
  • Commands, Product Index & Important Functions
  • Conclusion

back

Improve your Shopware Search with Elasticsearch

Viele Shop-Besitzer sind unzufrieden mit der Standard-Suchfunktionalität von Shopware im Frontend. Die Geschwindigkeit der Suchergebnisse ist bei einigen Begriffskombinationen problematisch, und die Ergebnisse sind manchmal nicht nützlich für bestimmte Suchmuster von Kunden. Darüber hinaus kann die Gesamtleistung des Shops, insbesondere bei einer großen Anzahl von Produkten, mit Elasticsearch erheblich verbessert werden. Während es keinen Zweifel daran gibt, dass Elasticsearch die Leistung verbessert, habe ich keine genauen Messungen für die Anzahl der Produkte, bei denen Elasticsearch unverzichtbar wird.

Ich plane, Messungen durchzuführen, um zu sehen, wie sich der Shop mit unterschiedlichen Produktmengen verhält, und werde diesen Blog aktualisieren, sobald dies geschehen ist. Nach meiner Erfahrung benötigen Shops mit mehr als 50.000 Produkten unbedingt Elasticsearch. Es war auffällig, dass der Shop extrem langsam war, wenn die Warteschlange mit Indexierungsmeldungen voll war, aber nach dem Wechsel zu Elasticsearch war dieses Verhalten nicht mehr reproduzierbar.

Ob Sie zu Elasticsearch wechseln oder ein Plugin erstellen möchten, das Elasticsearch-Abfragen an Ihre Bedürfnisse anpasst, Sie werden wahrscheinlich eine lokale Umgebung für Tests einrichten müssen, bevor Sie bedeutende Änderungen an einem produktiven Shop vornehmen.

Bevor wir fortfahren, ist es erwähnenswert, dass dieser Blog Elasticsearch selbst nicht erklärt, aber Sie sollten dennoch folgen können.


Prepare Local Environment

As a first step, if you want to test Elasticsearch for a specific shop, check the Elasticsearch version on the server. On Timmehosting, for example, you can easily activate/deactivate Elasticsearch out of the box (localhost:9200). Here is the link.

If Elasticsearch is active and you have access to the server, you can check the version via the console:

curl -XGET "localhost:9200"

You will get a response that looks like this:

Eine Übersicht über die Elasticsearch-Version, Nodes, Indizes, Action Buttons und die Konsole finden Sie auch im Elasticsearch-Tab eines großartigen kostenlosen Plugins von Friends Of Shopware: Frosh Tools.

Jetzt wissen wir, welche Version wir in unserer lokalen Umgebung installieren möchten. Wenn Tests zeigen, dass eine Version besser ist als eine andere oder wenn eine höhere Version von Shopware benötigt wird, können wir natürlich die Elasticsearch-Version auf dem Server aktualisieren.

Unsere Docker-Umgebung wird drei Container haben: SW6.6, Elasticsearch und Kibana.

Die docker-compose.yaml sieht so aus:

For the Shopware container, I use dockware's dev image and official images for Elasticsearch and Kibana. Note that the Elasticsearch and Kibana versions must match.

To execute the previous command locally, note that our container is called "es," so the command would be:

CURL -XGET "es:9200"

However, from now on, we will not write CURL requests because we have Kibana Dev Tools at http://localhost:5601/app/dev_tools#/console, which is much more user-friendly.

The first query would be to see our indices:

GET _cat/indices?v
  • _cat (Compact and Aligned Text) is an API that outputs data in a human-readable format.
  • indices tells Elasticsearch that we want to see our indices.
  • ?v is a verbose parameter that provides a header over the columns describing what the columns show (health, status, etc.).

Initially, none of these listed indices are useful; they are just default settings of Kibana and Elasticsearch. To create an index that contains useful data about an entity (like products), we need to connect Shopware with Elasticsearch.

Shopware already has great documentation here, so I will keep it simple and show my example configuration.

Die Einstellungen der .env-Datei sind ziemlich selbsterklärend, aber es sollte erwähnt werden, dass OPENSEARCH_URL es:9200 ist, da dies der Name meines Containers ist. In einem echten Shop wird dies anders sein; zum Beispiel wäre es bei Timmehosting localhost:9200. Die SHOPWARE_ES_INDEXING_BATCH_SIZE ist standardmäßig auf 100 eingestellt, aber aus persönlicher Vorliebe ändere ich sie immer auf 500.

Änderungen an elasticsearch.yaml sind optional, aber es ist erwähnenswert, dass standardmäßig number_of_shards und number_of_replicas auf 3 gesetzt sind. Es gibt viele konfigurierbare Optionen in elasticsearch.yaml, abhängig von Ihrer Vertrautheit mit Elasticsearch. Optionen und Standardkonfigurationen finden Sie unter vendor/shopware/elasticsearch/Resources/config/packages/elasticsearch.yaml.

Die lokale Umgebung ist jetzt vorbereitet. Lassen Sie uns im nächsten Abschnitt tiefer eintauchen.


Befehle, Produktindex & Wichtige Funktionen

Als ersten Schritt werde ich xDebug einrichten, den Worker lokal deaktivieren und messenger:consume manuell ausführen, da dies mehr Kontrolle beim Debuggen von Code bietet, der durch die Nachrichten ausgeführt wird.

Almost everything we need to know can be found inside ElasticsearchProductDefinition.php. Set breakpoints in all three public functions (getMapping, buildTermQuery, and fetch) to get familiar with the process.

  • getMapping defines the mapping, a blueprint for how a document is indexed and how fields are stored.
  • fetch actually fetches the products and returns documents.
  • buildTermQuery defines the query used to return products based on a given term in the search bar.

With breakpoints set and the messenger:consume command running, open an additional terminal and run:

bin/console es:index

It doesn't make sense to cover code reading, debugging, and explaining the code in a blog, so I hope you took some time to debug and follow the logic because a lot happened with that command. Your listing pages now show products, and your search bar returns results because we now have product indices.

If you run GET _cat/indices?v again, you will see a new entry: product index. We now have a product index with the prefix from the .env file and a Unix timestamp.

You can check the product mapping with the following query in Kibana:

GET /blog_product/_mapping

Now let us take a look at one product:

Ein bisschen off-topic, aber dieses Bild zeigt einen weiteren großen Vorteil der Verwendung von Kibana – wir können beliebig viele Abfragen vorbereiten und auswählen, welche ausgeführt werden sollen.

Beim Debuggen werden Sie möglicherweise bemerken, dass innerhalb der Funktion getMapping() ein interessanter Abschnitt übersprungen wird, weil unsere APP_ENV auf dev gesetzt ist.

If you switch to the prod environment, you will see only id and autoIncrement. Note that if you want the same product index in the prod environment as shown previously, you can add SHOPWARE_ES_EXCLUDE_SOURCE=1 in the .env file. However, let's go with the default values, so I will switch APP_ENV to prod (with default SHOPWARE_ES_EXCLUDE_SOURCE=0) in the .env file. Now, run the following commands to remove current indices and create new ones:

bin/console es:reset 

bin/console es:index

Now it looks like this:

Es mag kontraintuitiv erscheinen, da es so aussieht, als würde nur die id-Suche funktionieren, aber die Suche funktioniert völlig normal, da alle Felder indexiert und durchsuchbar sind; sie befinden sich nur nicht im _source, um Speicherplatz zu sparen. Welche Felder durchsuchbar sind und wie die Ranking-Bewertung erfolgt, kann in der Administration angepasst werden.

Including/Excluding fields from _source is a feature that allows content pruning of the _source field after the document has been indexed but before the _source field is stored. You can read more about this topic here.

In a production environment, you would just need two more daily Cron jobs to run these commands:

bin/console es:index 

bin/console es:index:cleanup -f


Fazit

Elasticsearch verbessert die Leistung erheblich, und wenn Sie mit Elasticsearch vertraut sind, kann es auf viele Arten angepasst werden, um die perfekte Suche für Ihren Shop zu erreichen. Die Suche sollte schneller funktionieren, wenn Felder im _source enthalten sind, aber viele Produktfelder sind für die Suche irrelevant, sodass es von den persönlichen Vorlieben abhängt. Sie könnten ein Plugin mit einem Decorator erstellen, um Elasticsearch an Ihre Bedürfnisse anzupassen. Zum Beispiel können Sie das "include"-Array erweitern und nur relevante Produktfelder hinzufügen, was schnellere Ergebnisse liefern und dennoch den Speicherplatz niedrig halten könnte. Sie können Abfragen modifizieren und alles Mögliche tun, solange Sie wissen, was Sie tun. Es wäre eine Verschwendung, eine so leistungsstarke Suchmaschine wie Elasticsearch nicht zu nutzen, wenn Shopware sie bereits unterstützt.


Haben Sie Fragen oder Feedback zum Artikel oder möchten Sie mehr über uns erfahren? Ich freue mich darauf, von Ihnen per E-Mail oder LinkedIn zu hören!

Darko Popovic

Darko Popovic

Entwickler

Über mich

Dev.


Über ditegra GmbH

Ihr strategischer Partner für E-Commerce Lösungen


Als zertifizierte Shopware-Agentur spezialisieren wir uns auf die Entwicklung, Gestaltung und Migration von Online-Shops mithilfe von Shopware 6, beginnend mit dem allerersten Veröffentlichungsdatum. Wir bieten ein umfassendes Spektrum an Dienstleistungen für Ihren Online-Shop – kein Projekt ist uns zu klein oder zu groß.

Als Shopware Silver Partner garantieren wir einen Rundum-Service, der die Planung und Realisierung neuer Shops, Shop-Migrationen, sowie die Entwicklung von Plugins und Templates umfasst. Darüber hinaus unterstützen wir Sie mit regelmäßigen Shop-Updates. Wir legen großen Wert auf eine ausführliche Beratung und sind stets Ihr erster Ansprechpartner.

e-commerce solutions

As a certified shopware agency, we support you with the development, migration, and optimization of your online shop. From initial planning to ongoing support – with ditegra, you have a strong partner at your side. 🚀

Westendstraße 3 78315 Radolfzell

+49 (0) 7732 - 890 35 18 info@ditegra.de

Information

  • News
  • Legal notice
  • Data protection
  • Glossar
  • Newsletter
  • Knowledge
  • Docs

E-Commerce

  • Agency
  • Migration
  • Plugins & Apps
  • Services
  • Support & Maintenance

Online marketing

  • Online marketing
  • Search engine optimization
  • Google Ads
  • Microsoft Ads
  • Comparison Shopping Service (CSS)
  • Affiliate Marketing
  • Conversion Rate Optimierung

Partners and awards

Realised with Shopware Composable Frontends

© 2025, ditegra GmbH. All rights reserved.