Die im Abschnitt Facetten-Navigation erklärte Funktionalität wollen wir hier mit einem Praxis-Beispiel auf der dbap-demo Installation illustrieren.
Wir verwenden dazu das bereits konfigurierte Template „FacetedNavigation“ (Templates fassen einen Satz von Konfigurationen für ein bestimmtes Szenario zusammen). Die Konfiguration und Erläuterungen dazu finden sich weiter unten auf dieser Seite.
In unserem Beispiel wollen wir den Navigationsweg eines Nutzer nachvollziehen und sehen mit welchen HTTP-GET Anfragen die Daten bereitgestellt werden.
Das Beispiel kann durch anklicken der jeweiligen Links nachvollzogen werden. Sofern ihr Webbrowser XML-Daten nicht „hübsch“ formatiert/visualisiert gehen Sie bitte auf die Suche nach einem Plugin, welches den Browser um diese Funktionalität erweitert.
item/get?Template=FacetedNavigation
Dieser Aufruf liefert die Daten für den Einstieg in die Navigation. Die Anzahl Produkte pro Seite ist im Template auf „5“ eingestellt (sofern wie hier nicht explizit angegeben). Es werden also 5 Item-Elemente zurückgegeben. Die Zahl der gesamten Items (die braucht man z.B. für die Paginierung) findet sich als Attribut zur Liste:
<ListOfItems TotalNumberOfItems="24">
Einen Überblick über die Möglichkeiten der Filterung generell finden sie unter Filter-Syntax item/get.
item/get?Template=FacetedNavigation&Brand="tlimo"
Der Nutzer hat nun als erstes eine Marke ausgewählt. Welche weiteren Auswahlmöglichkeiten ihm nun zur Verfügung stehen findet man unterhalb des Elementes „ListOfUsedValues“:
<ListOfUsedValuesForItems> <UsedValues CharacteristicIDs="57" CharacteristicDescriptions="Marke" FieldName="Brand"> <Value Active="true">tlimo</Value> <Value>Salto</Value> <Value>Rumps</Value> <Value>Olá</Value> <Value>Donzi</Value> </UsedValues> <UsedValues CharacteristicIDs="18" CharacteristicDescriptions="Eindeutiger Bezeichner" FieldName="Category"> <Value>Energy</Value> <Value>Limo</Value> <Value>Sport</Value> <Value>Wasser</Value> <Value>Wellness</Value> </UsedValues> <!-- Price ausgelassen --> </ListOfUsedValuesForItems>
item/get?Template=FacetedNavigation&Brand="tlimo","Salto"
Nun hat der Nutzer neben der ersten Marke eine weitere ausgewählt. Mehrere Werte für ein Feld werden immer mit „oder“ kombiniert, verschiedene Felder mit „und“. Am Element „MetaInformation“ sehen wir auch die konkrete Abfrage die auf dem NoSQL-Index abgesetzt wurde (hier die Informationen für den nächsten Aufruf):
<MetaInformation> <RequestID>13a99da38f18d5dccfeb879d1ed0a0f7-6660830710548799-20259-35415</RequestID> <Information Name="LuceneQueryTimeInMSecs">2</Information> <Information Name="LuceneRewrittenQuery"> +PredecessorTreeNodeIDs:4 +(+(Brand:tlimo Brand:salto) +ConstantScore(Price:[20.0 TO 30.0]) +Active:true </Information> </MetaInformation>
item/get?Template=FacetedNavigation&Brand="tlimo","Salto"&Price=20 TO 30
Aus den „UsedValues“-Werten zum Feld „Price“ haben wir nun auf unserer imaginären Webseite einen „Preis-Slider“ gebaut und der Kunde hat dort „20 bis 30 Euro“ eingestellt. Wir sehen in der „ListOfUsedValues“, dass die Auswahlmöglichkeiten, die zu einem leeren Ergebnis führen würden, gekennzeichnet sind („Disabled“-Attribut, welche in der Regel als nicht auswählbar („ausgegraut“) einem Nutzer visualisiert werden):
<ListOfUsedValuesForItems> <UsedValues CharacteristicIDs="57" CharacteristicDescriptions="Marke" FieldName="Brand"> <Value Active="true">tlimo</Value> <Value Active="true">Salto</Value> <Value Disabled="true">Rumps</Value> <Value Disabled="true">Olá</Value> <Value Disabled="true">Donzi</Value> </UsedValues> <!-- Feld "Price" der Übersichtlichkeit halber entfernt --> <UsedValues CharacteristicIDs="18" CharacteristicDescriptions="Eindeutiger Bezeichner" FieldName="Category"> <Value Disabled="true">Energy</Value> <Value>Limo</Value> <Value>Sport</Value> <Value Disabled="true">Wasser</Value> <Value Disabled="true">Wellness</Value> </UsedValues> </ListOfUsedValuesForItems>
Da wir eine Produktanzahl pro Seite von „5“ konfiguriert haben wird mit diesem Beispiel auf Seite 2 „geblättert“. Weitere Informationen finden sie auch unter Paginierung und Sortierung.
Die Paginierung kann sowohl in der klassischen Anwendung (auf bestimmte Seite springen) als auch mit AJAX-Technolgie (blockweises nachladen von Produkten beim Scrollen) eingesetzt werden.
http://dbap-demo.dstore.de/default/item/get?Template=FacetedNavigation&Sort=Price_DESC
Dies ist wieder der Einstieg in die Navigation aus dem Beispiel oben, diesmal absteigend nach Preis sortiert. Weitere Informationen finden sie auch unter Paginierung und Sortierung.
Sind die Werte nach denen sortiert wird (wie in unserem Beispiel die Preise) den Artikel-Varianten zugeordnet richtet sich die Sortierung (der Artikel) immer nach dem höchsten bzw. niedrigsten Wert in den Varianten, sonst würde sich ja je nach Sortierung die Anzahl Artikel (Item-Elemente) in der Liste verändern da Variante 1 ggfs. an anderer Stelle als Variante 2 steht (Varianten aber nur unterhalb von Item-Elementen stehen).
Die Freitextsuche mit Relevanzsortierung lässt sich mit der Facetten-Navigation kombinieren. Im folgenden Beispiel gibt der Nutzer zunächst „glas mehrweg“ in ein Suchfeld ein und schränkt dann über eine Marke weiter ein:
item/get?Template=FacetedNavigation&Search=glas mehrweg
item/get?Template=FacetedNavigation&Search=glas mehrweg&Brand=Donzi
<ListOfUsedValuesForItems> <UsedValues CharacteristicIDs="57" CharacteristicDescriptions="Marke" FieldName="Brand"> <Value>tlimo</Value> <Value>Salto</Value> <Value>Rumps</Value> <Value>Olá</Value> <Value Active="true">Donzi</Value> </UsedValues> <!-- Price Werte entfernt --> <UsedValues CharacteristicIDs="18" CharacteristicDescriptions="Eindeutiger Bezeichner" FieldName="Category"> <Value>Limo</Value> <Value Disabled="true">Sport</Value> <Value>Wasser</Value> </UsedValues> </ListOfUsedValuesForItems>
Wir haben das Feld „Category“ in der Konfiguration des Templates als „FilterForUsedValues“ konfiguriert (weitere Erklärung siehe Konfiguration und Parameter item/get). Was passiert wenn man dieses Feld als Filter verwendet sehen wir im Folgenden.
item/get?Template=FacetedNavigation&Category="Energy"
Die Werte unterhalb der „ListOfUsedValues“ enthalten nun keine Werte die aufgrund der Category-Einschränkung eigentlich mit dem „Disabled“-Vermerk versehen wären. Ein Anwendungsbeispiel hierzu: Der Einstieg in die Navigation erfolgt über ein Menü mit allen Kategorien (Wasser, Limo, Ernergy usw.). Nach Auswahl einer Kategorie wollen wir als möglichen Marken-Filter nur Werte haben die in der Kategorie auch vorhanden sind und nicht etwa alle Marken (auch aus anderen Kategorien) von denen die Mehrzahl deaktiviert/„disabled“ ist.
<ListOfUsedValuesForItems> <UsedValues CharacteristicIDs="57" CharacteristicDescriptions="Marke" FieldName="Brand"> <Value>tlimo</Value> <Value>Salto</Value> </UsedValues> <UsedValues CharacteristicIDs="53" CharacteristicDescriptions="Verkaufspreis (EUR)" FieldName="Price"> <Value>1.39</Value> <Value>1.49</Value> </UsedValues> <UsedValues CharacteristicIDs="18" CharacteristicDescriptions="Eindeutiger Bezeichner" FieldName="Category"> <Value Active="true">Energy</Value> </UsedValues> </ListOfUsedValuesForItems>
Templates fassen einen Satz von Konfigurationen für ein bestimmtes Szenario zusammen und werden als Application-Settings eingerichtet.
Wir haben für das Beispiel folgende Einstellungen (Erklärung siehe Abschnitt „Facetten-Navigation“ in Konfiguration und Parameter item/get) verwendet:
Parameter | Wert |
---|---|
Active | 1 |
DomainTreeNodeIDs | 4 |
FilterForUsedValues | Category,Search |
IncludeVariants | 1 |
OnlyMatchingVariants | 1 |
ReturnFieldsForItems | ArticleNumber,ProductDescription,Price |
ReturnFieldsForUsedValues | Brand,Price,Category |
ReturnFieldsForVariants | ArticleNumber,ProductDescription,Price |