source: cpc/trunk/project/lib/model/solr/SolrConnector.class.php @ 1330

Last change on this file since 1330 was 1330, checked in by teymour, 11 years ago

Permettre la connexion avec solr pas totalement identique à la base locale

File size: 3.1 KB
Line 
1<?php
2
3class SolrConnector extends sfLogger
4{
5  private $solr = NULL;
6  private $_options = NULL;
7
8  protected function doLog($message, $priority)
9  {
10    error_log(sprintf('%s (%s)', $message, sfLogger::getPriorityName($priority)));
11  }
12
13  public function __construct( $listener_options = NULL)
14  {
15    $host = sfConfig::get('app_solr_host', 'localhost');
16    $port = sfConfig::get('app_solr_port', '8983');
17    $url = sfConfig::get('app_solr_url', '/solr');
18    $this->solr = new Apache_Solr_Service($host, $port, $url);
19   
20    if(!$this->solr->ping()) {
21      throw new Exception('Search is not available right now.');
22    }
23   
24    $this->_options = $listener_options;
25
26    return $this->solr;
27  }
28 
29
30  public function updateFromCommands() {
31    $file = SolrCommands::getCommandContent();
32    foreach(file($file) as $line) {
33      if (preg_match('/(UPDATE|DELETE) : (.+)/', $line, $matches)) {
34        $obj = json_decode($matches[2]);
35        if ($matches[1] == 'UPDATE') {
36          $this->updateLuceneRecord($obj);
37        }else{
38          $this->deleteLuceneRecord($obj->id);
39        }
40      }
41    }
42    SolrCommands::releaseCommandContent();
43  }
44
45
46  public function deleteLuceneRecord($solr_id)
47  {
48    if($this->solr->deleteById($solr_id) ) {
49      return $this->solr->commit();
50    }
51    return false;
52  }
53
54  public function updateLuceneRecord($obj)
55  {
56     $document = new Apache_Solr_Document(); 
57     $document->addField('id', $obj->id); 
58     $document->addField('object_id', $obj->object_id); 
59     $document->addField('object_name', $obj->object_name); 
60     if (isset($obj->wordcount))
61       $document->addField('wordcount', $obj->wordcount); 
62     if (isset($obj->title))
63       $document->addField('title', $obj->title->content, $obj->title->weight); 
64     if (isset($obj->description))
65       $document->addField('description', $obj->description->content, $obj->description->weight); 
66     if (isset($obj->date))
67       $document->addField('date', $obj->date->content, $obj->date->weight); 
68     if (isset($obj->tags)) {
69        foreach($obj->tags->content as $tag) if ($tag)  {
70          $document->setMultiValue('tag', $tag, $obj->tags->weight);
71        }
72     }
73     $this->solr->addDocument($document);
74     $this->solr->commit();
75  }
76
77  public function deleteAll() {
78    $this->solr->deleteByQuery('*:*');
79    $this->solr->commit();
80  }
81
82  public function search($queryString, $params = array(), $offset = 0, $maxHits = 0) {
83    if($maxHits == 0)
84        $maxHits = sfConfig::get('app_solr_max_hits', 256);
85    $response = $this->solr->search($queryString, $offset, $maxHits, $params);
86    $results = unserialize($response->getRawResponse());
87    $unset = array();
88    for ($i = 0 ; $i < count($results['response']['docs']); $i++) {
89      $res = $results['response']['docs'][$i];
90      $results['response']['docs'][$i]['object'] = Doctrine::getTable($res['object_name'])->find($res['object_id']);
91      if (!$results['response']['docs'][$i]['object'])
92        $unset[] = $i;
93    }
94    foreach ($unset as $i) {
95      unset($results['response']['docs'][$i]);
96    }
97    $results['response']['docs'] = array_values($results['response']['docs']);
98    return $results;
99  }
100 
101}
102
Note: See TracBrowser for help on using the repository browser.