Ajout fichier pour moteur de recherche de Damien
This commit is contained in:
parent
9a99523342
commit
c81e9751b7
987
library/Metier/sphinx2/SDmotor.class.php
Normal file
987
library/Metier/sphinx2/SDmotor.class.php
Normal file
@ -0,0 +1,987 @@
|
||||
<?php
|
||||
/*
|
||||
* SDmotor
|
||||
* Cette classe gere tous les cas possibles de recherche avec le moteur sphinx.
|
||||
* Tous les types de recherches entreprise.
|
||||
*
|
||||
* Par : Damien Lasserre, Le 13/11/2011 a 12h12.
|
||||
* CC : dlasserre@scores-decisions.com
|
||||
* CR : CopyRight Scores et Decisions.
|
||||
*/
|
||||
Class SDmotor
|
||||
{
|
||||
protected $formR;
|
||||
protected $index;
|
||||
protected $debug = true;
|
||||
|
||||
/** Critères pour sphinx **/
|
||||
protected $Crtiteres = array('raisonSociale' => '',
|
||||
'Voie' => '@addresse',
|
||||
'cpVille' => '@ville',
|
||||
'telFax' => '@(tel, fax)',
|
||||
'naf' => '@ape_etab'
|
||||
);
|
||||
|
||||
/** Séquance d'échappement. **/
|
||||
protected $form2crit = array('siren' => 'I',
|
||||
'raisonSociale' => 'S',
|
||||
'departement' => 'D',
|
||||
'localite' => 'L',
|
||||
'cpVille' => 'D',
|
||||
'numeroVoie' => 'N',
|
||||
'Voie' => 'R',
|
||||
'Ville' => 'V',
|
||||
'SPH_MATCH' => EOF
|
||||
);
|
||||
|
||||
protected $mode; // Le MatchingMode de sphinx
|
||||
protected $deb; // La Page de début.
|
||||
protected $nbRep; // Le Nombre de reponse par page
|
||||
protected $max; // Le Nombre maximum de résultats.
|
||||
protected $total_time; // Le temps d'éxecution de la recherche.
|
||||
|
||||
/** Parametres de la partie debug (Interface de test)**/
|
||||
protected $quorum;
|
||||
protected $sequances;
|
||||
protected $proximites;
|
||||
protected $poids;
|
||||
protected $actif;
|
||||
/** **/
|
||||
|
||||
protected $maxSizeWord; // Taille Minimum des mots pour la raisonSociale
|
||||
protected $Quorumsize; // Inutilisé pour le moment.
|
||||
protected $ProximiteSize; // Taille de la proximite.
|
||||
|
||||
protected $page; // La page courante.
|
||||
public $html; // HTML propre au debug (interface de test)
|
||||
protected $pertinance; // La pertinence dans la recherche. (sirenage)
|
||||
|
||||
protected $acronyme;
|
||||
|
||||
/**
|
||||
* @param <type> $deb Page courante.
|
||||
* @param <type> $nbRep Nombre de reponse / pages
|
||||
* @param <type> $max Nombre Maximum de reponses.
|
||||
*
|
||||
* Fonction de recherche entreprise, ici nous allons crée tous les cas de recherche possible
|
||||
* De la recherche par exact match ou Phonetique en passant par le gestionnaire de condition de Sphinx
|
||||
* A savoir nous retirerons des critéres celon les resultats de sphinx.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->total_time = 0;
|
||||
|
||||
$this->quorum = false;
|
||||
$this->sequances = false;
|
||||
$this->proximites = false;
|
||||
$this->poids = false;
|
||||
$this->actif = false;
|
||||
|
||||
$this->nbRep = 10;
|
||||
$this->max = 1000;
|
||||
|
||||
$this->debug = true;
|
||||
}
|
||||
|
||||
public function _initForm($formR)
|
||||
{
|
||||
$formulaire = array();
|
||||
$ok = false;
|
||||
foreach($formR as $name => $form) {
|
||||
if($name != 'controller' and $name != 'action' and $name != 'module' and $name != 'Envoyer') {
|
||||
if($this->index == 'dir' and ($name == 'nom' or $name == 'prenom' and !$ok)) {
|
||||
$formulaire['raisonSociale'] = $formR['nom'].' '.$formR['prenom'];
|
||||
$ok = true;
|
||||
}
|
||||
$formulaire[$name] = (empty($form))?'':$form;
|
||||
}
|
||||
}
|
||||
$this->formR = $formulaire;
|
||||
}
|
||||
|
||||
public function databaseJO()
|
||||
{
|
||||
$db = new mysqli('192.168.78.230', 'sphinx', 'indexer', 'jo');
|
||||
if (mysqli_connect_error()) {
|
||||
$this->println('Erreur : Ne peut pas se connecter a la base.');
|
||||
return;
|
||||
}
|
||||
$db->query("SET NAMES 'utf8';");
|
||||
return $db;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Fonction d'entrée dans la classe
|
||||
* Elle s'occupe de setter les parametres de sphinx et d'éxecuter le bon type de recherche.
|
||||
*
|
||||
* @todo voir pour la verification du mode de sortie de sphinx.
|
||||
* Prévoir un input de selection avec les différents modes de sortie.
|
||||
* $this->sphinx->SetSortMode(SPH_SORT_EXTENDED, "@adr_num desc");
|
||||
*
|
||||
*/
|
||||
public function search()
|
||||
{
|
||||
$pass = 0;
|
||||
$quorumActif = false;
|
||||
$quorum = array();
|
||||
$array = array();
|
||||
|
||||
if(!empty($this->formR['raisonSociale']))
|
||||
$this->formR['raisonSociale'] = $this->formatRaisonSociale($this->formR['raisonSociale']);
|
||||
foreach($this->formR as $name => $form) {
|
||||
if(array_key_exists($name, $this->form2crit) and !empty($this->formR[$name]))
|
||||
$array[$name] = $form;
|
||||
}
|
||||
$this->formR = $array;
|
||||
if(!$this->sphinx and $this->debug)
|
||||
return (array('Nombre de Réponses :' => 0,
|
||||
'Nombre de Réponses Totales :' => 0,
|
||||
'Durée exécution :' => $total_time,
|
||||
'Erreure :' => 'Le formulaire est Vide !')
|
||||
);
|
||||
/*$this->filtreCaracteresSpeciaux();*/
|
||||
$this->sphinx->SetSortMode($this->setSortMode(SPH_MATCH_EXTENDED2), "@weight rang");
|
||||
$this->sphinx->SetLimits(intval($this->deb), intval($this->nbRep), intval($this->max));
|
||||
$this->maxSizeWord = 0;
|
||||
switch($this->formR['SPH_MATCH']) {
|
||||
case 'SPH_MATCH_ALL':
|
||||
$this->sphinx->SetMatchMode(SPH_MATCH_ALL);
|
||||
$resSphinx = $this->SPH_MATCH_('SPH_MATCH_ALL');
|
||||
$this->printStatus($resSphinx);
|
||||
break;
|
||||
case 'SPH_MATCH_ANY':
|
||||
$this->sphinx->SetMatchMode(SPH_MATCH_ANY);
|
||||
$resSphinx = $this->SPH_MATCH_('SPH_MATCH_ANY');
|
||||
$this->printStatus($resSphinx);
|
||||
break;
|
||||
case 'SPH_MATCH_PHRASE':
|
||||
$this->sphinx->SetMatchMode(SPH_MATCH_PHRASE);
|
||||
$resSphinx = $this->SPH_MATCH_('SPH_MATCH_PHRASE');
|
||||
$this->printStatus($resSphinx);
|
||||
break;
|
||||
case 'SPH_MATCH_BOOLEAN':
|
||||
$this->sphinx->SetMatchMode(SPH_MATCH_BOOLEAN);
|
||||
$resSphinx = $this->SPH_MATCH_('SPH_MATCH_BOOLEAN');
|
||||
$this->printStatus($resSphinx);
|
||||
break;
|
||||
case 'SPH_MATCH_EXTENDED':
|
||||
$this->sphinx->SetMatchMode(SPH_MATCH_EXTENDED);
|
||||
$resSphinx = $this->SPH_MATCH_('SPH_MATCH_EXTENDED');
|
||||
$this->printStatus($resSphinx);
|
||||
break;
|
||||
default:
|
||||
$this->sphinx->SetMatchMode(SPH_MATCH_EXTENDED2);
|
||||
if(!empty($this->formR['raisonSociale']) and $this->index == 'ent')
|
||||
$this->formR['raisonSociale'] = $this->removeSmallWord($this->formR['raisonSociale']);
|
||||
if(!empty($this->formR['Voie']))
|
||||
$this->formR['Voie'] = $this->formatAdress ($this->formR['Voie']);
|
||||
$resSphinx = $this->SPH_MATCH_('SPH_MATCH_EXTENDED2');
|
||||
$this->printStatus($resSphinx);
|
||||
break;
|
||||
case 'SPH_MATCH_FULLSCAN':
|
||||
return;
|
||||
}
|
||||
if($resSphinx['matches'] > 0) {
|
||||
$this->setTime($resSphinx['time']);
|
||||
/*$this->getResultSphinx($resSphinx);*/
|
||||
}
|
||||
return ($this->getResponse($resSphinx));
|
||||
}
|
||||
/***************************************************************************************************************/
|
||||
/** Partie Requette **/
|
||||
|
||||
/**
|
||||
* Grosse fonction de traitement des sequences ainsi que les différent sequencing de sphinx
|
||||
* Comme la gestion du quorum d'écrémenté sur la raisonSociale et l'Adresse
|
||||
* + La gestion des doublons et des espaces.
|
||||
*
|
||||
* @param $type vaut le type de recherche SPH_MATCH_?
|
||||
* @return les résultats dans le cas ou il y a des résultats.
|
||||
*
|
||||
*/
|
||||
public function SPH_MATCH_($type)
|
||||
{
|
||||
global $link, $sequence, $wordformRS, $adrRef;
|
||||
require_once realpath(dirname(__FILE__)) . '/sequence.php';
|
||||
|
||||
if($this->debug) $html = '';
|
||||
$ref = array('acrony', 'normal', 'points', 'split', 'space', 'double', 'quorum');
|
||||
$i = 0;
|
||||
if($this->detectedSequance() == 'S.S')
|
||||
$valeur = 'S';
|
||||
else {
|
||||
$valeur = explode(':', $this->detectedSequance());
|
||||
$valeur = trim($valeur[0]);
|
||||
}
|
||||
print_r($this->formR);
|
||||
foreach($link[$valeur]['id'] as $seqId) {
|
||||
if($this->debug) $html .= '<br /><b>Séquence :</b> '.$sequence[$link[$valeur]['id'][$i]].'<br />';
|
||||
$tab = explode('.', $sequence[$link[$valeur]['id'][$i]]);
|
||||
if(in_array('S', $tab)) {
|
||||
$nb = 1;
|
||||
if($this->debug) $html .= '<table>';
|
||||
for ($quorum = $this->countQorum(); $quorum > 0; $quorum--) {
|
||||
foreach($ref as $seq) {
|
||||
if($this->index != 'ent' and ($seq == 'acrony' or $seq == 'split'))
|
||||
continue;
|
||||
if($link[$valeur][$seq]) {
|
||||
if(isset($passe) and $passe == $sequence[$link[$valeur]['id'][$i]])
|
||||
$seq = 'quorum';
|
||||
if(in_array('R', explode('.', $sequence[$link[$valeur]['id'][$i]])))
|
||||
{
|
||||
for($quorumR = $this->countQorumR(); $quorumR > 0; $quorumR--) {
|
||||
$request = $this->constructQuerySequance($sequence[$link[$valeur]['id'][$i]], $type, array($quorum, $quorumR), $seq);
|
||||
$result = $this->sphinx->Query($request, $this->index);
|
||||
if($this->debug) {
|
||||
$html .='<tr style="background-color:'.(($result['total'] == 0)?'#FFE8E8':'#E8FFE8').'">';
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;font-size:11px;">'.$nb++.'</td>';
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;font-size:11px;width:400px;">'.$request.'</td>';
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;color:'.(($result['total']==0)?'red':'green').'">'.$result['total'].'/'.$result['total_found']. '</td>';
|
||||
if($seq != 'quorum')
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;"><i>'.$seq.'</i></td>';
|
||||
else
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;"><i style="font-size:10px;"> quorum R:'.$quorum.'</i></td>';
|
||||
$html .= '</tr>';
|
||||
}
|
||||
if($result['total'] > 0)
|
||||
break;
|
||||
}
|
||||
if($result['total'] > 0 or $passe == $sequence[$link[$valeur]['id'][$i]])
|
||||
break;
|
||||
} else {
|
||||
$request = $this->constructQuerySequance($sequence[$link[$valeur]['id'][$i]], $type, array($quorum, false), $seq);
|
||||
$result = $this->sphinx->Query($request, $this->index);
|
||||
if($this->debug) {
|
||||
$html .='<tr style="background-color:'.(($result['total'] == 0)?'#FFE8E8':'#E8FFE8').'">';
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;font-size:11px;">'.$nb++.'</td>';
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;font-size:11px;width:400px;">'.$request.'</td>';
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;color:'.(($result['total']==0)?'red':'green').'">'.$result['total'].'/'.$result['total_found']. '</td>';
|
||||
if($seq != 'quorum')
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;"><i>'.$seq.'</i></td>';
|
||||
else
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;"><i style="font-size:10px;"> quorum:'.$quorum.'</i></td>';
|
||||
$html .= '</tr>';
|
||||
}
|
||||
if($result['total'] > 0 or $passe == $sequence[$link[$valeur]['id'][$i]])
|
||||
break;
|
||||
}
|
||||
}
|
||||
if($result['total'] > 0)
|
||||
break;
|
||||
}
|
||||
if($result['total'] > 0)
|
||||
break;
|
||||
$passe = $sequence[$link[$valeur]['id'][$i]];
|
||||
}
|
||||
if($this->debug) $html .='</table>';
|
||||
} elseif(in_array('R', $tab)) {
|
||||
if($this->debug) $html .= '<table>';
|
||||
$nb = 1;
|
||||
for($qv=count(explode(' ', trim($this->formR['Voie']))); $qv > 0; $qv--) {
|
||||
$request = $this->constructQuerySequance($sequence[$link[$valeur]['id'][$i]], $type, array(false, $qv), $seq);
|
||||
$result = $this->sphinx->Query($request, $this->index);
|
||||
if($this->debug) {
|
||||
$html .='<tr style="background-color:'.(($result['total'] == 0)?'#FFE8E8':'#E8FFE8').'">';
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;font-size:11px;">'.$nb++.'</td>';
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;font-size:11px;width:400px;">'.$request.'</td>';
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;color:'.(($result['total']==0)?'red':'green').'">'.$result['total'].'/'.$result['total_found']. '</td>';
|
||||
if($seq != 'quorum')
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;"><i>'.$seq.'</i></td>';
|
||||
else
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;"><i style="font-size:10px;"> quorum:'.$quorum.'</i></td>';
|
||||
$html .= '</tr>';
|
||||
}
|
||||
if($result['total'] > 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if($this->debug) $html .= '</table>';
|
||||
} else {
|
||||
if($this->debug) $html .= '<table>';
|
||||
$request = $this->constructQuerySequance($sequence[$link[$valeur]['id'][$i]], $type, array(false, false), $seq);
|
||||
$result = $this->sphinx->Query(($request != " ")?$request:'', $this->index);
|
||||
if($this->debug) {
|
||||
$html .='<tr style="background-color:'.(($result['total'] == 0)?'#FFE8E8':'#E8FFE8').'">';
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;font-size:11px;">'.$nb++.'</td>';
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;font-size:11px;width:400px;">'.$request.'</td>';
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;color:'.(($result['total']==0)?'red':'green').'">'.$result['total'].'/'.$result['total_found']. '</td>';
|
||||
if($seq != 'quorum')
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;"><i>'.$seq.'</i></td>';
|
||||
else
|
||||
$html .= '<td style="border:1px solid silver;padding:3px;"><i style="font-size:10px;"> quorum:'.$quorum.'</i></td>';
|
||||
$html .= '</tr>';
|
||||
$html .= '</table>';
|
||||
}
|
||||
}
|
||||
if($result['total'] > 0) {
|
||||
break;
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
$this->pertinance = $this->levenshteinCrit($sequence[$link[$valeur]['id'][$i]]);
|
||||
if($this->debug) $this->printInformations($html);
|
||||
return ($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cette fonction permet une recherche simple avec les annonce juste un filtre + un champs de recherche
|
||||
* J'ai preferer ne pas la mettre dans le moteur car trop leger pour suporter les requette du moteur se serai une surcharge pour rien...
|
||||
*
|
||||
* getResponse implemente la requete SQL, pour respecter la hierarchie de code !
|
||||
* @return type
|
||||
*/
|
||||
public function HistoSearch()
|
||||
{
|
||||
if(!empty($this->formR['annee1']))
|
||||
$this->sphinx->setFilter('annee1', array($this->formR['annee1']));
|
||||
$resSphinx = $this->sphinx->Query($this->formR['recherche'], $this->index);
|
||||
return ($this->getResponse($resSphinx));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestion de la raison sociale Formatage
|
||||
* avec des preg_replace etc...
|
||||
**/
|
||||
public function formatRaisonSociale($rs, $double = false)
|
||||
{
|
||||
global $link, $sequence, $wordformRS, $adrRef;
|
||||
require_once realpath(dirname(__FILE__)) . '/sequence.php';
|
||||
|
||||
if(!empty($this->formR['raisonSociale'])) {
|
||||
$request = '';
|
||||
$array = explode(' ', $rs);
|
||||
foreach($array as $item) {
|
||||
$item = str_replace('\'', ' ', $item);
|
||||
if((strlen($item) > $this->maxSizeWord and !in_array(strtoupper($item), $wordformRS) and $this->index == 'ent') or strlen($item) > $this->maxSizeWord and count($array) == 1) {
|
||||
if($double)
|
||||
$request .= preg_replace('/(?:([^*])\1)\1*/', '$1', $item).' ';
|
||||
else
|
||||
$request .= $item.' ';
|
||||
} else {
|
||||
$request .= $item.' ';
|
||||
}
|
||||
}
|
||||
return ($request);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui permet de gerer les CP et le Ville
|
||||
* @param type $cp
|
||||
* @return type
|
||||
*/
|
||||
public function formatCP($cp)
|
||||
{
|
||||
$matches = '';
|
||||
$arrayChamp = explode(' ', trim($cp));
|
||||
$str = false;
|
||||
|
||||
for($i=0; $i < count($arrayChamp); $i++)
|
||||
{
|
||||
if(preg_match('/^[0-9]{1,}$/', $cp, $matches))
|
||||
{
|
||||
if (strlen($matches[0]) == 1 and $matches[0] < 10) {
|
||||
$matches[0] = '0'.$matches[0];
|
||||
}
|
||||
$size = strlen($matches[0]);
|
||||
if($size >= 2 and $this->index == 'ent' or $this->index == 'dir') {
|
||||
if(substr($matches[0], 0, 2) > 95 ) {
|
||||
// DOM-TOM outre mers
|
||||
$this->sphinx->setFilter('adr_dep', array((int)substr($matches[0], 0, 3)));
|
||||
} else if (substr($matches[0], 0, 2) == 20) {
|
||||
// Teritoire de la corse 2A et 2B @todo Attention a la compilation transformer 2A et 2B en 200
|
||||
$this->sphinx->setFilter('adr_dep', array(200));
|
||||
} else {
|
||||
// Classique Metropole
|
||||
$this->sphinx->setFilter('adr_dep', array((int)(substr($cp, 0, 2))));
|
||||
}
|
||||
if($size == 5) {
|
||||
$this->sphinx->setFilter('adr_cp', array(intval($matches[0])));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
$str .= $arrayChamp[$i];
|
||||
}
|
||||
return ($str);
|
||||
}
|
||||
|
||||
public function FiltreDateDeNaissance()
|
||||
{
|
||||
if(!empty($this->formR['dirDateNaissMM'])) {
|
||||
if($this->formR['dirDateNaissMM'] > 0 and $this->formR['dirDateNaissMM'] < 12) {
|
||||
if(($this->formR['dirDateNaissMM'] % 2) != 0 )
|
||||
{
|
||||
if($this->formR['dirDateNaissJJ'] > 0 and $this->formR['dirDateNaissJJ'] < 31) {
|
||||
$this->sphinx->setFilter('naiss_jour', array($this->formR[dirDateNaissJJ]));
|
||||
}
|
||||
} else {
|
||||
if($this->formR['dirDateNaissJJ'] > 0 and $this->formR['dirDateNaissJJ'] < 29) {
|
||||
$this->sphinx->setFilter('naiss_jour', array($this->formR[dirDateNaissJJ]));
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if(!empty($this->formR['dirDateNaissJJ'])) {
|
||||
$this->sphinx->setFilter('naiss_jour', array($this->formR[dirDateNaissJJ]));
|
||||
}
|
||||
}
|
||||
if($this->formR['dirDateNaissAAAA'] > 0 and $this->formR['dirDateNaissAAAA'] < date('Y')) {
|
||||
$this->sphinx->setFilter('naiss_annee', array($this->formR[dirDateNaissAAAA]));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retire les petits mots de la raisonSociale.
|
||||
* @param $rs => raisonSociale
|
||||
* @return raisonSociale modifié.
|
||||
*/
|
||||
public function removeSmallWord($rs)
|
||||
{
|
||||
global $link, $sequence, $wordformRS, $adrRef;
|
||||
require_once realpath(dirname(__FILE__)) . '/sequence.php';
|
||||
|
||||
$array = explode(' ', $rs);
|
||||
if(count($array) > 2) {
|
||||
foreach($array as $item) {
|
||||
if(strlen($item) > 1 and !in_array(strtoupper($item), $wordformRS)) {
|
||||
$request .= $item.' ';
|
||||
} else if (strlen($item) == 1) {
|
||||
$this->acronyme .= $item;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ((empty($request))?$rs:$request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Elle format l'adresse.
|
||||
* @param $adress
|
||||
* @return adresse modifié.
|
||||
*/
|
||||
public function formatAdress($adress)
|
||||
{
|
||||
require_once 'sequence.php';
|
||||
|
||||
$adr = explode(' ', $adress);
|
||||
foreach($adr as $item) {
|
||||
if(!in_array($item, $adrRef)) {
|
||||
$request .= $item.' ';
|
||||
}
|
||||
}
|
||||
return ($request);
|
||||
}
|
||||
|
||||
/***************************************************************************************************************/
|
||||
/** Partie Sequance **/
|
||||
|
||||
/**
|
||||
* Calcule le quorum selon le nombre de mots présents dans la RS.
|
||||
* @return Nombre.
|
||||
*/
|
||||
public function countQorum()
|
||||
{
|
||||
$i=0;
|
||||
$val = explode(' ', $this->formR['raisonSociale']);
|
||||
foreach($val as $item) {
|
||||
if(empty($item))
|
||||
unset($val[$i]);
|
||||
$i++;
|
||||
}
|
||||
return (count($val));
|
||||
}
|
||||
|
||||
public function countQorumR()
|
||||
{
|
||||
$i=0;
|
||||
$val = explode(' ', $this->formR['Voie']);
|
||||
foreach($val as $item) {
|
||||
if(empty($item))
|
||||
unset($val[$i]);
|
||||
$i++;
|
||||
}
|
||||
return (count($val));
|
||||
}
|
||||
|
||||
/***************************************************************************************************************/
|
||||
/** Partie Sequance **/
|
||||
|
||||
/**
|
||||
* Permet de determiner la sequence celon les parametres entré dans les formulaire.
|
||||
* @return sequence formater sous ce type "S.D.R : RaisonSociale Departement Voie"
|
||||
*/
|
||||
public function detectedSequance()
|
||||
{
|
||||
$sequance = "";
|
||||
foreach($this->formR as $name => $form) {
|
||||
if($name != 'SPH_MATCH' and !empty($this->formR[$name])) {
|
||||
$sequance .= '.'.$this->form2crit[$name];
|
||||
$values .= $name.', ';
|
||||
}
|
||||
}
|
||||
return (substr($sequance,1).' : '.$values);
|
||||
}
|
||||
|
||||
/**
|
||||
* Elle construit la requette pour sphinx celon certain parametre et un certain formatage.
|
||||
*
|
||||
* @param $sequances de format "S.D.V"
|
||||
* @param $type type de recherche sphinx SPH_MATCH_?
|
||||
* @param $qorum pour la raisons sociale
|
||||
* @param $seq type de sequence "espace, normal, double"
|
||||
* @return $request bien formater pour sphinx.
|
||||
*/
|
||||
protected function constructQuerySequance($sequances, $type, $quorum, $seq)
|
||||
{
|
||||
$this->sphinx->ResetFilters();
|
||||
$adresse = '@adresse "';
|
||||
$ville = '@ville "';
|
||||
$request = '';
|
||||
foreach($this->form2crit as $name => $crit) {
|
||||
$diff = explode('.', $sequances);
|
||||
if(in_array($crit, $diff)) {
|
||||
if ($name == 'raisonSociale') {
|
||||
$request = $request .= (($type=='SPH_MATCH_EXTENDED' or $type=='SPH_MATCH_EXTENDED2')?'@nom ':'').'';
|
||||
switch($seq) {
|
||||
case 'radica':
|
||||
//$request = substr(trim($this->formR['raisonSociale']), 0, 3);
|
||||
break;
|
||||
case 'quorum':
|
||||
$request .= ' "'.$this->formR[$name].'"'.(($quorum[0] >= 1)?'/'.$quorum[0]:'');
|
||||
break;
|
||||
case 'space':
|
||||
$request .= '"'.str_replace(' ', '', $this->formatRaisonSociale($this->formR[$name])).'" | ';
|
||||
$request .= '"'.str_replace(' ', '', $this->formatRaisonSociale($this->formR[$name], true)).'"';
|
||||
break;
|
||||
case 'double':
|
||||
$request .= '"'.$this->formatRaisonSociale($this->formR[$name], true).'" | ';
|
||||
$request .= '"'.$this->formatRaisonSociale($this->formR[$name], true).'" '.(($quorum[0] >= 1)?'/'.$quorum[0]:'').' ';
|
||||
break;
|
||||
case 'points':
|
||||
$request .= '"'.str_replace('.', '', $this->formR[$name]).'"';
|
||||
break;
|
||||
case 'acrony':
|
||||
if(!empty($this->acronyme) and strlen($this->acronyme) > 2) {
|
||||
$request .= '"'.$this->acronyme.' '.$this->formatRaisonSociale($this->formR[$name]).'"/'.$quorum[0];
|
||||
}
|
||||
break;
|
||||
case 'split':
|
||||
for($count=0;$count < 2; $count++) {
|
||||
$rs = (($i == 0)?trim($this->formR[$name]):str_replace('.', '', trim($this->formR[$name])));
|
||||
$precedent = '';
|
||||
$request .= '(';
|
||||
if(count(explode(' ', $rs)) == 1)
|
||||
{
|
||||
for($i=0; $i < strlen($rs); $i++) {
|
||||
$precedent .= $rs[$i];
|
||||
$request .= ' "'.$precedent.' '.substr($rs, $i+1).'"'.(($i+1 != strlen($rs))?' ':'');
|
||||
if($i+1 < strlen($rs))
|
||||
$request .= ' | ';
|
||||
|
||||
}
|
||||
}
|
||||
$request .=($count == 0)?') |':')';
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if($this->index == 'act')
|
||||
$request .= '"'.$this->formR[$name].'" /'.(count(explode(' ', $this->formR['raisonSociale']))-1).' | ';
|
||||
else
|
||||
$request .= '"'.$this->formR[$name].'" | ';
|
||||
$request .= '@nom "'.$this->formatRaisonSociale($this->formR[$name], true).'"';
|
||||
}
|
||||
}
|
||||
else if($name == 'cpVille') {
|
||||
$str = $this->formatCP($this->formR[$name]);
|
||||
if($str != false) {
|
||||
$adresse .= $str;
|
||||
}
|
||||
}
|
||||
else if($name == 'Ville') {
|
||||
$ville .= $this->formR[$name].' ';
|
||||
}
|
||||
else if($name == 'naf') {
|
||||
$this->sphinx->setFilter('naf', array($this->formR[$name]));
|
||||
}
|
||||
else if($name == 'Voie') {
|
||||
$adresse .= $this->formR[$name].' ';
|
||||
}
|
||||
else if ($name == 'siret') {
|
||||
if(strlen($this->formR[$name]) == 14) {
|
||||
$this->sphinx->setFilter('siren', array(substr($this->formR[$name], 0, 9)));
|
||||
$this->sphinx->setfilter('nic', array(substr($this->formR[$name], 9)));
|
||||
} else if (strlen($this->fomrR[$name]) == 9) {
|
||||
$this->sphinx->setFilter('siren', array($this->formR[$name]));
|
||||
}
|
||||
}
|
||||
else if($name == 'numeroVoie') {
|
||||
$this->sphinx->setFilter('adr_num', array($this->formR[$name]));
|
||||
}
|
||||
else if($name == 'actMin' or $name == 'actMax') {
|
||||
if(!empty($this->formR['actMin']) and !empty($this->formR['actMax']))
|
||||
$this->sphinx->SetFilterRange('PminNum', $this->formR['actMin'], $this->formR['actMax']);
|
||||
}
|
||||
else if ($name == 'dirDateNaissJJ' or $name == 'dirDateNaissMM' or $name = 'dirDateNaissAAAA') {
|
||||
$this->FiltreDateDeNaissance();
|
||||
}
|
||||
else if ($this->actif) {
|
||||
$this->sphinx->setFilter('actif', array(1));
|
||||
}else {
|
||||
$request .= $this->formR[$name].' ';
|
||||
}
|
||||
}
|
||||
}
|
||||
if($adresse != '@adresse "') {
|
||||
$request = $request .' '.$adresse.'"'. (($quorum[1]!=false)?'/'.$quorum[1]:'');
|
||||
}
|
||||
if($ville != '@ville "')
|
||||
$request = $request .' '.$ville.'"';
|
||||
echo $request.'<br />';
|
||||
return ($request);
|
||||
}
|
||||
|
||||
/***************************************************************************************************************/
|
||||
/** Partie Pertinence **/
|
||||
/* La pertinence doit être calculé a partir des critères recherche ( la séquence utilisé ) moins la séquence avec la quelle
|
||||
* ont a trouvé les résultat ainsi que la distance des mots de la RS ou des l'adresse.
|
||||
* exemple :
|
||||
* S = scores et decisions
|
||||
* D = 78
|
||||
* V = Rambouillet(s)
|
||||
*
|
||||
* SDV = 20; resultat de base
|
||||
* -> 0 resultats
|
||||
* SD = 15;
|
||||
* -> 1 resultat
|
||||
* V = levenshtein : ~1 alors 5-1 (étant le poid de V) = 4 donc 15+4 = 19 pourquoi -1, La proximité est proche plus le nombre est grand plus l'éloignement l'est.
|
||||
* total pertinence = 19
|
||||
*
|
||||
* @param <type> $formR
|
||||
* @param <type> $mySql
|
||||
*/
|
||||
|
||||
protected function levenshteinCrit($crit)
|
||||
{
|
||||
$pertinance = 0;
|
||||
$weight = array('I' => 10, 'S' => 9, 'D' => 6, 'L' => 4, 'V' => 5, 'N' => 2, 'R' => 3);
|
||||
$crit = explode('.', $crit);
|
||||
for($i=0; $i < count($crit); $i++) {
|
||||
$pertinance += $weight[$crit[$i]];
|
||||
}
|
||||
return ($pertinance);
|
||||
}
|
||||
|
||||
protected function checkParamsRS($rs)
|
||||
{
|
||||
if(strlen($rs) > 3)
|
||||
return (false);
|
||||
else
|
||||
return (true);
|
||||
}
|
||||
|
||||
protected function getPertinence($formR, $mySql)
|
||||
{
|
||||
$formR = strtoupper($formR);
|
||||
$mySql = strtoupper($mySql);
|
||||
|
||||
$array = explode(' ', $mySql);
|
||||
$array2 = explode(' ', $formR);
|
||||
|
||||
for($i = 0;$i < count($array2); $i++) {
|
||||
if(in_array($array2[$i], $array)) {
|
||||
$size += levenshtein($formR, $mySql);
|
||||
}
|
||||
}
|
||||
return (($size)?$size:100);
|
||||
}
|
||||
|
||||
/***************************************************************************************************************/
|
||||
/** Partie Reponse **/
|
||||
|
||||
public function getResponse($resSphinx)
|
||||
{
|
||||
$i= 0;
|
||||
$response = array();
|
||||
switch($this->index) {
|
||||
case 'ent':
|
||||
$sql = 'SELECT raisonSociale, CONCAT(siren, nic) AS siret, siren, nic, siege, raisonSociale,
|
||||
sigle, enseigne, adr_num, adr_typeVoie, adr_libVoie, adr_comp, adr_cp,
|
||||
adr_ville, tel, fax, cj, actif, ape_etab, ape_entrep FROM etablissements WHERE id IN (';
|
||||
foreach($resSphinx['matches'] as $elements) {
|
||||
/*$sql .= 'id='.$elements['id'];*/
|
||||
$sql .= $elements['id'];
|
||||
if($i+1 < count($resSphinx['matches']))
|
||||
$sql .= ', ';
|
||||
$i++;
|
||||
}
|
||||
$sql .= ") ORDER BY rang DESC";
|
||||
break;
|
||||
case 'dir':
|
||||
$sql = 'SELECT e.id, e.raisonSociale, CONCAT(e.siren, e.nic) AS siret, e.siren, e.nic, e.siege, e.raisonSociale,
|
||||
e.sigle, e.enseigne, e.adr_num, e.adr_typeVoie, e.adr_libVoie, e.adr_comp, e.adr_cp, e.adr_ville, e.tel,
|
||||
e.fax, e.cj, e.actif, e.ape_etab, ape_entrep, d.nom, d.prenom, l.libelle AS fonction_lib from rncs_dirigeants = d, etablissements e, bodacc_fonctions l WHERE d.id IN (';
|
||||
foreach($resSphinx['matches'] as $elements) {
|
||||
$sql .= $elements['id'];
|
||||
if($i+1 < count($resSphinx['matches']))
|
||||
$sql .= ', ';
|
||||
$i++;
|
||||
}
|
||||
$sql .= ' ) AND d.siren=e.siren and d.fonction_code=l.codeFct AND e.siege=1 GROUP BY d.siren, d.id ORDER BY e.rang DESC, e.actif DESC, e.siege DESC, e.id ASC';
|
||||
break;
|
||||
case 'act':
|
||||
$sql = 'SELECT DISTINCT e.siren, l.id AS lienId, l.actif AS lienActif, l.source, l.Pmin, l.PpPm, l.id2, '.
|
||||
'l.Siren2, l.RaisonSociale, l.Pays, '.
|
||||
'IF(l.dateUpdate>IF(l.dateInsert>l.dateLien,l.dateInsert,l.dateLien),l.dateUpdate,IF(l.dateInsert>l.dateLien,l.dateInsert,l.dateLien)) AS dateLien, '.
|
||||
'e.id, CONCAT(siren,nic) AS siret, siren, nic, siege, e.raisonSociale, sigle, '.
|
||||
'enseigne, adr_num, adr_typeVoie, adr_libVoie, adr_comp, adr_cp, adr_ville, '.
|
||||
'tel, fax, cj, e.actif, ape_etab, ape_entrep, e.rang '.
|
||||
'FROM liens l, etablissements e '.
|
||||
'WHERE l.id IN (';
|
||||
foreach($resSphinx['matches'] as $elements) {
|
||||
$sql .= $elements['id'];
|
||||
if($i+1 < count($resSphinx['matches']))
|
||||
$sql .= ', ';
|
||||
$i++;
|
||||
}
|
||||
$sql .= ") AND l.Siren1=e.siren AND siege=1 AND e.actif=1 ORDER BY e.rang DESC";
|
||||
break;
|
||||
case 'Histo' :
|
||||
$sql = 'SELECT Histo as Loc, id, nomFichier, annee1, bod, texte FROM bodacc_cor WHERE id IN ( ';
|
||||
foreach($resSphinx['matches'] as $elements) {
|
||||
$sql .= $elements['id'];
|
||||
if($i+1 < count($resSphinx['matches']))
|
||||
$sql .= ', ';
|
||||
$i++;
|
||||
}
|
||||
$sql .= ')';
|
||||
break;
|
||||
}
|
||||
$i = 0;
|
||||
$db = $this->databaseJO();
|
||||
$result = $db->query($sql);
|
||||
while($row = mysqli_fetch_assoc($result)) {
|
||||
if($this->index != 'Histo') {
|
||||
$response['reponses'][$i]['Siret'] = $row['siret'];
|
||||
$response['reponses'][$i]['Siren'] = $row['siren'];
|
||||
$response['reponses'][$i]['Nic'] = $row['nic'];
|
||||
$response['reponses'][$i]['Siege'] = $row['siege'];
|
||||
$response['reponses'][$i]['Nom'] = $row['raisonSociale'];
|
||||
$response['reponses'][$i]['Nom2'] = '';
|
||||
$response['reponses'][$i]['Sigle'] = $row['sigle'];
|
||||
$response['reponses'][$i]['Enseigne'] = $row['enseigne'];
|
||||
$response['reponses'][$i]['Adresse'] = $row['adr_num'].' '.$row['adr_typeVoie'].' '.$row['adr_libVoie'];
|
||||
$response['reponses'][$i]['Adresse2'] = $row['adr_comp'];
|
||||
$response['reponses'][$i]['CP'] = $row['adr_cp'];
|
||||
$response['reponses'][$i]['Ville'] = $row['adr_ville'];
|
||||
$response['reponses'][$i]['Tel'] = $row['tel'];
|
||||
$response['reponses'][$i]['Fax'] = $row['fax'];
|
||||
$response['reponses'][$i]['FJ'] = $row['cj'];
|
||||
$response['reponses'][$i]['Actif'] = $row['actif'];
|
||||
$response['reponses'][$i]['NafEtab'] = $row['ape_etab'];
|
||||
$response['reponses'][$i]['NafEnt'] = $row['ape_entrep'];
|
||||
}
|
||||
switch($this->index) {
|
||||
case 'ent':
|
||||
$pertinence = $this->getPertinence($this->formR['raisonSociale'], $row['raisonSociale']);
|
||||
$response['reponses'][$i]['Pertinence'] = $pertinence;
|
||||
break;
|
||||
case 'act':
|
||||
$response['reponses'][$i]['ActNomRs'] = $row['raisonSociale'];
|
||||
$response['reponses'][$i]['ActPays'] = $row['Pays'];
|
||||
$response['reponses'][$i]['ActDateLien'] = $row['dateLien'];
|
||||
$response['reponses'][$i]['ActActif'] = $row['actif'];
|
||||
$response['reponses'][$i]['ActPmin'] = $row['Pmin'];
|
||||
break;
|
||||
case 'dir':
|
||||
$response['reponses'][$i]['DirRs'] = '';
|
||||
$response['reponses'][$i]['DirNom'] = $row['nom'];
|
||||
$response['reponses'][$i]['DirPrenom'] = $row['prenom'];
|
||||
$response['reponses'][$i]['DirNomUsage'] = '';
|
||||
$response['reponses'][$i]['DirDateEffet'] = '';
|
||||
$response['reponses'][$i]['DirFonction'] = $row['fonction_lib'];
|
||||
$response['reponses'][$i]['DirDepart'] = '';
|
||||
break;
|
||||
case 'Histo':
|
||||
$response['reponses'][$i]['Localisation'] = $row['Loc'];
|
||||
$response['reponses'][$i]['Fichier'] = $row['nomFichier'];
|
||||
$response['reponses'][$i]['Annee'] = $row['annee'];
|
||||
$response['reponses'][$i]['Code'] = $row['bod'];
|
||||
$response['reponses'][$i]['Texte'] = $row['texte'];
|
||||
|
||||
$response['reponses'][$i]['id'] = $row['id'];
|
||||
$response['reponses'][$i]['Pertinence'] = $resSphinx[$row['id']]['weight'];
|
||||
break;
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
return ($response);
|
||||
}
|
||||
|
||||
/***************************************************************************************************************/
|
||||
/** Partie debug **/
|
||||
|
||||
protected function cmp($a, $b)
|
||||
{
|
||||
return (($a < $b)?-1:1);
|
||||
}
|
||||
|
||||
public function getResultSphinx($resSphinx)
|
||||
{
|
||||
$response = $this->getResponse($resSphinx);
|
||||
/** Sortir les resultats par pertinence **/
|
||||
//usort($response, array($this, 'cmp'));
|
||||
$html .= '<ol>';
|
||||
if($this->index == 'ent') {
|
||||
for($i= 0; $i < count($response['reponses']); $i++) {
|
||||
$html .= '<li>['.$response['reponses'][$i]['Pertinence'].'] [ '.$response['reponses'][$i]['Siren'].' ] <b>'.$response['reponses'][$i]['Nom'].'</b> '.$response['reponses'][$i]['CP'].' '.$response['reponses'][$i]['Adresse'].' '.$response['reponses'][$i]['Ville'].'</li>';
|
||||
}
|
||||
} else if ($this->index == 'act') {
|
||||
for($i= 0; $i < count($response['reponses']); $i++) {
|
||||
$html .= '<li><b>'.$response['reponses'][$i]['ActNomRs'].'</b> '.$response['reponses'][$i]['ActPays'].' '.$response['reponses'][$i]['ActDateLien'].' '.$response['reponses'][$i]['ActPmin'].'</li>';
|
||||
}
|
||||
} else if ($this->index == 'dir') {
|
||||
for($i= 0; $i < count($response['reponses']); $i++) {
|
||||
$html .= '<li><b>'.$response['reponses'][$i]['DirNom'].'</b> '.$response['reponses'][$i]['DirPrenom'].' '.$response['reponses'][$i]['Nom'].'</li>';
|
||||
}
|
||||
}
|
||||
$html .= '</ol>';
|
||||
$this->printInformations($html);
|
||||
$critere = explode(':', $this->detectedSequance());
|
||||
$html = '<b>Critères detectés : </b>'.$critere[0].'<br />';
|
||||
|
||||
$this->printInformations($html);
|
||||
}
|
||||
|
||||
protected function printStatus($response)
|
||||
{
|
||||
if(!$response) {
|
||||
return ($this->printError('Erreur : '.$this->sphinx->GetLastError()));
|
||||
}
|
||||
if ($this->sphinx->GetLastWarning()) {
|
||||
return ($this->printError('Erreur : '.$this->sphinx->GetLastWarning()));
|
||||
}
|
||||
$html = '<b>Résultats trouvés : <span style="color:'.(($response['total']>0)?'green':'red').'">'.$response['total'].'</span> sur <span style="color:'.(($response['total_found']>0)?'green':'red').'">'.$response['total_found'].'</span> trouvé en '.$response['time'].' secondes !<br /></b>';
|
||||
$html .= '<br>Statistiques de recherches :<br />';
|
||||
$html .= '<ol>';
|
||||
if(isset($response['words'])) {
|
||||
foreach($response['words'] as $words => $info) {
|
||||
$html .= '<li><b>'.$words.'</b> a été trouvé <span style="color:'.(($info['hits']>0)?'green':'red').'">'.$info['hits'].'</span> fois</li>';
|
||||
}
|
||||
}
|
||||
$html .= '</ol>';
|
||||
$this->printInformations($html);
|
||||
}
|
||||
|
||||
protected function printError($error)
|
||||
{
|
||||
$this->html .= '<div style="color:black;background-color:#FFBFBF;border:1px dashed white;">';
|
||||
$this->html .= $error;
|
||||
$this->html .= '</div>';
|
||||
}
|
||||
|
||||
protected function printInformations($informations)
|
||||
{
|
||||
if($this->debug) {
|
||||
$this->html .= '<div style="text-align:left;margin:5px;background-image: url(/themes/default/images/information.png);font-size:13px;font-family:Verdana;margin-top:10px;padding:5px;color:black;background-color:black;border:1px dashed white;">';
|
||||
$this->html .= $informations;
|
||||
$this->html .= '</div>';
|
||||
}
|
||||
}
|
||||
/***************************************************************************************************************/
|
||||
/** Partie Setters **/
|
||||
|
||||
public function setSortMode($mode) {
|
||||
switch($mode) {
|
||||
case 'SPH_SORT_RELEVANCE':
|
||||
return (SPH_SORT_RELEVANCE);
|
||||
case 'SPH_SORT_ATTR_DESC':
|
||||
return (SPH_SORT_ATTR_DESC);
|
||||
case 'SPH_SORT_ATTR_ASC':
|
||||
return (SPH_SORT_ATTR_ASC);
|
||||
case 'SPH_SORT_TIME_SEGMENTS':
|
||||
return (SPH_SORT_TIME_SEGMENTS);
|
||||
case 'SPH_SORT_EXTENDED':
|
||||
return (SPH_SORT_EXTENDED);
|
||||
case 'SPH_SORT_EXPR':
|
||||
return (SPH_SORT_EXPR);
|
||||
default:
|
||||
return (SPH_SORT_RELEVANCE);
|
||||
}
|
||||
}
|
||||
|
||||
public function setForm($form) {
|
||||
$this->formR = $form;
|
||||
}
|
||||
|
||||
public function setSphinx($sphinx) {
|
||||
$this->sphinx = $sphinx;
|
||||
}
|
||||
|
||||
public function execute() {
|
||||
return $this->search();
|
||||
}
|
||||
|
||||
public function setTime($time) {
|
||||
$this->total_time += $time;
|
||||
}
|
||||
|
||||
public function setMaxSizeWord($size) {
|
||||
$this->maxSizeWord = $size;
|
||||
}
|
||||
|
||||
public function setSequance($bool = true) {
|
||||
$this->sequances = $bool;
|
||||
}
|
||||
|
||||
public function setQuorums($bool = true) {
|
||||
$this->quorum = $bool;
|
||||
}
|
||||
|
||||
public function setProximotes($bool = true) {
|
||||
$this->proximites = $bool;
|
||||
}
|
||||
|
||||
public function setPoids($bool = true) {
|
||||
$this->poids = $bool;
|
||||
}
|
||||
|
||||
public function setActif($bool = true) {
|
||||
$this->actif = $bool;
|
||||
}
|
||||
|
||||
public function setQuorumsize($size) {
|
||||
$this->Quorumsize = $size;
|
||||
}
|
||||
|
||||
public function setProximiteSize($size) {
|
||||
$this->ProximiteSize = $size;
|
||||
}
|
||||
|
||||
public function setNbRep($max) {
|
||||
$this->nbRep = $max;
|
||||
}
|
||||
|
||||
public function setDebug($bool = true) {
|
||||
$this->debug = $bool;
|
||||
}
|
||||
|
||||
public function setPage($page) {
|
||||
$this->page = $page;
|
||||
}
|
||||
|
||||
public function setDeb($deb) {
|
||||
$this->deb = $deb;
|
||||
}
|
||||
|
||||
public function setMax($max) {
|
||||
$this->max = $max;
|
||||
}
|
||||
|
||||
public function setIndex($index) {
|
||||
$this->index = $index;
|
||||
}
|
||||
/***************************************************************************************************************/
|
||||
}
|
||||
|
||||
?>
|
206
library/Metier/sphinx2/rechercheFonc.php
Normal file
206
library/Metier/sphinx2/rechercheFonc.php
Normal file
@ -0,0 +1,206 @@
|
||||
<?php
|
||||
require_once realpath(dirname(__FILE__)) . '/sphinxapi.php';
|
||||
require_once realpath(dirname(__FILE__)) . '/SDmotor.class.php';
|
||||
|
||||
Class rechercheFonc extends SDmotor
|
||||
{
|
||||
public function __construct($debug = false) {
|
||||
$this->debug = $debug;
|
||||
}
|
||||
|
||||
public function rechercheAct($formR, $deb, $nbRep, $max)
|
||||
{
|
||||
|
||||
$sphinx = new SphinxClient();
|
||||
$sphinx->SetServer(SPHINX_ACT_HOST, SPHINX_ACT_PORT);
|
||||
$sphinx->SetRankingMode(SPH_RANK_PROXIMITY_BM25);
|
||||
$sphinx->SetConnectTimeout(1);
|
||||
$sphinx->SetArrayResult(true);
|
||||
|
||||
$this->setIndex('act');
|
||||
|
||||
$this->setDeb($deb);
|
||||
$this->setNbRep($nbRep);
|
||||
$this->setMax($max);
|
||||
|
||||
$this->_initForm($formR);
|
||||
$this->setSphinx($sphinx);
|
||||
$this->setSequance();
|
||||
return ($this->execute());
|
||||
}
|
||||
|
||||
public function rechercheDir($formR, $deb, $nbRep, $max)
|
||||
{
|
||||
$sphinx = new SphinxClient();
|
||||
$sphinx->SetServer(SPHINX_DIR_HOST, SPHINX_DIR_PORT);
|
||||
$sphinx->SetRankingMode(SPH_RANK_PROXIMITY_BM25);
|
||||
$sphinx->SetConnectTimeout(1);
|
||||
$sphinx->SetArrayResult(true);
|
||||
|
||||
$this->setIndex('dir');
|
||||
|
||||
$this->setDeb($deb);
|
||||
$this->setNbRep($nbRep);
|
||||
$this->setMax($max);
|
||||
|
||||
$this->_initForm($formR);
|
||||
$this->setSphinx($sphinx);
|
||||
$this->setSequance();
|
||||
return ($this->execute());
|
||||
}
|
||||
|
||||
public function rechercheEnt($formR, $deb, $nbRep, $max)
|
||||
{
|
||||
$sphinx = new SphinxClient();
|
||||
$sphinx->SetServer(SPHINX_ENT_HOST, SPHINX_ENT_PORT);
|
||||
$sphinx->SetRankingMode(SPH_RANK_PROXIMITY_BM25);
|
||||
$sphinx->SetConnectTimeout(1);
|
||||
$sphinx->SetArrayResult(true);
|
||||
|
||||
$this->setIndex('ent');
|
||||
|
||||
$this->setDeb($deb);
|
||||
$this->setNbRep($nbRep);
|
||||
$this->setMax($max);
|
||||
|
||||
$this->_initForm($formR);
|
||||
$this->setSphinx($sphinx);
|
||||
$this->setSequance();
|
||||
return ($this->execute());
|
||||
}
|
||||
|
||||
public function rechercheHisto($formR, $deb, $nbRep, $max)
|
||||
{
|
||||
$sphinx = new SphinxClient();
|
||||
$sphinx->SetServer(SPHINX_ENT_HOST, SPHINX_ENT_PORT);
|
||||
$sphinx->SetRankingMode(SPH_RANK_PROXIMITY_BM25);
|
||||
$sphinx->SetConnectTimeout(1);
|
||||
$sphinx->SetArrayResult(true);
|
||||
|
||||
$this->setIndex('histo');
|
||||
$this->setSphinx($sphinx);
|
||||
return ($this->HistoSearch());
|
||||
}
|
||||
|
||||
public function recherche($formR, $deb = 0, $nbRep = 20, $max = 1000)
|
||||
{
|
||||
if ($formR['type'] == 'ent') {
|
||||
return $this->rechercheEnt($formR, $deb, $nbRep, $max);
|
||||
} else if ($formR['type'] == 'dir') {
|
||||
return $this->rechercheDir($formR, $deb, $nbRep, $max);
|
||||
} else if ($formR['type'] == 'act') {
|
||||
return $this->rechercheAct($formR, $deb, $nbRep, $max);
|
||||
} else {
|
||||
return array( 'nbReponses' => 0,
|
||||
'nbReponsesTotal' => 0,
|
||||
'duree' => 0,
|
||||
'erreur' => 'Type de recherche inconnu');
|
||||
}
|
||||
}
|
||||
|
||||
public function sommeDeControle($sn)
|
||||
{
|
||||
$s = 0;
|
||||
$n = strlen($sn);
|
||||
for ($i = 0; $i < $n; ++$i) {
|
||||
if ($i & 1) {
|
||||
$t = substr($sn, $n - $i - 1, 1) << 1;
|
||||
$s += ($t > 9)? $t - 9 : $t;
|
||||
} else {
|
||||
$s += substr($sn, $n - $i - 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
return $s % 10;
|
||||
}
|
||||
|
||||
public function verificationDuSiret($siret)
|
||||
{
|
||||
if (strlen($siret) == 14) {
|
||||
$sn = substr($siret, 0, 9);
|
||||
$st = $siret;
|
||||
} else if (strlen($siret) == 9) {
|
||||
$sn = $siret;
|
||||
$st = 0;
|
||||
} else {
|
||||
// TODO: message d'erreur et/ou correction
|
||||
return false;
|
||||
}
|
||||
// Verification du siren
|
||||
$s = sommeDeControle($sn);
|
||||
if ($s != 0) {
|
||||
// Correction du chiffre de controle
|
||||
$sr = (substr($sn, 8, 1) - $s + 10) % 10;
|
||||
$liste = array(substr($sn, 0, 8).$sr);
|
||||
// Transpositions
|
||||
for ($i = 0; $i < 8; ++$i) {
|
||||
$n1 = substr($sn, $i, 1);
|
||||
$n2 = substr($sn, $i + 1, 1);
|
||||
if ($n1 == $n2) {
|
||||
continue;
|
||||
}
|
||||
$p = '';
|
||||
if ($i > 0) {
|
||||
$p .= substr($sn, 0, $i);
|
||||
}
|
||||
$p .= $n2;
|
||||
if ($i < 7) {
|
||||
$p .= $n1;
|
||||
}
|
||||
if ($i < 6) {
|
||||
$p .= substr($sn, $i + 2, 6 - $i);
|
||||
}
|
||||
if ($i & 1) {
|
||||
if ($i < 7) {
|
||||
if ($n1 >= 5) { $n1 -= 9; }
|
||||
if ($n2 >= 5) { $n2 -= 9; }
|
||||
} else {
|
||||
$n1 = ($n1 >= 5) ? ($n1 << 1) - 9 : ($n1 << 1);
|
||||
$n2 = ($n2 >= 5) ? ($n2 << 1) - 9 : ($n2 << 1);
|
||||
}
|
||||
$p .= ($sr + $n1 - $n2 + 10) % 10;
|
||||
} else {
|
||||
if ($n2 >= 5) { $n2 -= 9; }
|
||||
if ($n1 >= 5) { $n1 -= 9; }
|
||||
$p .= ($sr + $n2 - $n1 + 10) % 10;
|
||||
}
|
||||
$liste[] = $p;
|
||||
}
|
||||
// Substitutions
|
||||
for ($i = 0; $i < 8; ++$i) {
|
||||
$n = substr($sn, $i, 1);
|
||||
for ($j = 0; $j < 10; ++$j) {
|
||||
if ($j == $n) {
|
||||
continue;
|
||||
}
|
||||
$p = '';
|
||||
if ($i > 0) {
|
||||
$p .= substr($sn, 0, $i);
|
||||
}
|
||||
$p .= $j;
|
||||
if ($i < 7) {
|
||||
$p .= substr($sn, $i + 1, 7 - $i);
|
||||
}
|
||||
if ($i & 1) {
|
||||
$n1 = ($n << 1); if ($n1 > 9) { $n1 -= 9; }
|
||||
$n2 = ($j << 1); if ($n2 > 9) { $n2 -= 9; }
|
||||
$p .= ($sr + $n1 - $n2 + 10) % 10;
|
||||
} else {
|
||||
$p .= ($sr + $n - $j + 10) % 10;
|
||||
}
|
||||
$liste[] = $p;
|
||||
}
|
||||
}
|
||||
return $liste;
|
||||
}
|
||||
if ($st == 0) {
|
||||
return false;
|
||||
}
|
||||
// Verification du siret
|
||||
if (sommeDeControle($st) != 0) {
|
||||
return array($sn);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
?>
|
84
library/Metier/sphinx2/sequence.php
Normal file
84
library/Metier/sphinx2/sequence.php
Normal file
@ -0,0 +1,84 @@
|
||||
<?php
|
||||
/**
|
||||
* Séquances d'échapements pour le formulaires entreprise.
|
||||
*
|
||||
* S : RaisonSociale
|
||||
* I : Siren/Siret
|
||||
* N : Numero de rue
|
||||
* R : Rue Type de voie
|
||||
* D : Departement ou CodePostale
|
||||
* L : Les trois derniers chiffre du codePoste
|
||||
* V : Ville
|
||||
* A : Code Ape
|
||||
*
|
||||
**/
|
||||
|
||||
$ordonnances = array('S', 'R', 'N', 'V', 'L', 'D', 'I');
|
||||
$adrRef = array('RUE', 'AV', 'AVENUE', 'BD', 'BOULEVARD', 'R', 'ARRONDISSEMENT', 'ARR');
|
||||
$wordformRS = array('SAS', 'SA', 'EURL', 'SARL', 'SCI', 'SA', 'LES', 'LE', 'LA', 'DE');
|
||||
|
||||
$link = array(
|
||||
'S' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('10')),
|
||||
'S.R' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('11', '10')),
|
||||
'S.N' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('12', '10')),
|
||||
'S.N.R' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('13', '12', '11', '10')),
|
||||
'S.R.V' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('16', '14', '11', '10')),
|
||||
'S.N.R.V' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('17', '16', '15' ,'14' ,'13', '12', '11', '10')),
|
||||
'S.V' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('14', '10')),
|
||||
'S.N.V' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('15', '14', '12', '10')),
|
||||
'S.V.R' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('16', '14', '11', '10')),
|
||||
'S.N.V.R' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('17', '15', '14', '13', '12', '11', '10')),
|
||||
'S.D' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('18', '10')),
|
||||
'S.R.D' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('24', '11', '36', '10')),
|
||||
'S.N.D' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('19', '18', '12', '10')),
|
||||
'S.D.R' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('24', '18', '11', '10')),
|
||||
'S.D.V' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('20', '18', '14', '10')),
|
||||
'S.R.D.V' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('21', '20', '18', '14', '11', '42', '10')),
|
||||
'S.N.R.D' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('25', '24', '19', '18', '40', '12', '11', '10')),
|
||||
'S.N.D.V' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('22', '20', '18', '14', '12', '10')),
|
||||
'S.N.R.D.V' => array('acrony' => true, 'points' => true ,'radica' => true, 'normal' => true, 'split' => true, 'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('23' ,'25', '21', '24', '22', '20', '18', '14', '12', '11', '32', '31', '30', '29', '10')),
|
||||
|
||||
'R' => array('normal' => true ,'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('26')),
|
||||
'R.D' => array('normal' => true ,'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('40', '26')),
|
||||
'R.D.V' => array('normal' => true ,'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('42', '40', '31', '26')),
|
||||
'N.R' => array('normal' => true ,'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('28', '27', '26')),
|
||||
'N.R.D' => array('normal' => true ,'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('34', '40')),
|
||||
'N.R.D.V' => array('normal' => true ,'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('34', '32', '42', '43', '40')),
|
||||
'N.R.V' => array('normal' => true ,'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('32', '31', '30' ,'29' ,'28', '27', '26')),
|
||||
'R.V' => array('normal' => true ,'space' => true, 'double' => true, 'quorum' => true, 'max' => 1000, 'id' => array('31', '28', '26')),
|
||||
'D' => array('id'=> array('44')),
|
||||
'N.D' => array('id' => array('45', '44'))
|
||||
);
|
||||
|
||||
$sequence = array(
|
||||
'10' => 'S',
|
||||
'11' => 'S.R',
|
||||
'12' => 'S.N',
|
||||
'13' => 'S.N.R',
|
||||
'14' => 'S.V',
|
||||
'15' => 'S.N.V',
|
||||
'16' => 'S.R.V',
|
||||
'17' => 'S.N.R.V',
|
||||
'18' => 'S.D',
|
||||
'19' => 'S.N.D',
|
||||
'20' => 'S.D.V ',
|
||||
'21' => 'S.R.D.V',
|
||||
'22' => 'S.N.D.V',
|
||||
'23' => 'S.N.R.D.V',
|
||||
'24' => 'S.R.D',
|
||||
'25' => 'S.N.R.D',
|
||||
'26' => 'R',
|
||||
'27' => 'N',
|
||||
'28' => 'N.R',
|
||||
'29' => 'V',
|
||||
'30' => 'N.V',
|
||||
'31' => 'R.V',
|
||||
'32' => 'N.R.V',
|
||||
'34' => 'N.R.D',
|
||||
'40' => 'R.D',
|
||||
'42' => 'R.D.V',
|
||||
'43' => 'N.D.V',
|
||||
'44' => 'D',
|
||||
'45' => 'N.D'
|
||||
);
|
||||
?>
|
1628
library/Metier/sphinx2/sphinxapi.php
Normal file
1628
library/Metier/sphinx2/sphinxapi.php
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user