Ich benutze SOLR, um Dokumente mit einigen Metadaten zu speichern, die aus mehreren Werten bestehen. Normalerweise eine ID mit einem Label. Ein einfaches Beispiel wäre der Name einer Stadt und die eindeutige ID dieser Stadt. Die ID wird benötigt, weil verschiedene Städte den gleichen Namen haben können wie Berlin in Deutschland und Berlin in den USA. Der Name ist offensichtlich erforderlich, da ich nach dieser Zeichenfolge suchen möchte.
Wenn ich Facetten verwende, möchte ich zwei Facetten mit dem Label "Berlin" zurückbekommen. Wenn ich meine Suche (unter Verwendung eines anderen Metadatenfeldes) auf Dokumente aus Deutschland beschränke, würde ich erwarten, nur eine Facette für das deutsche Berlin zu bekommen. Offensichtlich funktioniert das nicht, wenn ID und Label in zwei getrennten SOLR-Feldern gespeichert werden.
Ich würde annehmen, dass dies keine ungewöhnliche Anforderung ist, aber ich konnte keine nützlichen Informationen finden. Meine aktuellen Ansätze sind:
Implementieren Sie einen vollständigen benutzerdefinierten Feldtyp in Java: Für mich schwer zu schätzen, da ich momentan nur ein SOLR-Benutzer und kein SOLR-Entwickler bin.
Setzen Sie ID und Label in eine einzelne Zeichenfolge (wie "123: Berlin" und "456: Berlin") und definieren Sie benutzerdefinierte Feldtypen in schema.xml mit einem benutzerdefinierten Analysator, der den Wert teilt. Sound vernünftig für mich, aber ich bin nicht 100% sicher, ob es mit facettieren funktioniert.
Ich habe einige Verweise auf Unterfelder gefunden, aber nur auf älteren Seiten, und ich konnte keine nützliche Dokumentation finden.
Gibt es einen bekannten Weg, dies in SOLR zu lösen?
Es scheint keine Out-of-the-Box-Lösung zu geben.
Sie können auch Facet-Pivots aktivieren, die eine hierarchische Facettierung
bereitstellen könnenPivot Facettierung kann funktionieren.
Angenommen, Sie haben die Felder: cityId, cityName, country
Machen Sie eine Pivot-Facette über die Stadt-ID, den Stadtnamen mithilfe von Abfrageparametern:
%Vor% Auf der ersten Ebene, wie eine Standard-Facette, erhalten Sie jede Stadt ID. Aber auf der zweiten Ebene erhalten Sie den Namen jeder Stadt. Da jede Stadt-ID nur einen Namen hat, können Sie einfach den Namen jeder Stadt-ID von der nächsten Facetten-Ebene lesen (unter dem pivot
-Element im XML-Code).
Wenn die ID eindeutig ist, haben Sie garantiert nur einen pivot
-Wert auf der zweiten Ebene.
Optional, wenn Sie Ihre "Berliner" zusammen gruppieren möchten, kehren Sie einfach die Reihenfolge der Facettendrehpunkte um und machen Sie Folgendes:
%Vor% und Sie erhalten "Berlin" auf der ersten Ebene und möglicherweise mehrere IDs auf der zweiten Ebene (und als Bonus können Sie eine dritte Ebene country
hinzufügen, so dass Sie das Land für jede Stadt aus der dritten lesen können Ebene).
Das sollte funktionieren. Wenn Sie eine Filterabfrage wie fq=country_name:Germany
hinzufügen, sollten Facetten nur für Städte in Deutschland zurückgegeben werden. Bitte sehen Sie sich das folgende Beispiel an:
Angenommen, Sie haben 4 Felder in Ihrem Schema:
id, city_name, country_name, status_name
SAMPLE DATEN:
id: 1
Stadtname: Berlin
Landname: Deutschland
statusname: Some_State1
id: 2
Stadtname: Berlin
Landname: USA
statusname: Some_State2
id: 3
Stadtname: Dublin
Landname: Irland
statusname: Some_State3
id: 4
Stadtname: Dublin
Landname: USA
statusname: Kalifornien
id: 5
Stadtname: Dublin
Landname: USA
status_name: Virginia
Wenn Sie für alle Städte mit dem Namen Dublin facettiert werden wollen:
%Vor%Im Ergebnis wird die Zählung der Facette Dublin 3 sein
Wenn Sie nun für alle Städte mit dem Namen Dublin facettiert werden und das Land auf USA beschränken möchten, lautet Ihre Suchanfrage:
%Vor%Im Ergebnis wird die Zahl für Facette Dublin 2 sein, weil wir zwei Dublins in den USA haben, eine in Kalifornien und andere in Virginia
HINWEIS: Ich habe & amp; fq = country_name: USA
hinzugefügt Ein eher einfacher Vorschlag: Verwenden Sie zwei Felder zur Indexzeit durch copyField
für Werte wie "123: Berlin"
ein nicht indexed
und stored
Zeichenkettenfeld für Facettierung plus Analyse / Reinigung auf der Client-Seite
und für die Suche verwenden Sie die Kopie 1 indexed
und nicht stored
mit einem einfachen Regex-Analysator in ex: PatternReplaceCharFilterFactory
.
Sie benötigen keine benutzerdefinierten Analysatoren oder neue Feldtypen, wie Sie bereits in Ihrer zweiten Lösung angegeben haben