2009-11-25 7 views
1

J'ai ce moteur de recherche sphinx que j'utilise via Zend en utilisant sphinxapi.php. Cela fonctionne fantastique. Vraiment vraiment génial.Sphinx échoue aléatoirement à combiner des sous-requêtes

Cependant, il y a un problème: il échoue de façon aléatoire.

// Prepare Sphinx search 
    $sphinxClient = new SphinxClient(); 
    $sphinxClient->SetServer($ip, $port); 
    $sphinxClient->SetConnectTimeout(10); 

    $sphinxClient->SetMatchMode(SPH_MATCH_ANY ); 
    $sphinxClient->SetLimits($resultsPerPage * ($nPage - 1), $resultsPerPage); 
    $sphinxClient->SetArrayResult(true); 

    $query = array(); 
    $query['lang'] = '@lang "lang' . $language . '"'; 

    if (isset($params)) { 
     foreach ($params as $param) { 
      $query['tags'] = '@tags "' . $param . '"'; 
     } 
    } 

    // Make the Sphinx search 
    $sphinxClient->SetMatchMode(SPH_MATCH_EXTENDED); 
    $sphinxResult = $sphinxClient->Query(implode(' ', $query), '*'); 

Comme on le voit ici, je recherche une langue et une quantité arbitraire de balises, implosé en une seule chaîne de requête à la fin (au lieu de faire un battleload de sous-requêtes). Donc, normalement, cela fonctionne comme un charme, mais occasionnellement sphinx renvoie qu'il a trouvé 2000 entrées en anglais et, disons, 1000 entrées avec le tag "images" (ou un autre mot purement anglais) mais ZÉRO hits qui correspondent les deux résultats, ce qui est purement faux. En fait, rafraîchir la page revient à la normale avec quelque chose comme 800 résultats réels.

Ma question est pourquoi fait-elle cela et comment puis-je l'arrêter?

Des idées?

: Edit: Ajout journal de sortie raccourcie

[error] => 
    [warning] => 
... 
    [total] => 0 
    [total_found] => 0 
    [time] => 0.000 
    [words] => Array ( 
     [langen] => Array ( 
      [docs] => 2700 
      [hits] => 2701) 
     [picture] => Array ( 
      [docs] => 829 
      [hits] => 1571))) 

Répondre

0

Ce problème a été résolu complètement quelques mois après le message original. Le problème est que nos fournisseurs de services dans la société faîtière ont attribué par erreur les mauvaises valeurs racines aux commandes sphinx. Le problème ci-dessus fonctionnait réellement sur Sphinx 0.9.8 et était évidemment bogué. Mon conseil, si vous rencontrez des problèmes similaires, est double-tripple-check la version que vous utilisez à la fois pour indexer et interroger.

Il semble que l'un de ces moments ne soit pas le calcul mathématique car vous avez oublié un moins sur la première ligne. Merci à tous ceux qui ont essayé d'aider dans ce domaine et les discussions connexes.

0

Avez-vous vérifié pour voir si le client vous donne sphynx une erreur ou des messages d'avertissement qui peuvent décrire l'échec?

if($sphinxResult === false) { 
    print "Query failed: " . $sphinxClient->GetLastError(); 
} else { 
    if($sphinxClient->GetLastWarning()) { 
     print "WARNING: " . $sphinxClient->GetLastWarning(); 
    } 

    // process results 
} 
+0

Vous venez d'ajouter les chutes d'erreur d'une requête échouée typique. Comme vous le voyez, il ne me donne pas une erreur et est en fait très réussi à trouver tous les hits en anglais ET les images, mais pour une raison quelconque, ne pas les combiner. – John

+0

quelle version utilisez-vous? Si c'est la dernière version (0.9.9-rc2), vous pouvez essayer d'utiliser le mode de correspondance SPH_MATCH_EXTENDED2 pour voir si c'est plus fiable ... même si je doute que ce soit vraiment le problème. –

+0

Bonjour, essayé le prolongé 2, mais en vain. Ça arrive toujours au hasard, donc je ne sais pas quoi faire. – John