Signatur
Beschreibung
SolrQuery ist die zentrale Klasse des PHP-Solr-Erweiterungspakets (PECL solr), mit der strukturierte Suchanfragen an einen Apache-Solr-Server formuliert werden. Sie kapselt alle Suchparameter — von der Hauptabfrage über Filterabfragen, Facettierung, Highlighting bis hin zu Sortierung und Paginierung — in einem einzigen Objekt.
Eine Instanz von SolrQuery wird typischerweise erstellt, konfiguriert und anschließend an die Methode SolrClient::query() übergeben. Die Klasse erbt von SolrModifiableParams und implementiert Serializable, sodass Abfrageobjekte gespeichert, übertragen und wiederverwendet werden können.
Durch die fluent-API (Method-Chaining) können Parameter kompakt und lesbar zusammengesetzt werden. Unterstützt werden Standard-Suchanfragen (q), Filter-Queries (fq), Feldlisten (fl), Ergebnis-Highlighting, Facettierung, Stats, MoreLikeThis und weitere Solr-Features.
- Grundsuche:
setQuery(),setRows(),setStart() - Sortierung:
addSortField() - Facettierung:
setFacet(),addFacetField() - Highlighting:
setHighlight(),addHighlightField()
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $q | string | Optionaler initialer Suchwert (entspricht dem q-Parameter von Solr), der direkt im Konstruktor gesetzt werden kann. Kann auch später über setQuery() definiert werden. |
Rückgabewert
Beispiele
Einfache Volltextsuche mit Paginierung und Sortierung
<?php
$options = [
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/mycore',
];
$client = new SolrClient($options);
$query = new SolrQuery();
$query->setQuery('PHP Solr');
$query->setStart(0);
$query->setRows(10);
$query->addField('id')
->addField('title')
->addField('description');
$query->addSortField('score', SolrQuery::ORDER_DESC);
try {
$queryResponse = $client->query($query);
$response = $queryResponse->getResponse();
$docs = $response->response->docs;
foreach ($docs as $doc) {
echo $doc->id . ' — ' . $doc->title . PHP_EOL;
}
} catch (SolrClientException $e) {
echo 'Client-Fehler: ' . $e->getMessage();
} catch (SolrServerException $e) {
echo 'Server-Fehler: ' . $e->getMessage();
}
Facettierung und Highlighting aktivieren
<?php
$options = [
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/products',
];
$client = new SolrClient($options);
$query = new SolrQuery('laptop');
$query->setRows(5);
$query->addFilterQuery('category:electronics');
// Facetten aktivieren
$query->setFacet(true);
$query->addFacetField('brand');
$query->addFacetField('price_range');
$query->setFacetMinCount(1);
// Highlighting aktivieren
$query->setHighlight(true);
$query->addHighlightField('description');
$query->setHighlightSnippets(2);
$query->setHighlightFragsize(150);
try {
$response = $client->query($query)->getResponse();
// Treffer ausgeben
foreach ($response->response->docs as $doc) {
echo $doc->title . PHP_EOL;
}
// Facetten ausgeben
$facets = $response->facet_counts->facet_fields;
foreach ($facets->brand as $brand => $count) {
echo "Brand: $brand ($count)" . PHP_EOL;
}
} catch (SolrClientException $e) {
echo 'Fehler: ' . $e->getMessage();
}
Serialisierung einer SolrQuery für spätere Wiederverwendung
<?php
// Abfrageobjekt erstellen und serialisieren
$query = new SolrQuery('Suchanfrage');
$query->setRows(20);
$query->addSortField('date', SolrQuery::ORDER_DESC);
$query->addField('id')->addField('title');
$serialized = serialize($query);
file_put_contents('/tmp/solr_query.bin', $serialized);
// Später wiederherstellen
$restored = unserialize(file_get_contents('/tmp/solr_query.bin'));
echo $restored->getQuery(); // Ausgabe: Suchanfrage
// Wichtig · Fallstricke
Erweiterung erforderlich: Die Klasse SolrQuery gehört zur PECL-Erweiterung solr, die separat installiert werden muss (pecl install solr). Sie ist kein Bestandteil des PHP-Kerns.
Kompatibilität: Achte auf die Solr-Server-Version — manche Parameter und Features (z. B. addParam() für undokumentierte Solr-Parameter) sind versionsabhängig. Die PHP-Erweiterung wurde hauptsächlich für Solr 4.x/5.x entwickelt, funktioniert aber oft auch mit neueren Versionen.
Eingabe-Validierung: Nutzereingaben, die als Suchwert (q) oder Filterquery (fq) übergeben werden, sollten stets validiert und ggf. escaped werden, um Solr-Injection zu verhindern. Verwende hierfür SolrUtils::escapeQueryChars().
Fehlerbehandlung: Fange sowohl SolrClientException (Verbindungsfehler) als auch SolrServerException (Fehler auf Solr-Seite, z. B. ungültige Abfragesyntax) separat ab, da beide unterschiedliche Ursachen und Diagnose-Methoden haben.