Changeset 82786 in spip-zone


Ignore:
Timestamp:
May 29, 2014, 9:18:03 AM (5 years ago)
Author:
fil@…
Message:

une fonction qui aide a retrouver la forme d'un mot à partir de sa racine ; application à l'affichage des mots-clés donnant zéro résultat (exemple : http://seenthis.net/recherche?recherche=chekoslavika%20voitures%20cheveaux&follow=all )

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/indexer/trunk/iterateur/sphinx.php

    r82782 r82786  
    8787
    8888        /**
     89         * index(es) scannés
     90         * @var array
     91         */
     92        protected $index = array();
     93
     94        /**
    8995         * Valeur courante
    9096         * @var null
     
    101107
    102108                $this->command = $command + array(
    103                         'index'             => array(),
    104                         'selection'         => array(),
    105                         'recherche'         => array(),
    106                         'orderby'           => array(),
    107                         'group'             => array(),
    108                         'snippet'           => array(),
    109                         'facet'             => array(),
    110                         'filter'            => array(),
    111                         'filters_mono'       => array(),
    112                         'filters_multijson'  => array(),
     109                        'index'     => array(),
     110                        'selection' => array(),
     111                        'recherche' => array(),
     112                        'orderby'   => array(),
     113                        'group'     => array(),
     114                        'snippet'   => array(),
     115                        'facet'     => array(),
     116                        'filter'    => array(),
    113117                );
    114118
     
    129133
    130134                $this->setFilter($this->command['filter']);
    131                 $this->setFiltersMono($this->command['filters_mono']);
    132                 $this->setFiltersMultiJson($this->command['filters_multijson']);
    133135
    134136                $this->setSnippet($this->command);
     
    175177        }
    176178
     179        /*
     180         * Récupérer la forme exacte du mot à partir de
     181         * la version indexée ; utilise snippet(query, racine)
     182         */
     183        public function keyword2word($keyword, $q) {
     184                $u = $this->sphinxQL->allfetsel(
     185                "SELECT SNIPPET("._q($q).","._q($keyword).") AS m "
     186                . "FROM ". join(',', $this->index) ." LIMIT 1"
     187                );
     188                if (!$mot = supprimer_tags(extraire_balise($u['query']['docs'][0]['m'], 'b')))
     189                        $mot = $keyword;
     190                return $mot;
     191        }
    177192
    178193        /**
     
    215230                }
    216231
    217                 // resultat vide et plusieurs mots dont certanis ont 0 hit ?
     232                // resultat vide et plusieurs mots dont certains ont 0 hit ?
    218233                if (is_array($result['query']['docs'])
    219234                AND count($result['query']['docs']) == 0
     
    223238                        if (isset($result['query']['meta']['keywords'])){
    224239                                foreach($result['query']['meta']['keywords'] as $w) {
     240                                        $mot = $this->keyword2word($w['keyword'], $q);
    225241                                        if($w['docs'] == 0) {
    226                                                 $msg[] = "<del>".htmlspecialchars($w['keyword'])."</del>";
     242                                                $msg[] = "<del>".htmlspecialchars($mot)."</del>";
    227243                                        } else {
    228                                                 $msg[] = htmlspecialchars($w['keyword']);
    229                                                 $q2[] = $w['keyword'];
     244                                                $msg[] = htmlspecialchars($mot);
     245                                                $q2[] = $mot;
    230246                                        }
    231247                                }
     
    295311                        $this->queryApi->from($i);
    296312                }
     313                $this->index = $index;
    297314                return true;
    298315        }
     
    582599                }
    583600        }
    584        
    585         function setFiltersMono($filters){
    586                 $filters = array_filter($filters);
    587                 if (!$filters) {
    588                         return false;
    589                 }
    590                
    591                 $ok = true;
    592                 foreach ($filters as $filter){
    593                         $ok &= $this->queryApi->setApiFilterMono($filter);
    594                 }
    595                
    596                 return $ok;
    597         }
    598        
    599         function setFiltersMultiJson($filters){
    600                 $filters = array_filter($filters);
    601                 if (!$filters) {
    602                         return false;
    603                 }
    604                
    605                 $ok = true;
    606                 foreach ($filters as $filter){
    607                         $ok &= $this->queryApi->setApiFilterMultiJson($filter);
    608                 }
    609                
    610                 return $ok;
    611         }
    612        
     601
     602
    613603        /**
    614604         * Revenir au depart
     
    798788}
    799789
    800 /**
    801  * Indiquer les filtres mono-valués de la requête
    802  *
    803  * @param string $idb
    804  * @param object $boucles
    805  * @param object $crit
    806  */
    807 function critere_SPHINX_filtermono_dist($idb, &$boucles, $crit) {
    808         $boucle = &$boucles[$idb];
    809        
    810         if (isset($crit->param[0])) {
    811                 $test = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
    812         }
    813         if (isset($crit->param[1])) {
    814                 $field = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);
    815         }
    816         if (isset($crit->param[2])) {
    817                 $values = calculer_liste($crit->param[2], array(), $boucles, $boucles[$idb]->id_parent);
    818         }
    819         if (isset($crit->param[3])) {
    820                 $comparison = calculer_liste($crit->param[3], array(), $boucles, $boucles[$idb]->id_parent);
    821         }
    822        
    823         // Test
    824         $boucle->hash .= "\n\tif ($test) {\n";
    825        
    826         // Critere multiple
    827         $boucle->hash .= "\t\tif (!isset(\$filters_mono_init)) { \$command['filters_mono'] = array(); \$filters_mono_init = true; }\n";
    828 
    829         $boucle->hash .= "\t\t\$command['filters_mono'][] = array(\n"
    830                 . (isset($crit->param[1]) ? "\t\t\t'field'       => $field,\n" : '')
    831                 . (isset($crit->param[2]) ? "\t\t\t'values'      => $values,\n" : '')
    832                 . (isset($crit->param[3]) ? "\t\t\t'comparison'  => $comparison,\n" : '')
    833                 . "\t\t);\n";
    834        
    835         // Fin de test
    836         $boucle->hash .= "\t}\n";
    837 }
    838 
    839 /**
    840  * Indiquer les filtres multi-valués JSON de la requête
    841  *
    842  * @param string $idb
    843  * @param object $boucles
    844  * @param object $crit
    845  */
    846 function critere_SPHINX_filtermultijson_dist($idb, &$boucles, $crit) {
    847         $boucle = &$boucles[$idb];
    848        
    849         if (isset($crit->param[0])) {
    850                 $test = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
    851         }
    852         if (isset($crit->param[1])) {
    853                 $field = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);
    854         }
    855         if (isset($crit->param[2])) {
    856                 $values = calculer_liste($crit->param[2], array(), $boucles, $boucles[$idb]->id_parent);
    857         }
    858        
    859         // Test
    860         $boucle->hash .= "\n\tif ($test) {\n";
    861        
    862         // Critere multiple
    863         $boucle->hash .= "\t\tif (!isset(\$filters_multijson_init)) { \$command['filters_multijson'] = array(); \$filters_multijson_init = true; }\n";
    864 
    865         $boucle->hash .= "\t\t\$command['filters_multijson'][] = array(\n"
    866                 . (isset($crit->param[1]) ? "\t\t\t'field'       => $field,\n" : '')
    867                 . (isset($crit->param[2]) ? "\t\t\t'values'      => $values,\n" : '')
    868                 . "\t\t);\n";
    869        
    870         // Fin de test
    871         $boucle->hash .= "\t}\n";
    872 }
    873790
    874791/**
Note: See TracChangeset for help on using the changeset viewer.