Signatur
Beschreibung
SolrDisMaxQuery ist eine spezialisierte Abfrageklasse der PECL-Solr-Erweiterung, die den DisMax-Query-Parser (Disjunction Maximum Query Parser) von Apache Solr kapselt. Dieser Parser ist besonders für benutzerorientierte Suchanfragen geeignet, da er fehlertoleranter gegenüber ungültiger Syntax ist und die Gewichtung einzelner Felder erlaubt.
Im Gegensatz zum Standard-Query-Parser erlaubt DisMax die einfache Definition von Feldgewichtungen (qf-Parameter), Boosting auf Query- und Dokumentebene (bq, bf) sowie die Steuerung des Minimum-Match-Verhaltens (mm). Dies macht ihn ideal für Suchformulare, bei denen Endnutzer einfachen Text eingeben.
Die Klasse erbt alle Methoden von SolrQuery und ergänzt diese um DisMax-spezifische Setter und Getter, etwa für QueryFields, PhraseFields, BoostQuery und MinimumMatch. Zum Einsatz kommt sie zusammen mit einem SolrClient, dessen query()-Methode das fertige Objekt entgegennimmt.
Hinweis: Für den erweiterten eDisMax-Parser steht in neueren Versionen der Solr-Erweiterung alternativ der edismax-Parser-Typ zur Verfügung, der über SolrDisMaxQuery ebenfalls konfiguriert werden kann, indem der Query-Parser-Typ entsprechend gesetzt wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $q | string | Optionaler initialer Suchbegriff, der als Haupt-Querystring (q-Parameter) gesetzt wird. |
Beispiele
Einfache DisMax-Suche mit Feldgewichtungen
<?php
// Solr-Client konfigurieren
$options = [
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/mycore',
];
$client = new SolrClient($options);
// DisMax-Abfrage erstellen
$query = new SolrDisMaxQuery('php entwicklung');
// Felder mit Gewichtung angeben (title boosted mit ^2)
$query->setQueryFields('title^2 description content');
// Mindestens 2 Terme müssen matchen
$query->setMinimumMatch('2');
// Anzahl der Ergebnisse und Startposition
$query->setRows(10);
$query->setStart(0);
// Abfrage senden
$queryResponse = $client->query($query);
$response = $queryResponse->getResponse();
echo 'Gefundene Dokumente: ' . $response['response']['numFound'] . PHP_EOL;
foreach ($response['response']['docs'] as $doc) {
echo $doc['title'] . PHP_EOL;
}
DisMax mit Boost-Query und Phrase-Feldern
<?php
$options = [
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/products',
];
$client = new SolrClient($options);
$query = new SolrDisMaxQuery('notebook ultrabook');
// Felder mit Gewichtung
$query->setQueryFields('name^3 description^1 tags^2');
// Phrasen-Boost: Dokumente, bei denen die Phrase exakt vorkommt, werden hochgestuft
$query->setPhraseFields('name^5 description^2');
// Boost-Query: Neue Produkte bekommen einen Bonus
$query->addBoostQuery('is_new:true', 2.0);
// Boost-Funktion: nach Bewertung gewichten
$query->setBoostFunctions('recip(ms(NOW,date_added),3.16e-11,1,1)');
// eDisMax-Parser verwenden (falls gewünscht)
$query->setQueryParser('edismax');
$query->setRows(5);
$response = $client->query($query)->getResponse();
foreach ($response['response']['docs'] as $doc) {
printf(
"[Score: %.2f] %s\n",
$doc['score'] ?? 0.0,
$doc['name']
);
}
// Wichtig · Fallstricke
Voraussetzung: Die PECL-Erweiterung solr ab Version 2.1.0 muss installiert und aktiviert sein (pecl install solr). Apache Solr muss ebenfalls konfiguriert und erreichbar sein.
Parser-Wahl: Der DisMax-Parser ist fehlertoleranter als der Standard-Lucene-Parser, unterstützt jedoch keine komplexen booleschen Ausdrücke (AND, OR, NOT) direkt in der Nutzeranfrage. Für komplexere Anfragen sollte eDisMax (edismax) über setQueryParser('edismax') aktiviert werden.
Sicherheit: Obwohl DisMax robuster gegenüber Syntaxfehlern ist, sollten Benutzereingaben dennoch validiert und auf Länge begrenzt werden, um übermäßige Server-Last durch extrem lange Anfragen zu verhindern.
Serialisierung: Die Klasse implementiert Serializable; beim Deserialisieren muss sichergestellt sein, dass die Solr-Erweiterung geladen ist.