Seien Sie dabei!

Als Dienstleister im Markt für Internetanwendungen egal ob browserbasiert oder für das mobile Internet ist die edition-software GmbH eine gute Adresse wenn es um zuverlässige Anwendungen mit einem ausgezeichneten Preis-Leistungsverhältnis geht. Überzeugen Sie sich, sprechen Sie uns gerne an.

Ihre edition-software

Feiner Suchen mit Solr

Wer hat es sich nicht jedesmal beim Öffnen einer Internetseite gewünscht, die Informationen, die jetzt gerade wichtig sind
sofort und ohne langes rumprobieren zu finden. Für wenig strukturierte Daten sind zahlreiche Volltextsuchmaschinen ein sehr geeignetes
Mittel. Allerdings gilt die Suchtechnik (vielleicht abgesehen von den großen Suchmaschinenherstellern) als vergleichsweise dumm, da man nur schwer
strukturiert vorliegende Daten integrieren kann.

In den letzen Jahren hat sich ein Apache Projekt in die Gunst der Softwareentwicklergemeinde gespielt, das mit gleich 2 Vertretern (Solr und ) sehr
sehr geeignet ist auch anspruchsvolle Suchaufgaben umzusetzen. Im Folgenden sollen ein paar Einsatzmöglichkeiten und Ergebnisse aufgezeigt werden.

Es geht um eine Fahrzeugdatenbank mit zehntausenden Fahrzeuge, die jedes für sich sehr viele (bis zu 500) Eigenschaften (Attribute) aufweisen kann. Als Attribute bezeichnen wir jede einzelne Eigenschaft eines Fahrzeuges die suchbar sein soll. Wir unterscheiden zwischen Eigenschaften, die ein Fahrzeug einfach nur haben kann (ja/nein Werte, z.b. elektrische Sitzheizung ja/nein). Attribute mit einer festen Werteliste (z.B. Kraftstoffart Benzin, Diesel, etc), Attributen mit einfacher (z.B. Hersteller) und mehrfacher Zuweisungsmöglichkeit (z.B. Ausstattungen), Eigenschaften mit Zahlenwerten (z.B. Kilometerstand) usw. Ausserdem wollen wir alle Fahrzeugeigenschaften zusätzlich in einem Volltextfeld vorhalten.

Dynamische Felder in Solr

Wir entscheiden uns für den Einsatz von Solr, und wer schon einmal damit gearbeitet hat, weiss, dass wir uns zunächst um ein Datenmodell kümmern müssen.
Üblicherweise werden dazu Felder definiert, die in der Datei schema.xml referenziert werden. Wegen der Vielzahl der Felder entscheiden wir
uns für sog. dynamic field definitions. Damit können mit Hilfe einer Musterdefinition mehrere Felder gleichen Typs mit nur einer Definition bekannt gemacht werden.
Wir verwenden eine Postfixnotation, die den Datentyp angibt:

  <dynamicField name="*.id"  type="int"    indexed="true"  stored="true"/>
  <dynamicField name="*.mid"  type="int"    indexed="true"  stored="true" multiValued="true"/>
 
  <dynamicField name="*.int"  type="tint"    indexed="true"  stored="true"/>
  <dynamicField name="*.float"  type="tfloat"  indexed="true"  stored="true"/>
 
  <dynamicField name="*.txt"  type="text"    indexed="true"  stored="true"/>
  <dynamicField name="*.sort" type="string"  indexed="true"  stored="true"/>

Insgesamt haben wir also 6 Datentypen definiert, die Besonderheit beim Feld *mid ist, dass die darin gespeicherten ID's mehrfach vorhanden sein können (z.B. für Ausstattugen). Wichtig ist auch, dass wir für Sortierzwecke einen eigenen Datentyp *.sort anlegen mit dem Typ string
anderenfalls kann es zu Laufzeitfehlern kommen, da Solr Felder vom Typ text nicht sortieren kann (Tokenisierung). Die Option stored="true" ist eigentlich überflüssig, erleichtert aber das debugging, wenn wir direkt in Solr reinschauen.

Nun können wir unsere Fahrzeuge indexieren, dies bedeutet, dass wir für jedes Fahrzeug ein XML Document erstellen und dieses in Solr einspeisen. Es empfiehlt sich, das einspeisen automatisiert bei jeder Änderung der Fahrzeugdaten zu machen, um eine Konsistenz zwischen der primären SQL basierten Datenhaltung und dem Suchindex im Solr zu behalten.

Hier ein Ausschnitt aus dem entsprechenden XML Document:

