Solr in TYPO3: alte Datensätze ausschließen

Ziel: alte Datensätze aus den Trefferlisten verbannen. Wen interessieren uralte News oder Schulungstermine, die bereits vorbei sind? Solr berücksichtigt in der Score-Berechnung zwar das Alter, aber dennoch war die Ergebnisliste mit zu vielen veralteten Treffern überfrachtet.

Lösungsansatz

Relativ einfach lässt sich die Index-Queue der TYPO3-Solr-Extension konfigurieren. Über die additionalWhereClause einfach eine Bedingung setzten, dass das Erstellungsdatum von News-Meldungen innerhalb der letzten 1,5 Jahre liegen muss:

plugin.tx_solr.index.queue {
  pressAnnouncements {
    table = tt_news
    additionalWhereClause = tstamp > UNIX_TIMESTAMP(date_sub(now(), interval 18 month))
  }
}

Prima, wir sind fertig – dachte ich auch. Bald zeigte sich nämlich, dass die Bedingung irgendwie nicht zum gewünschten Ergebnis führte, sondern uralte Meldungen weiterhin gefunden wurden.

So funktioniert das nicht!

Hintergrund

Wenn man etwas darüber nachdenkt, wird die Ursache klar: die Index-Queue bekommt neu zu indizierenden Datensätze ab. Änderungen an Datensätzen veranlassen via Hook ihre Reindizierung. Das Event „Datensatz erreicht ein gewisses Alter“ löst hingegen keine Aktion aus.

Lösung

Solr berücksichtigt Dank eines Plugins die enable-Fields von TYPO3. Also sollte es doch möglich sein, die Endtime eines Datensatzes herzunehmen, um Einträge aus dem Index zu verbannen. Auf der anderen Seite sollen die alten Datensätze aber innerhalbd er Website weiterhin aufrufbar sein – die Endtime zu setzen funktioniert daher doch nicht.

Man bräuchte also zwei unterschiedliche Endtime-Angaben. Und genau das lässt sich bauen:
Die Solr-Extension bringt einen Hook mit, der die Veränderung von Datensätzen vor der Übergabe an den Solr-Server möglicht. Dies ist der
preAddModifyDocuments-Hock innerhalb des IndexQueueIndexer. Dort lässt sich dann z.B. eben der endtime-Wert manipulieren, sodass der Solr-Server einen anderen Ablauftermin sieht, als ihn TYPO3 kennt.

Setzen wir schnell die Puzzle-Teile zusammen:

  1. Hook-Registrieren:
    $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['solr']['IndexQueueIndexer']['preAddModifyDocuments'] = array('\\MyVendorname\\MySolr\\Hooks\\DocumentsModifier\\AccessTimeRange');
  2. Methode schreiben:
    public function modifyDocuments(\ApacheSolrForTypo3\Solr\IndexQueue\Item $item, $language, array $documents)
    {
        foreach ($documents as $k => $document) {
            // If record has already an endtime, there's no need to set a special endtime
            if (!$document->endtime) {
                if ($document->type == 'tt_news') {
                    if ($document->queueTag_stringS == 'pressAnnouncements') {
                        $endtime = new \DateTime($document->created);
                        $endtime->add(date_interval_create_from_date_string('18 months'));
                        $document->addField('endtime', $endtime->format('Y-m-d\TH:i:s\Z'));
                    }
                } 
            }
            $documents[$k] = $document;
        }
        return $documents;
    }

Lösung gefunden. So klappt das.

 

Hat Dir der Beitrag geholfen? Hast Du eine Anmerkung dazu? Oder hast Du eine andere Lösung?
Ich freue mich stets über Feedback.

Hinterlasse einen Kommentar.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.