Felder in solr definieren mit schema.xml
Um Daten mithilfe von Solr indexieren zu können, müssen diese zuerst typisiert werden. Dies geschieht mittels der schema.xml Date die sich im Ordner /conf der Solr-Installation befindet.
Solr indexiert sog. "Documents" die aus einer Reihe von Felder ("Fields") bestehen. Wenn neue Dokumente in den Index abgelegt werden, wird mit PHP ein $doc-Objekt erzeugt und die Felder mit den entsprechenden Werten abgefüllt. Dies wird dann an den Solr-Server übermittelt.
Anhand des folgenden Beispiels wird der Aufbau des Solr schema.xml genauer erläutert:
Beispiel:
<schema name="ayalon" version="1.1"> ... <fields> <field name="id" type="string" indexed="true" stored="true" required="true" /> <field name="title" type="text" indexed="true" stored="true"/> <field name="titleSort" type="string" indexed="true" stored="false"/> <field name="text" type="text" indexed="true" stored="true"/> <field name="category" type="text" indexed="true" stored="true" multiValued="true"/> ... </fields> <uniqueKey>id</uniqueKey> ... <copyField source="title" dest="titleSort"/> ... </schema>
Erklärung:
- Jedes Schema in solr benötigt einen eindeutigen Schlüssel (uniqueKey). Damit werden die Records referenziert.
- textSort ist eine Kopie von text. Es handelt sich im Gegensatz zum "title" Feld um ein zerlegtes Feld, das sortiert werden kann.
- category ist ein Wertearray. Damit könnte beispielsweise eine Facette abgebildetet werden.
Aufgaben
- Erstellen Sie eine schema.xml Datei um die oben genannten Felder zu indexieren. Verwenden Sie als Ausgangslage die originale schema.xml Datei von solr.
- Indexieren Sie mit dem Code unten 2 Dokumente
- Prüfen Sie die Suchausgabe von solr unter http://localhost:8983/solr/admin
- Implementieren Sie noch ein Highlighting mit <strong> -Tags und zeigen Sie die Snippets an. (Tipp: http://wiki.apache.org/solr/HighlightingParameters)
PHP Client
Der Php-Client für Solr kann von aus dem SVN-Repository ausgecheckt werden.
svn checkout -r6 http://solr-php-client.googlecode.com/svn/trunk/ SolrPhpClient
Direkt herunterladen:
Code
<?php require_once( 'SolrPHPClient/Apache/Solr/Service.php' ); // // // Try to connect to the named server, port, and url // $solr = new Apache_Solr_Service( 'localhost', '8983', '/solr' ); if ( ! $solr->ping() ) { echo 'Solr service not responding.'; exit; } // // // Create two documents // $docs = array( 'doc_no1' => array( 'id' => 1, 'title' => 'Alphabet', 'text' => 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern', 'category' => array( 'Orange', 'Birne' ), ), 'doc_no2' => array( 'id' => 2, 'title' => 'Buchstaben', 'text' => 'Polyfon zwitschernd assen Mäxchens Vögel Rüben, Joghurt und Quark.', 'category' => array( 'Apfel', 'Birne' ), ), ); $documents = array(); foreach ( $docs as $item => $fields ) { $part = new Apache_Solr_Document(); foreach ( $fields as $key => $value ) { if ( is_array( $value ) ) { foreach ( $value as $data ) { $part->setMultiValue( $key, $data ); } } else { $part->$key = $value; } } $documents[] = $part; } // // // Load the documents into the index // try { $solr->addDocuments( $documents ); $solr->commit(); $solr->optimize(); } catch ( Exception $e ) { echo $e->getMessage(); } // // // Run some queries. // $offset = 0; $limit = 10; $queries = array( 'id: 1 OR id: 2', 'category: Birne', 'title: Buchstaben' ); foreach ( $queries as $query ) { $response = $solr->search( $query, $offset, $limit ); if ( $response->getHttpStatus() == 200 ) { // print_r( $response->getRawResponse() ); if ( $response->response->numFound > 0 ) { echo "$query <br />"; foreach ( $response->response->docs as $doc ) { echo "$doc->id $doc->title <br />"; } echo '<br />'; } } else { echo $response->getHttpStatusMessage(); } } ?>
Lösungen