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