© istockphoto.com/VLADGRIN
Die skalierbare und erweiterbare Produktsuche in Shopware 5

Clever gesucht


Das Suchen und Finden von Produkten ist ein essenzieller Bestandteil jedes Onlineshops. Für Shopware 5 haben wir uns die Frage gestellt, wie Produktdaten effektiver und skalierbarer vom System gefunden und ausgelesen werden können.

Im Zuge des Releases von Shopware 5 haben wir die Chance ergriffen, die Produktsuche umfassend zu refaktorieren, Altlasten wie doppelten Code loszuwerden sowie die Erweiterbarkeit zu verbessern und somit die Grundlagen für eine Anbindung an Search Engines wie Elasticsearch zu schaffen. Ziele der Entwicklung waren unter anderem:

  • Vermeidung von doppeltem Code

  • Abstrahierung der Datenquelle, um eine Anbindung an Elasticsearch oder Solr zu gewährleisten

  • Bessere Performance und Skalierbarkeit auch bei großen Datenmengen

  • Saubere Trennung zwischen Private- und Public-API

  • Gute Erweiterbarkeit durch unser Plug-in-System

Um diese Ziele zu erreichen, haben wir den Suchvorgang in folgende Bereiche separiert:

  • Definition der Suchkriterien

  • Suchen von passenden Produktnummern anhand von Suchkriterien

  • Holen der Produktdaten für die zuvor gefundenen Produktnummern

Definition der Suchkriterien

Die Formulierung der Suchanfrage geschieht über ein Kriterienobjekt. Dieses Objekt ist ein Container für eine variable Anzahl an Kriterien, die eine Suchanfrage erfüllen muss. Die einzelnen Kriterien sind einfache PHP-Objekte; einzig die Methode getName wird über das ConditionInterface vorgegeben.

Diese Klassen haben domänenspezifische Namen. So gibt es beispielsweise eine ShippingFreeCondition, die aussagt, dass die Produkte frei von Lieferkosten sind. Kriterien können auch über weitere Parameter verfügen, z. B. die PriceCondition, die als Parameter den minimalen und den maximalen Preis der Produkte einschränkt. Diese Condition-Objekte sollten keine komplexe Logik beinhalten. Zu den Einschränkungen können dem Kriterienobjekt noch ein Limit, Offset und Sortierungen mitgegeben werden.

Durch diese abstrakte und domänenspezifische Abbildung der Suchaufgabe wird eine hohe Lesbarkeit erreicht:

$criteria = new Criteria(); $criteria->limit(10); $critiera->addCondition(new SearchTermCondition("Strandtuch")); $criteria->addCondition(new CategoryCondition([3, 5])); $criteria->addCondition(new PriceCondition($minPrice, $maxPrice)); $criteria->addSorting(new PriceSorting(SortingInterface::SORT_ASC));

Schauen wir uns in Listing 1 die Klasse PriceCondition nun genauer an.

Listing 1

class PriceCondition implements ConditionInterface { public function __construct(...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang