Wie man Duplikate aus den Suchergebnissen von Apache Solr entfernt

Solr config

Um Duplikate aus den Suchergebnissen zu entfernen, bietet Solr eine De-Duplication Funktion. De-Duplication in Solr basiert auf der Idee pro Eintrag im Index einen Hash-Wert basierend auf definierten Feldwerten zu erzeugen und diesen dann als Indikator für Duplikate zu verwenden. Das kann sehr nützlich sein, wenn Inhalte über unterschiedliche Urls erreichbar sind - aus Solr-Perspektive sind dies dann zunächst unterschiedliche Inhalte.
Die Einrichtung von De-Duplicate ist einfach: Zunächst muss in der schema.xml des verwendeten Solr-Cores ein neues Feld definiert werden, welches später den Hash enthalten soll:

1
<field name="signatureField" type="string" stored="true" indexed="true" multiValued="false" />

In der solrconfig.xml des Solr-Cores definieren wir als nächstes eine updateRequestProcessorChain, der wir als signatureClass Lookup3Signatur übergeben (das ist ein Hash-verfahren, das performanter als MD5 ist und somit die Crawl-Vorgänge aufgrund der kürzeren Berechnungszeit beschleunigt). Die Felder, über die der Hash gebildet werden soll, definieren wir unter fields und der Hash selbst soll dann in das Feld signatureField geschrieben werden:

1
2
3
4
5
6
7
8
9
10
11
<updateRequestProcessorChain name="dedupe"> 
<processor class="solr.processor.SignatureUpdateProcessorFactory">
<bool name="enabled">true</bool>
<str name="signatureField">signatureField</str>
<bool name="overwriteDupes">false</bool>
<str name="fields">content</str>
<str name="signatureClass">solr.processor.Lookup3Signature</str>
</processor>
<processor class="solr.LogUpdateProcessorFactory" />
<processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>

Die neue updateRequestProcessorChain wird anschließend dem update-requestHandler bekanntgemacht:

1
2
3
4
5
<requestHandler name="/update" class="solr.UpdateRequestHandler" >
<lst name="defaults">
<str name="update.chain">dedupe</str>
</lst>
</requestHandler>

Wenn das nächste mal der Index neu geschrieben oder aktualisiert wird, dann hat jeder neue Eintrag im Index ein neues Feld, welches den Hash beinhaltet, der auf dem Inhalt ‘content’ basiert.
Damit doppelte Einträge aus der Suche verschwinden, muss bei Suchanfragen Gebrauch von der Filterfunktion gemacht werden. Das geht ganz einfach indem an die Url folgender Parameter angefügt wird:

fq={!collapse field=signatureField}

Weitere Informationen finden sich in der Apache Solr Dokumentation.