Speichere komplexe Metadaten (d. h. Label + ID) im SOLR-Dokument

8

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?

    
Achim 20.05.2013, 20:38
quelle

4 Antworten

1

Es scheint keine Out-of-the-Box-Lösung zu geben.

  1. Ihre # 2 sollte mit einigen clientseitigen Modifikationen funktionieren.
  2. Sie können Ihre Daten mit id_name als einzelnes Zeichenfolgenfeld indizieren. Muss Änderung zur Indexierungszeit. Einfacher mit Transformers, wenn Sie verwenden DIH.
  3. Sie würden jetzt für jede ID und für den Client eindeutige Facetten haben Seite können Sie die Facets immer zur Anzeige teilen.

Sie können auch Facet-Pivots aktivieren, die eine hierarchische Facettierung

bereitstellen können     
Jayendra 21.05.2013, 05:10
quelle
2

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

%Vor%

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

    
prunge 23.05.2013 06:30
quelle
0

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     
Aujasvi Chitkara 21.05.2013 00:46
quelle
0

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

    
Ion Cojocaru 28.05.2013 14:45
quelle

Tags und Links