© istockphoto.com/VLADGRIN
PHP Magazin
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.

Benjamin Cremer


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 CodeAbstrahierung der Datenquelle, um eine Anbindung an Elasticsearch oder Solr zu gewährleistenBessere Performance und Skalierbarkeit auch bei großen DatenmengenSaubere Trennung zwischen Private- und Public-APIGute Erweiterbarkeit durch unser Plug-in-System

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

Definition der SuchkriterienSuchen von passenden Produktnummern anhand von SuchkriterienHolen 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 1class PriceCondition implements ConditionInterface{ public function __construct($minPrice, $maxPrice) { $this->minPrice = $minPrice; $this->maxPrice = $maxPrice; } public function getName() {} public function getMinPrice() {} public function getMaxPrice() {}}

Die Produktnummernsuche

Da wir die Suchanfrage über das Kriterienobjekt f...

PHP Magazin
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.

Benjamin Cremer


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 CodeAbstrahierung der Datenquelle, um eine Anbindung an Elasticsearch oder Solr zu gewährleistenBessere Performance und Skalierbarkeit auch bei großen DatenmengenSaubere Trennung zwischen Private- und Public-APIGute Erweiterbarkeit durch unser Plug-in-System

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

Definition der SuchkriterienSuchen von passenden Produktnummern anhand von SuchkriterienHolen 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 1class PriceCondition implements ConditionInterface{ public function __construct($minPrice, $maxPrice) { $this->minPrice = $minPrice; $this->maxPrice = $maxPrice; } public function getName() {} public function getMinPrice() {} public function getMaxPrice() {}}

Die Produktnummernsuche

Da wir die Suchanfrage über das Kriterienobjekt f...

Neugierig geworden?


   
Loading...

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