IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Ajouter fonction extension solr


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    818
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 818
    Par défaut Ajouter fonction extension solr
    Bonjour,

    Je viens d'installer l'extension Solr qui autorise la communication avec le serveur Apache Solr en PHP 5.

    Je souhaiterais ajouter une fonction qui renvoi le nombre de résultat de la requête...

    Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    include "bootstrap.php";
     
    $options = array
    (
        'hostname' => SOLR_SERVER_HOSTNAME,
        'login'    => SOLR_SERVER_USERNAME,
        'password' => SOLR_SERVER_PASSWORD,
        'port'     => SOLR_SERVER_PORT,
    );
     
    $client = new SolrClient($options);
    $query = new SolrQuery();
    $query->setQuery('lucene');
    $query->setStart(0);
    $query->setRows(50);
    $query->addField('cat')->addField('features')->addField('id')-
    >addField('timestamp');
    $query_response = $client->query($query);
    $response = $query_response->getResponse();
    print_r($response);
    ?>
    Et le résultat du print_r :

    SolrObject Object
    (
    [responseHeader] => SolrObject Object
    (
    [status] => 0
    [QTime] => 1
    [params] => SolrObject Object
    (
    [wt] => xml
    [rows] => 50
    [start] => 0
    [indent] => on
    [q] => lucene
    [fl] => cat,features,id,timestamp
    [version] => 2.2
    )

    )

    [response] => SolrObject Object
    (
    [numFound] => 3
    [start] => 0
    [docs] => Array
    (
    [0] => SolrObject Object
    (
    [cat] => Array
    (
    [0] => Software
    [1] => Lucene
    )

    [id] => 334456
    )

    [1] => SolrObject Object
    (
    [cat] => Array
    (
    [0] => Software
    [1] => Lucene
    )

    [id] => 334455
    )

    [2] => SolrObject Object
    (
    [cat] => Array
    (
    [0] => software
    [1] => search
    )

    [features] => Array
    (
    [0] => Advanced Full-Text Search Capabilities using Lucene
    [1] => Optimized for High Volume Web Traffic
    [2] => Standards Based Open Interfaces - XML and HTTP
    [3] => Comprehensive HTML Administration Interfaces
    [4] => Scalability - Efficient Replication to other Solr Search Servers
    [5] => Flexible and Adaptable with XML configuration and Schema
    [6] => Good unicode support: héllo (hello with an accent over the e)
    )

    [id] => SOLR1000
    [timestamp] => 2009-09-04T20:38:55.906
    )

    )

    )

    )
    En fait ce que je voudrais c'est que la fonction me retourne la valeur de Response->NumFound (Cf tableau résultat ci-dessus)

    Comme je ne maitrise pas du tout l'objet, j'aurais voulu avoir un coup de main sur comment créer une classe qui serve en quelque sorte d'interface pour l'extension solr.
    Je souhaiterais écrire des fonctions qui me permettent de récupérer des infos sur les résultats car l'extension renvoi les résultats sous une forme brute...

    En gros est ce que je dois créer une classe ? En étendre une autre ?...

    J'aimerais avoir quelques conseils...

    Voici le lien vers l'extension solr

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonjour,

    pourquoi ne pas utiliser ce qui est déjà disponible ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo $client->query($query)->response->numFound;
    Sinon, oui, comme tu le préconises, tu pourrais créer une classe dérivée de SolrClient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class mySolrClient extends SolrClient{    
        public function getNumFound(SolrQuery $query){
            return $this->query($query)->response->numFound;
        }
    }

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    818
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 818
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    En fait j'avais essayé, mais la classe solrClient est final...
    Si j'ai bien compris elle ne peut pas être extend :
    Fatal error: Class mySolrClient may not inherit from final class (SolrClient)
    En fait j'ai déjà créer des fonctions en étendant la classe solrQuery, car ce que je souhaite s'est créer des fonctions pour la pagination.
    Et dans ses fonctions j'ai besoin du nombre de documents...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    class CDSolrQuery extends SolrQuery
    {
            public function getPreparedQueryStringFirst()
    	{
    		$this->setStart(0);
    		$tab=$this->getPreparedParams();
    		$queryString=join('&',$tab);
    		
    		return $queryString;
    	}
    	
    	public function getPreparedQueryStringPrevious()
    	{
    		if (0 <= ($this->getStart()-$this->getRows())) {
    			$newstart = $this->getStart()-$this->getRows();
    		} else {
    			$newstart = 0;
    		}
    		
    		$this->setStart($newstart);
    		$tab=$this->getPreparedParams();
    		$queryString=join('&',$tab);
    		
    		return $queryString;
    	}
    	
    	public function getPreparedQueryStringNext()
    	{
    		if ($this->nbResultsTotal() > ($this->getStart()+$this->getRows())) {
    			$newstart = $this->getStart()+$this->getRows();
    		} else {
    			$newstart = floor(($this->nbResultsTotal()-1)/$this->getRows()) * $this->getRows();
    		}
    		
    		$this->setStart($newstart);
    		$tab=$this->getPreparedParams();
    		$queryString=join('&',$tab);
    		
    		return $queryString;
    	}
    	
    	public function getPreparedQueryStringLast()
    	{
    		$newstart = floor(($this->nbResultsTotal()-1)/$this->getRows()) * $this->getRows();
    		
    		$this->setStart($newstart);
    		$tab=$this->getPreparedParams();
    		$queryString=join('&',$tab);
    		
    		return $queryString;
    	}
    }
    Mais ma fonction nbResultsTotal() ne marche pas car elle a besoin d'un objet client (solrClient) et non d'un objet query (solrQuery)...

    Comment puis je m'y prendre ?

  4. #4
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Tu peux passer le SolrClient en constructeur de ta SolrQuery si le constructeur n'est pas final

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class CDSolrQuery extends SolrQuery
    {
        private $_client;
     
        public function __construct(SolrClient $client){
            $this->_client = $client;
        }
     
        public function getRowsCount(){
            return $this->_client->query($this)->response->numFound;
        }
    }
    Par contre ca appelles query a chaque fois donc a utiliser avec parsimonie.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    818
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 818
    Par défaut
    Merci beaucoup, j'ai juste ajouter ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public function __construct($c)
    {
    	parent::__construct();
            $this->_client = $c;
    }
    Sinon ca ne marchait pas...

    Tu viens de m'enlever un tronc du pied ! Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajout d'extensions d'application par VBScript
    Par gegthekid dans le forum IIS
    Réponses: 1
    Dernier message: 27/02/2007, 08h22
  2. ajouter fonction dans CScrolView
    Par kabil.cpp dans le forum MFC
    Réponses: 1
    Dernier message: 28/04/2006, 14h24
  3. [File][JFileChooser]Ajouter une extension pour "Save as
    Par leminipouce dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 27/01/2006, 15h45
  4. Réponses: 15
    Dernier message: 12/08/2005, 15h06
  5. Réponses: 5
    Dernier message: 11/02/2005, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo