2010-06-04 4 views
5

Erstens, mir sind einige ähnliche Fragen bekannt, aber ich denke, diese Situation ist anders genug, um ihre eigene Frage zu rechtfertigen.Idealer Umgang mit Solr ergibt sich in PHP?

Ich bin ein Solr-Index, durch eine Anlegestelle auf einem LAMP-Server installieren. Ich benutze derzeit die simplexml_load_file Funktion, um die Suchergebnisse einzubringen und sie dann durch ein paar Funktionen zu analysieren. Ich war mit diesem Prozess zufrieden, bis ich auf ein grundlegendes Problem stieß.

Die Feldnamen werden nicht durch die Funktion simplexml übergeben. Zum Beispiel dieses Ergebnis;

<doc> 
    <float name="score">0.73325396</float> 
    <str name="add1">Ravensbridge Drive</str> 
    <str name="comments">0</str> 
    <str name="company">Stratstone Lotus Leicester</str> 
    <str name="feed_id"/> 
    <str name="id">1711765</str> 
    <str name="pcode">LE4 0BX</str> 
    <str name="psearch">LE4</str> 
    <str name="rating">0</str> 
</doc> 

Wird im Simplex-Objekt wie folgt aussehen;

[doc] => Array 
(
    [0] => SimpleXMLElement Object 
    (
    [float] => 0.73325396 
    [str] => Array 
    (
     [0] => Ravensbridge Drive 
     [1] => 0 
     [2] => Stratstone Lotus Leicester 
     [3] => SimpleXMLElement Object 
     (
     [@attributes] => Array 
     (
      [name] => feed_id 
     ) 
     ) 
     [4] => 1711765 
     [5] => LE4 0BX 
     [6] => LE4 
     [7] => 0 
    ) 
    ) 

Wenn ein vollständiger Datensatz gefunden wird, gibt es 11 Bits in dem Array gespeicherten Daten, aber wenn einige fehlen, Daten bewegen sich um und mein Parser kommt unstuck.

Also, ich habe mir Bibliotheken/Klassen angesehen, um es richtig zu machen. Nämlich die zwei wichtigsten; Apache Solr und solr-php-client aber beide scheinen über kompliziert, mit wenig realen Beispielen der realen Welt, und keiner sieht aus wie sie verschiedene solr Kerne unterstützen, von denen ich mehrere verwenden.

Was ist das Beste? Ich bin jetzt ziemlich fest hier, jede Hilfe würde MASSIV geschätzt werden.

Danke!

Antwort

8

Verwenden Sie definitiv einen der vorhandenen Clients. Was die Multiple-Core-Unterstützung anbelangt, ist es so einfach, eine Instanz des Clients für jede Instanz von Solr zu erstellen.

Die Solr-Erweiterung ist viel leistungsfähiger und dennoch intuitiv zu bedienen. Hier gibt es ein paar Beispielcode-Schnipsel, die eine grundlegende Abfrage machen und die Ergebnisse wieder beide Bibliotheken mit:

PHP Solr extension

<?php 
$options = array 
(
    'hostname' => 'localhost', 
    'port'  => '8080', 
    'path'  => '/solr' 
); 

$client = new SolrClient($options); 

$query = new SolrQuery(); 
$query->setQuery('fox'); 
$query->setStart(0); 
$query->setRows(50); 
// specify which fields do we want to retrieve 
$query->addField('id')->addField('title_t')->addField('source_t'); 

$res = $client->query($query)->getResponse(); 

// how does he response look like? 
var_dump($res); 
/* 
object(SolrObject)[4] 
    public 'responseHeader' => 
    object(SolrObject)[5] 
     public 'status' => int 0 
     public 'QTime' => int 0 
     public 'params' => 
     object(SolrObject)[6] 
      public 'fl' => string 'id,title_t,source_t' (length=19) 
      public 'indent' => string 'on' (length=2) 
      public 'start' => string '0' (length=1) 
      public 'q' => string 'fox' (length=3) 
      public 'wt' => string 'xml' (length=3) 
      public 'rows' => string '50' (length=2) 
      public 'version' => string '2.2' (length=3) 
    public 'response' => 
    object(SolrObject)[7] 
     public 'numFound' => int 39 
     public 'start' => int 0 
     public 'docs' => 
     array 
      0 => 
      object(SolrObject)[8] 
       ... 
      1 => 
      object(SolrObject)[9] 
       ... 
      2 => 
      object(SolrObject)[10] 
       ... 
      (...) 
*/ 
// how does a document look like? 
var_dump($res->reponse->docs[0]); 
/* 
object(SolrObject)[8] 
    public 'id' => int 11408 
    public 'source_t' => string 'CBD News Headlines' (length=18) 
    public 'title_t' => string 'Hunting across Southeast Asia weakens forests' survival' (length=55) 
*/ 

solr-php-client (official example of use)

require_once 'library/SolrPhpClient/Apache/Solr/Service.php'; 

$solr = new Apache_Solr_Service('localhost', '8080', '/solr'); 

if (!$solr->ping()) { 
    exit('Solr service not responding.'); 
} 

$offset = 0; 
$limit = 50; 

$query = 'fox'; 
$res = $solr->search($query, $offset, $limit); 

// how does he response look like? 
var_dump($res->response); 

/* 
object(stdClass)[6] 
    public 'numFound' => int 39 
    public 'start' => int 0 
    public 'docs' => 
    array 
     0 => 
     object(Apache_Solr_Document)[46] 
      protected '_documentBoost' => boolean false 
      protected '_fields' => 
      array 
       ... 
      protected '_fieldBoosts' => 
      array 
       ... 
     1 => 
     object(Apache_Solr_Document)[47] 
      protected '_documentBoost' => boolean false 
      protected '_fields' => 
      array 
       ... 
      protected '_fieldBoosts' => 
      array 
       ... 
    (...) 
*/ 

// how does a document look like? 
var_dump($res->response->doc[0]); 

/* 
object(Apache_Solr_Document)[46] 
    protected '_documentBoost' => boolean false 
    protected '_fields' => 
    array 
     'publicationTime_i' => int 1257724800 
     'publicationDate_t' => string 'Mon, 9 Nov 2009' (length=15) 
     'url_s' => string 'http://news.mongabay.com/2009/1108-hance_corlett.html' (length=53) 
     'language_s' => string 'EN' (length=2) 
     'title_t' => string 'Hunting across Southeast Asia weakens forests' survival' (length=55) 
     'text' => string 'A large flying fox eats a fruit ingesting its seeds.' (length=52) 
     'id' => int 11408 
     'relevance_i' => int 27 
     'source_t' => string 'CBD News Headlines' (length=18) 
    protected '_fieldBoosts' => 
    array 
     'publicationTime_i' => boolean false 
     'publicationDate_t' => boolean false 
     'url_s' => boolean false 
     'language_s' => boolean false 
     'title_t' => boolean false 
     'text' => boolean false 
     'id' => boolean false 
     'relevance_i' => boolean false 
     'source_t' => boolean false 
*/ 
+0

Danke für die Antwort nuqqsa ! Habe ich Recht, wenn ich denke, dass der Pfad var im Options-Array der Pfad zum Kern ist? Die Solr-Dateien befinden sich momentan außerhalb meiner Root, also muss ich sie nach drinnen verschieben, denke ich? Theres ist ein paar mehr Q's, die ich habe, aber ich werde versuchen, mich zuerst um die Dokumentation zu kümmern, danke nochmal! – Tom

+0

Diese Beispiele rufen die REST-Schnittstelle von Solr unter "http: // localhost: 8080/solr" auf, wobei/solr (Pfad) der Pfad relativ zur Domäne ist. Dies muss angepasst werden, wo auch immer sich Ihre Instanz der Solr-API befindet. Was meinst du damit, dass die Dateien außerhalb der Wurzel liegen? Und ja, http://lucene.apache.org/solr/tutorial.html#Getting+Started ist ein guter Startpunkt! :) – nuqqsa

+0

Solr-PHP-Client verwendet JSON anstelle von XML zum Parsen von Antworten. Das ist in den meisten Fällen in Ordnung, bricht aber ab, wenn der JSON-Antwortschreiber von Solr Dinge tut, die er nicht tun sollte, wie das Setzen von Schlüsseln mit identischen Namen auf derselben Ebene. Dies geschieht beispielsweise mit mehreren Sortierungen. –