2010-06-04 12 views
5

Firslty, zdaję sobie sprawę z kilku podobnych pytań podobnych do tego, ale sądzę, że ta sytuacja jest na tyle inna, by uzasadnić własne pytanie.Idealny sposób radzenia sobie z Solr powoduje PHP?

Używam indeksu Solr, poprzez instalację pomostu na serwerze LAMP. Obecnie używam funkcji simplexml_load_file, aby wprowadzić wyniki wyszukiwania, a następnie przeanalizować je za pomocą kilku funkcji. Byłem zadowolony z tego procesu, dopóki nie zacząłem borykać się z podstawowym problemem.

Nazwy pól nie są przekazywane za pomocą funkcji simplexml. Na przykład ten wynik;

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

Będzie wyglądać tak w obiekcie 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 
    ) 
    ) 

Kiedy pełny zestaw danych zostanie znaleziony, jest 11 bitów danych przechowywanych w tablicy, ale gdy brakuje niektórych dokumentów, dane porusza i mój parser pochodzi powieść.

Tak więc zajrzałem do bibliotek/klas, aby zrobić to poprawnie. Mianowicie, dwa główne; Apache Solr i solr-php-client, ale oba wydają się zbyt skomplikowane, z niewielką ilością rzeczywistych przykładów rzeczywistych i nie wyglądają tak, jakby obsługiwały różne rdzenie solr, z których korzystam kilka.

Co najlepiej używać? Utknąłem tu teraz, każda pomoc będzie MASOWO doceniona.

Dzięki!

Odpowiedz

8

Zdecydowanie użyj jednego z istniejących klientów. Jeśli chodzi o obsługę wielu rdzeni, jest to tak proste, jak tworzenie instancji klienta dla każdej instancji Solr.

Rozszerzenie Solr ma znacznie większą moc, a jednocześnie jest dość intuicyjne w użyciu. Tutaj istnieje kilka fragmentów kodu próbki, które wykonywać podstawowe zapytania i uzyskać wyniki z powrotem przy użyciu obu bibliotek:

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

Dzięki za nuqqsa post ! Czy mam rację, myśląc, że ścieżka var w tablicy opcji będzie ścieżką do rdzenia? Pliki solr są obecnie poza moim katalogiem głównym, więc muszę je przenieść w środku, jak sądzę? Jest jeszcze kilka q, ale spróbuję najpierw zajrzeć do dokumentacji, jeszcze raz dziękuję! – Tom

+0

Te przykłady wywołują połączenie z interfejsem REST Solr w 'http: // localhost: 8080/solr', gdzie/solr (path) jest ścieżką względem domeny. To musi być dostosowane do miejsca, w którym znajduje się Twoja instancja API Solr. Co masz na myśli mówiąc, że pliki znajdują się poza katalogiem głównym? I tak, http://lucene.apache.org/solr/tutorial.html#Getting+Started to dobry punkt wyjścia! :) – nuqqsa

+0

Solr-php-client używa JSON zamiast XML do parsowania odpowiedzi. Jest to w porządku dla większości przypadków, ale zrywa się, gdy program zapisujący odpowiedzi JSON Solr robi rzeczy, których nie powinien, np. Ustawiając identycznie nazwane klucze na tym samym poziomie. Dzieje się tak na przykład w przypadku wielokrotnych sortowań. –

Powiązane problemy