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

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

La mécanique des alertes mails :
Dans la table alerte :

  • query : est la query solr correspondant à l'alerte (mot clé et/ou filtre)
  • last_mail : la date du dernier object envoyé (soit du dernier envoi mais ca permet de ne pas rater d'object), ces changements de date sont générés par la tache d'envoi, il faut donc justr l'initialiser à la création avec la date courrante
  • titre : soit les mots clés soit une explication textuelle de l'alerte (pour les alertes complexe, genre « commentaire en réponse à votre commentaire du 10 juin »)

pour la query les filtres peuvent être :
object_name:<Table>
object_id:<tupple_id>
ou des tags
tag:<nom_tag>

un certains nombre de tags sont autogérés. Pour les commentaires, par exemple, la référence à l'object est généré par tag.
Pour s'abonner aux commentaires en réponse à Intervention/XXX car donne la query :
tag:object_type=Intervention tag:object_id=XXX

File size: 2.8 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    for ($i = 0 ; $i < count($results['response']['docs']); $i++) {
88      $res = $results['response']['docs'][$i];
89      $results['response']['docs'][$i]['object'] = Doctrine::getTable($res['object_name'])->find($res['object_id']);
90    }
91    return $results;
92  }
93 
94}
95
Note: See TracBrowser for help on using the repository browser.