findMe." (".$criteres->deb.", ".$criteres->nbRep.", ".$criteres->max.") avec ".implode(',',$criteres->tabFiltres),__LINE__,__FILE__, __FUNCTION__, __CLASS__); $cl = new SphinxClient(); switch (strtolower($index)) { case 'entrep': break; case 'dir': break; case 'histo': $cl->SetServer (SPHINX_HISTO_HOST, SPHINX_HISTO_PORT); $cl->SetConnectTimeout ( 1 ); $cl->SetLimits ($criteres->position, $criteres->nbRep, $criteres->max); $cl->SetMatchMode (SPH_MATCH_EXTENDED); foreach ($criteres->tabFiltres as $nomFiltre => $valFiltre) { $cl->SetFilter($nomFiltre, array(0=>$valFiltre)); } $cl->SetRankingMode ( SPH_RANK_PROXIMITY_BM25 ); $res = $cl->Query ( $criteres->findMe, 'histo' ); if ($res===false) { //Erreur debugLog('I',"Search Sphinx : Pas de réponse pour ".$criteres->findMe." avec ".implode(',',$criteres->tabFiltres).' ('.$cl->GetLastError() .')',__LINE__,__FILE__, __FUNCTION__, __CLASS__); return array( 'results' => false, 'nbRet' => 0, 'nbTot' => 0, 'duration' => 0); } else { if ( $cl->GetLastWarning() ) { debugLog('I',"Search Sphinx : Warning pour $criteres->findMe - ".$cl->GetLastWarning(),__LINE__,__FILE__, __FUNCTION__, __CLASS__); print "WARNING: " . $cl->GetLastWarning() . "\n\n"; } debugLog('I',"'Search Sphinx dans $index de $criteres->findMe (Filtre=".implode(',',$criteres->tabFiltres)."), Deb=".$criteres->position.", nbRep=".$criteres->nbRep.", max=".$criteres->max.", any=".$criteres->any,__LINE__,__FILE__, __FUNCTION__, __CLASS__); $tabRet = array(); if ( is_array($res['matches'])) { $iDb = new WDB('histobodacc'); $iDb->query("SET NAMES 'latin1';"); foreach ( $res['matches'] as $doc => $docinfo ) { $listeEtab = $iDb->select( 'bodacc_ocr', "'Histo' as Loc, id, nomFichier, annee1, bod, texte", "id=$doc"); $etab = $listeEtab[0]; $tabRet[] = array( 'Localisation' => $etab['Loc'], 'id' => $doc, 'Pertinence' => $docinfo['weight'], 'Fichier' => $etab['nomFichier'], 'Annee' => $etab['annee1'], 'Code' => $etab['bod'], 'Texte' => $etab['texte'], ); } } } debugLog('I','Search Sphinx : Retourne '. $res[total].'/'. $res[total_found] .' en '.$res[time] .'secondes',__LINE__,__FILE__, __FUNCTION__, __CLASS__); return array( 'results' => $tabRet, 'nbRet' => $res[total], 'nbTot' => $res[total_found], 'duration' => $res[time], 'words' => $res['words'], ); break; } } /** * Méthode magique __call() permettant d'appeller une méthode virtuelle * du type searchByEnt(), searchByDir() ou searchByHisto()... * * @param string $method Nom de la méthode virtuelle appelée * @param array $args Tableau des critères de recherche * @return array|null $return Tableau des résultats ou NULL */ public function __call($method, $args) { if(preg_match('#^searchBy#i',$method)) { $name = str_replace('searchBy','',$method); $criteres = array( 0 => 'findMe', 1 => 'tabFiltres', 2 => 'position', 3 => 'nbRep', 4 => 'max', 5 => 'any', ); $searchArgs = new stdClass(); $i = 0; foreach($args as $argument) { $searchArgs->{$criteres[$i]} = $argument; $i++; } return $this->search($name, $searchArgs); } return null; } }