Solr PHP Client Beispiel

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

  1. Erstellen Sie eine schema.xml Datei um die oben genannten Felder zu indexieren. Verwenden Sie als Ausgangslage die originale schema.xml Datei von solr.
  2. Indexieren Sie mit dem Code unten 2 Dokumente
  3. Prüfen Sie die Suchausgabe von solr unter http://localhost:8983/solr/admin
  4. 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

 

Schlagwörter: