Blog_allgemein

Apache Solr in PHP Projekten

Johannes Brucher

…ist nicht nur auf dem Gebiet Search & Analytics Spezialist, sondern fühlt sich ebenso im Bereich SHI Publishing Solutions zuhause. Geboren 1981 in Bayern, studierte er Bioinformatik mit Schwerpunkt Softwareengineering an der FH Weihenstephan in Freising. Seit über 10 Jahren bereichert er SHI mit seinen Fachkenntnissen, die er bei SHI von „Junior Consultant“ zum „Senior Technical Consultant“ ausbaute. Lieblings-Dateiformat: WAV, MOV, jar

Längst hat der Suchserver Solr auch das PHP Umfeld erobert.
Für alle gängigen Content-Management-Systeme wie TYPO3, Drupal oder Joomla! existieren Erweiterungen, um eine komfortable Anbindung des jeweiligen Systems an Solr zu bewerkstelligen.

Aber wie ist vorzugehen, wenn in einem PHP Projekt kein CMS-Bolide zum Einsatz kommt und die Solr Anbindung individuell umgesetzt werden muss? Dem Entwickler stehen zwei nennenswerte Ansätze zur Verfügung, um Solr in PHP zu integrieren. Zum einen die Apache Solr PHP Extension und zum anderen der Apache Solr PHP Client. Die beiden Möglichkeiten möchte in meinem Artikel kurz vorstellen und exemplarische Anbindung von Solr über Apache Solr PHP Extension präsentieren.

Apache Solr PHP Extension

Um die Apache Solr PHP Extension verwenden zu können, muss diese zuerst auf der verwendeten PHP Distribution installiert werden. Dadurch ist das Framework zu 100% in PHP integriert. Verfügbar ist die Erweiterung als sogenannte PHP Extension Community Library (PECL).

Apache Solr PHP Client

Hierbei handelt es sich um eine 3rd party PHP library. Diese besteht aus einer Sammlung von PHP Klassen, die zum Projekt hinzugefügt werden.

Bewertung

Das leichtgewichtigere und schnellere Framework ist die Apache Solr PHP Extension. Durch die vollständige Integration in PHP kommt es zu keinerlei Performance-Einbußen, welche durch Zugriffe auf das Filesystem, wie beim Apache Solr PHP Client notwendig, entstehen.

Der große Vorteil des Apache Solr PHP Client ist hingegen, dass für dessen Verwendung keine explizieten Systemanforderungen an den PHP Interpreter gestellt werden. Die Funktionalität ist allein durch die inkludierten PHP Dateien gegeben. Vor allem, wenn es sich beim Projekt um keine Individual-, sondern um eine Standardsoftware handelt, kommt diese Library zum Zug. So basieren beispielsweise die gängigen Solr Lösungen im CMS Bereich auf diesem Ansatz.

So gesehen entscheidet letztendlich die Projektart über den Einsatz des jeweiligen Solr Frameworks.In der Verwendung sind sich die Apache Solr PHP Extension und der Apache Solr PHP Client ähnlich.Im Folgendem wird die prinzipielle Verwendung des Apache Solr PHP Extension; beispielsweise gezeigt:

1. Indexierung:
 
/** Example 1: Adding a document to the index **/

/* Host Solr server */
define('SOLR_SERVER_HOSTNAME', 'solr.example.com');

/* HTTP Port to connection */
define('SOLR_SERVER_PORT', 8050));

/* Username */
define('SOLR_SERVER_USERNAME', 'root');

/* Password */
define('SOLR_SERVER_PASSWORD', 'secret');

$options = array
(
    'hostname' => SOLR_SERVER_HOSTNAME,
    'login'    => SOLR_SERVER_USERNAME,
    'password' => SOLR_SERVER_PASSWORD,
    'port'     => SOLR_SERVER_PORT
);

/* Create Solr instance */
$client = new SolrClient($options);

/* Create Solr document*/
$doc = new SolrInputDocument();

/* Add metafields */
$doc->addField('id', 12345);
$doc->addField('title', 'Solr Example');
$doc->addField('bodytext', 'Hello World!');

/* Add document to solr instance */
$client->addDocument($doc);

/* Send request to solr server*/
$client->commit();
2. Suchen:
 
/** Example 2: Search **/

/* Host Solr server */
define('SOLR_SERVER_HOSTNAME', 'solr.example.com');

/* HTTP Port to connection */
define('SOLR_SERVER_PORT', 8050));

/* Username */
define('SOLR_SERVER_USERNAME', 'root');

/* Password */
define('SOLR_SERVER_PASSWORD', 'secret');

$options = array
(
    'hostname' => SOLR_SERVER_HOSTNAME,
    'login'    => SOLR_SERVER_USERNAME,
    'password' => SOLR_SERVER_PASSWORD,
    'port'     => SOLR_SERVER_PORT
);

/* Create Solr instance */
$client = new SolrClient($options);

/* Create Query instance */
$query = new SolrQuery();

/* Add search term to query instance */
$query->setQuery('Hello');

/* set start value */
$query->setStart(0);

/* set rows value */
$query->setRows(10);

/* set fl parameters */
$query->addField('id');
$query->addField('titel');
$query->addField('bodytext');

/* Send query to solr server */
$query_response = $client->query($query);

/* get response */
$response = $query_response->getResponse();
3. SolrObject response
SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 1
            [params] => SolrObject Object
                (
                    [wt] => xml
                    [rows] => 10
                    [start] => 0
                    [indent] => on
                    [q] => Hello
                    [fl] => id,title,bodytext
                    [version] => 2.2
                )
        )

    [response] => SolrObject Object
        (
            [numFound] => 1
            [start] => 0
            [docs] => Array
                (
                    [0] => SolrObject Object
                        (
                            [id] => 12345

                            [title] => Solr Example

                            [bodytext] => Hello World
                        )
                )
        )
)
Fazit:

Mit beiden Frameworks ist es möglich, schnell und unkompliziert Solr in PHP Projekte zu integrieren. Falls die Performance essentiell ist, wird Apache Solr PHP Extension favorisiert, andernfalls eher der Apache Solr PHP Clien, bei dem kein Eingriff in die PHP Distribution notwendig ist.

Weiterführende Links

Informationen zu Apache Solr PHP Client