Start · Sprachen · PHP · Referenz · SolrQuery

SolrQuery

Klasse

Repräsentiert eine Solr-Suchanfrage als Sammlung von Name-Wert-Paaren, die an den Solr-Server gesendet werden.

seit PHP 0.9.2 Kategorie: db

Signatur

class SolrQuery extends SolrModifiableParams implements Serializable

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

Typ

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();
}
42 — PHP-Entwicklung mit Solr 17 — Solr-Integration in PHP-Projekten ...

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();
}
Laptop Pro 15 UltraBook X1 Brand: Dell (12) Brand: Lenovo (8) ...

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
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.