<int name="cwa_build_date.int">20080100</int>
 
<float name="cwa_dimensions.length.float">620.0</float>
<int name="cwa_fuel.diesel.id">1</int>
<str name="cwa_fuel.diesel.txt">Diesel</str>
<arr name="cwa_fuel.mid">
  <int>98539</int>
</arr>
 
<int name="cwa_gear.manual_gearbox.id">1</int>
<str name="cwa_gear.manual_gearbox.txt">manuelle Schaltung</str>
<arr name="cwa_gear.mid">
  <int>98532</int>
</arr>

Wir sehen, dass wir die Eigenschaften z.T. mehrfach in unterschiedlichen Feldern speichern, z.B. wird die Eigenschaft, welche Kraftstoffart das Fahrzeug hat in drei verschiedenen Formen gespeichern. Dadurch können wir sehr flexibel unsere Suchanfragen formulieren.

So gerüstet können wir nun unsere ersten Suchen starten. Einen guten Ausgangspunkt bietet der Solr Admin, der beim Deployment eines Solr WAR Files i.d.R. mit dabei ist. Mit der Suchanfrage id:* verschaffen wir uns einen Überblick, ob die Daten korrekt indexiert wurden. Hier können wir auch alle Daten eines konkreten Solr-Datensatzes einsehen.
Die Syntax der Solr Anfragen kann relativ komplex werden, es empfiehlt sich daher, einen entsprechenden Query-Builder vorzusehen, der diese Arbeit erledigt. Neben Klammerungen, UND, ODER und Negationen sind z.B. Bereichssuchen möglich (alle Fahrzeuge die ein Baujahr zwischen 1993 und 1997 haben.)
Diese Anfrage wird in unserem Datenmodell dann etwa so formuliert:

cwa_build_date.int: [19930000 TO 19971200]

Wir können nun also Fahrzeuge über die geschickte Kombination der Kriterien finden. Technisch entspricht dieses Vorgehen den von SQL Datenbanken bekanntet WHERE CLAUSES.

Faceting

Ein wirklich phänomenales Feature stellt das faceting dar. Hierunter wird die Ermittlung der Anzahl der Treffer verstanden, die sich ergeben, wenn zusätzlich zu einer beliebigen Anfrage WHERE CLAUSE noch eine Gruppierung über eine oder mehrere weitere Eigenschaften (Attribute) erfolgt. Aus SQL Sicht handelt es sich also um die GROUP BY CLAUSE. Auf dieses Feature wird bei SQL basierten Suchen gerne verzichtet, da es i.d.r. doch recht performanceintensiv ist. Nicht so bei Solr. Hier kann diese Gruppierung sehr perfomant erreicht werden. Ein Beispiel für ein Stück PHP Code, dass die Anzahl der Fahrzeuge bei gegebener Marke und Modell pro Händler ermittelt:

     $solr_crit = array();
     $solr_crit['cw_status.txt'] = 'online';
     $solr_crit['LINK.cw_lnk_make.txt'] = 'Audi';
     $solr_crit['LINK.cw_lnk_model.txt'] = 'A 6';
     $facets = $c->get_facet_counts($solr_crit, array('LINK.cw_lnk_dealer.id'));

Umgangssprachlich formuliert bedeutet das: Ermittle die Anzahl der Fahrzeuge pro Händler, die die Marke "Audi" und das Modell "A 6" haben.
Mit diesem Feature kann man nun leicht ein "Was wäre wenn" Szenario umsetzen, oder auch eine "Suche verfeinern". Wir haben für das Reisemobil und Caravanportal caraworld.de diese Funktion eingebaut.

Suche verfeinern mit SolrSuche verfeinern mit Solr
Eine produktive Anwendung unter
http://www.caraworld.de/Wohnmobile zeigt einige der Einsatzmöglichkeiten auf. Einfach auf der linken Seite auf die Fahrzeugeingeschaften unter "Suche verfeinern" klicken und dabei die Zahlen (tatsächliche Trefferanzahl) beobachten. Diese werden tatsächlich live bei jedem Klick neu ermittelt und das in einer Geschwindigkeit, die bei SQL basierten Suchen wohl sher schwer zu erreichen ist. Nicht mehr relevante Kriterien (Trefferanzahl 0) werden dabei ausgegraut. So werden Trefferlisten ohne Treffer wirkungsvoll vermieden.

Technologie

02/29/2012 - 18:43
02/29/2012 - 17:43
01/19/2012 - 11:45
04/06/2011 - 08:58
12/21/2010 - 23:28
11/26/2010 - 15:54
11/14/2010 - 10:42