2010-06-04 12 views
5

Firslty, sono a conoscenza di alcune domande simili sulla falsariga di questa, ma penso che questa situazione sia abbastanza diversa da giustificare la sua stessa domanda.Il modo ideale per gestire i risultati Solr in PHP?

Sto eseguendo un indice Solr, tramite l'installazione di un molo su un server LAMP. Attualmente utilizzo la funzione simplexml_load_file per inserire i risultati della ricerca e quindi analizzarli tramite un paio di funzioni. Sono stato contento di questo processo fino a quando ho iniziato a imbattermi in un problema fondamentale.

I nomi dei campi non vengono passati attraverso la funzione simplexml. Ad esempio, questo risultato;

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

Apparirà così nell'oggetto simplexml;

[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 
    ) 
    ) 

Quando viene trovato un set di dati completo, v'è 11 bit di dati memorizzati nella matrice, ma quando alcuni sono mancanti, dati muove intorno e il mio parser si stacca.

Quindi, ho esaminato librerie/classi per farlo correttamente. Vale a dire, i due principali; Apache Solr e solr-php-client ma entrambi sembrano complicati, con una piccola quantità di esempi reali reali, e nessuno dei due sembra supportare diversi core solr, di cui io ne uso diversi.

Qual è la cosa migliore da usare? Sono rimasto piuttosto bloccato qui, ogni aiuto sarebbe stato MASSIVAMENTE apprezzato.

Grazie!

risposta

8

Definitivamente, utilizzare uno dei client esistenti. Per quanto riguarda il supporto di più core, è semplice come creare un'istanza del client per ogni istanza di Solr.

L'estensione Solr è molto più potente mentre è ancora abbastanza intuitiva da usare. Qui ci sono un paio di frammenti di codice di esempio che fare una query di base e ottenere i risultati indietro con entrambe le librerie:

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

Grazie per la nuqqsa risposta ! Ho ragione nel pensare che il percorso var nell'array delle opzioni sarebbe il percorso verso il nucleo? I file solr sono attualmente al di fuori della mia radice al minuto, quindi dovrò spostarli all'interno, immagino? C'è ancora un paio di q, ma cercherò di riprendere la documentazione prima di tutto, grazie ancora! – Tom

+0

Questi esempi effettuano una chiamata all'interfaccia REST di Solr all'indirizzo 'http: // localhost: 8080/solr', dove/solr (percorso) è il percorso relativo al dominio. Questo deve essere adattato ovunque si trovi l'istanza dell'API Solr. Cosa intendi con che i file siano al di fuori della radice? E sì, http://lucene.apache.org/solr/tutorial.html#Getting+Started è un buon punto di partenza! :) – nuqqsa

+0

solr-php-client utilizza JSON anziché XML per le risposte di analisi. Questo va bene per la maggior parte dei casi, ma si interrompe quando lo scrittore di risposte JSON di Solr fa cose che non dovrebbe, come l'impostazione di chiavi con lo stesso nome sullo stesso livello. Questo accade con, ad esempio, più regole di confronto. –

Problemi correlati