Vorwort: wieso ein Blog zu PHP, Solr und Lucene?

Wieso ein Blog zu PHP, Solr und Lucene?
Gegenstand und Ausgangspunkt all unserer Aktivitäten auf diesem Gebiet war ein Projekt um ein Nachrichtenportal und die Aufgabe, Recherchen und Analysen im Nachrichtenbestand von über 10 Million News performant zu handeln. Die MySQL Volltextsuche kam da schnell an Ihre grenzen, Oracle war keine Alternative.
Es reifte also die Frage, wie können andere (etwa die Internetsuchmaschiene google) immense Datenmengen spielend handeln?
Wir lösten den MySQL volltext mit Lucene ab. Der Performancegewinn war dramatisch. Suchen im Datenbestand, die vorher über 10 Sekunden dauerten, brauchen mittels Lucene und Solr nur selten mehr als 20ms!
Eine neue Welt tat sich auf, die es zu erobern galt und schnell fiel auf, dass deutschsprachige Seiten zum Thema Mangelware sind. Dies soll sich mit diesem Blog ein wenig ändern.

Sie haben Fragen zu Solr/Lucene/PHP? Schreiben sie uns einen Kommentar!

Donnerstag, 16. Juni 2011

Faceted Search / Analyse der Daten im Volltext

Facetted search ist ein sehr mächtiges und nützliches Feature.
Dabei werden Suchen ggf. nur auf Teilbereiche angewandt und Ergebnisse gruppiert.

1.) Beispiel: Personalverwaltungssystem


Ein sogenanntes Dokument in Lucene (also ein Datensatz) beschreibt einen Arbeitnehmer mit den Eigenschaften (bzw. Felder in Solr/Lucene) Name, Geschlecht, Gehalt, Einstellungsdatum.
Nehmen wir an, im Unternehmen arbeiten 100 Beschäftigte, 51 Frauen, 49 Männer, wobei fast alle Mitarbeiter im letzten Monat eingestellt wurden.
Mit Facette Search kann ich nun gruppieren, etwa nach dem Geschlecht gruppieren lassen. Solr würde dann folgendes Zurück liefern (zur exakten Darstellung: siehe unte beim Referenzbeispiel):
Frauen (51)
Männer (49)
Zur Steigerung kann ich die Einstellungen des letzten Monats analysieren, beispielsweise im Wochenrhythmus. Ergebnisse könnten dann wie folgt aussehen:
16.05.-22.05 (10)
23.05.-29.05 (13)
etc.
Darüber hinaus kann man auch Bereiche definieren, etwa alle Mitarbeiter mit einem Gehalt unter 1500€, dann jene mit >1500€ bis 2900€ und letztlich jene mit 3000€ oder mehr €uronen.

Faceted Search eignet sich insbesondere bei Feldern  mit wenigen/einzelnen Zahlen oder Wörtern, nach denen man die Gesamtheit der Dokumente gruppieren kann.
Aber natürlich kann auch ein faceted Search über die Volltextfelder von Dokumenten angestoßen werden. Je nach Anwendungsfall und gewünschtem Ergebnis

2.) Beispiel: am Referenzobjekt

Unsere Nachrichtendatenbank besteht aus einer Vielzahl von Meldungen. Jede Meldung setzt sich dabei unter anderem aus folgenden Feldern zusammen:
UEBSCHRIFT (die Überschrift "Neuer Computer auf der Cebit vorgestellt")
INDAT (das Eingangsdatum "17.03.2011,14:45.12")
TEXT (der Volltext der Meldung "Auf der Cebit wurde ein neuartiger.....")
THEMA (1 - 5 Stichworte "Cebit/Computer/Vorstellung")

2.1.)  Beispiel an zwei Suchen

1. Suche: Zähle alle Stichworte, die in Verbindung mit Cebit in einer Meldung vorkommen.
Für die Solr URL benötigen wir dazu folgende Parameter:
  •  facet=true <- ein faceted search soll durchgeführt werden
  • fq=THEMA:cebit <- wonach soll in welchem Feld gesucht werden ? Hier nach Cebit im Feld THEMA
  • facet.field=THEMA <- in welchem Feld soll gruppiert werden? Hier: im Feld THEMA
Die dazu gehörende Solr URL sieht wie folgt aus:
http://localhost:8080/solr/select/?fq=THEMA:cebit&facet.field=THEMA&facet=true
..und bringt dieses Ergebnis:
<lst name="facet_counts">
<lst name="facet_queries"/>
   <lst name="facet_fields">
     <lst name="THEMA">
     <int name="cebit">659</int>
     <int name="computer">543</int>
     <int name="messen">433</int>
     <int name="telekommunikation">331</int>
     <int name="vorstellung">120</int>
[...]

2. Suche: Zähle, wie oft das Stichwort Cebit an welchem Tag vorgekommen ist
Da das Eingangsdatum einer jeden Meldung Bestandteil des Dokumentes ist, können wir dies bei der faceted search mit berücksichtigen.
Unser Beispiel aus der 1. Suche muss dabei um folgende Parameter erweitert werden:
  •  facet.date=INDAT <- Welches Feld ist das Datumsfeld, anhand dessen gruppiert werden soll?
  • facet.date.start=NOW-30DAY <- Ab welchem Startdatum soll gesucht werden? Ich beginne vor 30 Tagen
  • facet.date.end=NOW <- Bis wann erstreckt sich das Suchfenster? Bis heute!
  • facet.date.gap=+1DAY <- Gruppierung der Ergebnisse je Tag. Das "+" muss beim direkten aufrufen im Browser ggf. in das Zeichen "%2B" gewandelt werden.
Den Parameter facet.field benötigen wir in diesem Fall nicht, da wir anhand des Datums gruppieren.
Auch hier die zugehörige URL:
http://localhost:8080/solr/select/?fq=THEMA:cebit&facet=true&facet.date=INDAT&facet.date.start=NOW-30DAY&facet.date.end=NOW&facet.date.gap=%2B1DAY
Das Ergebnis sieht dabei im Auszug wie folgt aus:

<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields"/>
   <lst name="facet_dates">
     <lst name="INDAT">
     [...]
     <int name="2011-02-25T12:09:23.353Z">0</int>
     <int name="2011-02-26T12:09:23.353Z">3</int>
     <int name="2011-02-27T12:09:23.353Z">8</int>
     <int name="2011-02-28T12:09:23.353Z">24</int>
     <int name="2011-03-01T12:09:23.353Z">18</int>
     <int name="2011-03-02T12:09:23.353Z">5</int>
     <int name="2011-03-03T12:09:23.353Z">1</int>
     <int name="2011-03-04T12:09:23.353Z">2</int>
     <int name="2011-03-05T12:09:23.353Z">1</int>
[...]

Keine Kommentare:

Kommentar veröffentlichen