Changeset 82747 in spip-zone


Ignore:
Timestamp:
May 26, 2014, 1:25:02 PM (5 years ago)
Author:
fil@…
Message:

bidouiller la query quand on a une erreur de syntaxe sphinx, ou bien encore des resultats vides avec des mots comptant 0 occurrence

Location:
_plugins_/indexer/trunk
Files:
3 edited

Legend:

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

    r82729 r82747  
    182182        **/
    183183        public function runQuery() {
     184                $q = $this->queryApi->getMatch();
     185               
     186                // on sait deja que cette requete necessite une correction ?
     187                if (isset($GLOBALS['sphinxReplace'][$q])) {
     188                        $this->queryApi->match($GLOBALS['sphinxReplace'][$q]);
     189                        $this->save('message', $GLOBALS['sphinxReplaceMessage'][$q]);
     190                }
     191
    184192                $query  = $this->queryApi->get();
     193                $this->save('query', $query);
     194
    185195                $result = $this->sphinxQL->allfetsel($query);
    186196
    187                 $this->save('query', $query);
     197                // erreur de syntaxe ? correction de la requete
     198                if (isset($result['query']['meta']['error'])) {
     199                        $q = $this->queryApi->getMatch();
     200                        $GLOBALS['sphinxReplace'][$q] = trim(preg_replace('/\W+/u', ' ', $q));
     201                        $this->queryApi->match($GLOBALS['sphinxReplace'][$q]);
     202                        $query  = $this->queryApi->get();
     203                        $result = $this->sphinxQL->allfetsel($query);
     204                        $message = _L('transformation de la requête en « ').htmlspecialchars($GLOBALS['sphinxReplace'][$q])." »";
     205                        $GLOBALS['sphinxReplaceMessage'][$q] = $message;
     206                        $this->save('message', $message);
     207                }
    188208
    189209                if (!$result) {
     
    191211                }
    192212
     213                // resultat vide et plusieurs mots dont certanis ont 0 hit ?
     214                if (is_array($result['query']['docs'])
     215                AND count($result['query']['docs']) == 0
     216                AND !preg_match('/["\/&|)(]/u', $q)
     217                ) {
     218                        $q2 = $msg = array();
     219                        foreach($result['query']['meta']['keywords'] as $w) {
     220                                if($w['docs'] == 0) {
     221                                        $msg[] = "<del>".htmlspecialchars($w['keyword'])."</del>";
     222                                } else {
     223                                        $msg[] = htmlspecialchars($w['keyword']);
     224                                        $q2[] = $w['keyword'];
     225                                }
     226                        }
     227
     228                        if (count($q2) >0
     229                        AND count($q2) < count($result['query']['meta']['keywords'])) {
     230                                $q2 = trim(join(' ',$q2));
     231                                $GLOBALS['sphinxReplace'][$q] = trim(preg_replace('/\W+/u', ' ', $q2));
     232                                $this->queryApi->match($GLOBALS['sphinxReplace'][$q]);
     233                                $query  = $this->queryApi->get();
     234                                $result = $this->sphinxQL->allfetsel($query);
     235                                $GLOBALS['sphinxReplace'][$q] = $q2;
     236                                $GLOBALS['sphinxReplaceMessage'][$q] = $message = _L('Résultats pour : ').join(' ',$msg);
     237                                $this->save('message', $message);
     238                        }
     239                }
     240
     241
    193242                // decaler les docs en fonction de la pagination demandee
    194243                if (is_array($result['query']['docs'])
    195                         AND $pagination = $this->getPaginationLimit()) {
     244                AND $pagination = $this->getPaginationLimit()) {
    196245
    197246                        list($debut) = array_map('intval', $pagination);
  • _plugins_/indexer/trunk/lib/Sphinx/SphinxQL/Query.php

    r82648 r82747  
    3737                $this->match = $match;
    3838                return $this;
     39        }
     40
     41        public function getMatch() {
     42                return $this->match;
    3943        }
    4044
  • _plugins_/indexer/trunk/lib/Sphinx/SphinxQL/SphinxQL.php

    r82619 r82747  
    103103
    104104                // recuperer les META
    105                 if ($meta = $this->query('SHOW META')) {
    106                         $result = $this->sql->store_result();
    107                         $a = array(); while ($row = $result->fetch_assoc()) $a[] = $row;
     105                if ($meta = $this->sql->query('SHOW META')) {
     106                        $a = array(); while ($row = $meta->fetch_assoc()) $a[] = $row;
    108107                        $liste['meta']   = $this->parseMeta($a);
     108                }
     109                else {
     110                        $liste['meta']   = array('error' => 'meta illisible');
    109111                }
    110112
Note: See TracChangeset for help on using the changeset viewer.