2015-10-08 1 views
6

Wir haben einige Dokumente, die mit einem Datum d1 auf einige der Dokumente und d2 auf anderen indiziert sind, und wir wollen auf beiden von denen abhängig davon, welche os zur Verfügung steht.Solr kombinieren Datumsfelder in der Sortierung

sort=d1 desc, d2 desc 

wird das Dokument mit d1 seperat für das Dokument mit d2, wie folgt sortieren:

d1: 2014-03-12 
d1: 2010-03-12 
d2: 2013-03-12 
d2: 2011-03-12 

Was wollen wir alles wie folgt sortiert ist:

d1: 2014-03-12 
d2: 2013-03-12 
d2: 2011-03-12 
d1: 2010-03-12 

Reindizieren alle Dokumente mit Ein neues gemeinsames Feld ist leider keine Option.

Antwort

0

Wie es in this discussion invoqued wurde, können Sie Ihre Daten mit ConcatFieldUpdateProcessorFactory indem sie versuchen, so etwas wie aktualisieren:

<processor class="com.test.solr.update.CustomConcatFieldUpdateprocessorFactory"> 
    <str name="field">d1</str> 
    <str name="field">d2</str> 
    <str name="dest">date</str> 
    <str name="delimiter"></str> 
</processor> 

Danach können Sie versuchen, zu sortieren nach deinem Felddatum.

1

Der Ansatz von Abdul, einen function zu verwenden, ist der richtige Ansatz. Aber die Lösung von Abdul funktioniert nicht für mich.

Ich habe das erfolgreich getestet.

Fügen Sie einfach diesen Parameter auf Anfrage:

sort=max(d1,d2) desc 
0

Zwei Vorschläge, von denen bereits vorgeschlagen wurde:

(1) Verwenden Sie copyField.

<field name="d" type="date" indexed="true" stored="true" multiValued="false"/>  
<copyField source="d1" dest="d" /> 
<copyField source="d2" dest="d" /> 

Auch wenn die d1 und d2 Felder von Bedeutung sind, können Sie immer noch sind sie in der Abfrage, sondern einfach irgendwie auf das fusionierte d Feld.

(2) Abhängig vom Typ Ihrer Datenquelle könnten Sie die Abfrage in Ihrer Datei data-config.xml möglicherweise ändern, um diese beiden Felder zu einem zusammenzuführen. In unserer Umgebung verwenden wir Solr, um Daten von einer MySQL-Instanz zu indexieren. In vielen Fällen werden Daten aus verschiedenen Datenbanken in Solr konsolidiert. Dies führt zu einem ähnlichen Problem, bei dem Daten aus verschiedenen Datenbanken normalisiert werden müssen.In diesen Situationen verwenden wir häufig Konstrukte wie CASE oder IFNULL in unseren Abfragen. Ich kann genauer darauf eingehen, wenn dies auf Ihre Situation zutrifft.

0

Ich hatte ein Problem sehr ähnlich wie Ihres. In meinem Fall hatten alle Dokumente die Felder "d1" und "d2", und alle hatten den Wert "d1". Der Wert "d2" wird verwendet, um den Wert "d1" zu überschreiben.

für diese Meine Lösung ist:

sort=map(ms(d2),0,0,ms(d1)) desc 

Die map(ms(d2),0,0,ms(d1)) die „d2“ Zeitstempel zurück, wenn sie nicht leer ist; Wenn dies der Fall ist, wird stattdessen der Zeitstempel "d1" verwendet.

Ich hoffe, es hilft jemandem.

Verwandte Themen