Signatur
Beschreibung
SolrCollapseFunction ist Teil der PHP-Solr-Erweiterung und bildet die Solr-CollapsingQParser-Funktion ab. Mit ihr lassen sich Suchergebnisse auf Dokumentgruppen reduzieren, wobei aus jeder Gruppe nur ein repräsentatives Dokument zurückgegeben wird – etwa das Dokument mit dem höchsten Score oder einem bestimmten Feldwert.
Typische Anwendungsfälle sind Produktkataloge, bei denen pro Produktgruppe nur das günstigste oder relevanteste Ergebnis angezeigt werden soll. Das Collapse-Feld muss ein einwertiges, indiziertes Feld vom Typ int, float oder string sein.
Die erzeugte Funktion wird über SolrQuery::setCollapse() an eine Solr-Abfrage übergeben. Die interne Darstellung der Funktion entspricht der Solr-Syntax {!collapse field=... ...} und wird beim Senden der Anfrage automatisch serialisiert.
Neben dem Pflichtfeld können optionale Parameter wie min, max, nullPolicy und hint gesetzt werden, um das Verhalten beim Zusammenfassen zu steuern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $field Pflicht | string | Der Name des Solr-Feldes, nach dem die Dokumente zusammengefasst werden sollen. Muss ein einwertiges, indiziertes Feld sein. |
Beispiele
Einfaches Collapsing nach einem Kategoriefeld
<?php
// Verbindung zu Solr herstellen
$options = [
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/mycore',
];
$client = new SolrClient($options);
// Solr-Abfrage erstellen
$query = new SolrQuery('*:*');
$query->setRows(10);
// Collapse-Funktion: Pro Kategorie nur ein Dokument zurückgeben
$collapse = new SolrCollapseFunction('category_id');
// An die Abfrage übergeben
$query->setCollapse($collapse);
$response = $client->query($query);
$result = $response->getResponse();
echo 'Anzahl Gruppen: ' . $result['response']['numFound'] . PHP_EOL;
Collapsing mit Min-Score und NullPolicy
<?php
$options = [
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/products',
];
$client = new SolrClient($options);
$query = new SolrQuery('*:*');
$query->setRows(20);
// Collapse-Funktion: Pro Marke das Dokument mit dem günstigsten Preis behalten
$collapse = new SolrCollapseFunction('brand_id');
// Dokument mit dem kleinsten Preis je Gruppe auswählen
$collapse->setMin('price');
// Dokumente ohne Wert im Collapse-Feld trotzdem einbeziehen
$collapse->setNullPolicy(SolrCollapseFunction::NULLPOLICY_EXPAND);
// Hint für bessere Performance bei großen Ergebnismengen
$collapse->setHint(SolrCollapseFunction::HINT_TOP_FC);
$query->setCollapse($collapse);
echo (string) $collapse; // Gibt die Solr-Syntax aus
// Wichtig · Fallstricke
Voraussetzung: Die PHP-Solr-Erweiterung (pecl/solr) ab Version 2.2.0 sowie ein laufendes Apache Solr mit aktiviertem CollapsingQParserPlugin sind erforderlich.
Feldtypen: Das Collapse-Feld muss ein einwertiges Feld sein. Multivalued Fields werden nicht unterstützt und führen zu Fehlern auf der Solr-Seite.
Performance: Bei sehr großen Indizes empfiehlt sich die Verwendung von setHint(SolrCollapseFunction::HINT_TOP_FC), um den Field-Cache zu nutzen und die Abfragegeschwindigkeit zu verbessern.
Die Klasse stellt folgende Klassen-Konstanten bereit: SolrCollapseFunction::NULLPOLICY_IGNORE, SolrCollapseFunction::NULLPOLICY_EXPAND und SolrCollapseFunction::NULLPOLICY_COLLAPSE für den Umgang mit Dokumenten ohne Feldwert, sowie SolrCollapseFunction::HINT_TOP_FC als Performance-Hinweis.