2017-09-18 2 views
0

J'ai Sphinx Search fonctionnant sur la production, effectuant la recherche avec des mots-clés, accédés par le sphinxapi.php officiel. Maintenant, j'ai besoin de produire une somme d'un attribut appelé prix avec des résultats de recherche, similaire à la requête SQL "SELECT SUM (t.price) de table_name t WHERE condition". Ces données sont censées être affichées sur une page Web du type "Affichage de 1 à 10 sur 12345 résultats, le coût total est de 67890 $". Comme la documentation le dit, la fonction SUM() est disponible lorsqu'elle est utilisée avec GROUP BY. Cependant, la documentation ne fournit pas suffisamment de détails sur la mise en œuvre, le googling et la recherche Stackoverflow n'aide pas beaucoup.Comment obtenir un SUM d'un attribut dans Sphinx?

Questions:

  1. Comment dois-je groupe le résultat de la recherche?
  2. Peut-il être exécuté avec une requête Sphinx, ou dois-je d'abord obtenir les résultats de la recherche, puis interroger à nouveau Sphinx pour obtenir la somme des documents trouvés?

Veuillez nous aviser. Un exemple sera vraiment utile. Je vous remercie.

Répondre

0

Vous devrez exécuter une deuxième requête. La 'somme' est recherchée sur l'ensemble des résultats WHOLE, alors que le regroupement normal, l'agrégation est exécutée par ligne. Dans votre exemple, il existe un GROUP BY '1' implicite qui agrège toutes les lignes.

Il faudrait donc utiliser le groupement pour faire de même dans le sphinx. L'utilisation de la fonction d'agrégation est relativement facile, utilisez setSelect, mais vous n'êtes pas sûr que SetGroupBy ait une syntaxe pour regrouper toutes les lignes, vous devrez donc l'émuler.

//all normal setup need for normal query here 
$cl->SetLimits($offset,$limit); 
$cl->AddQuery($query, $index); 

//add the group query 
$cl->setSelect("1 as one, SUM(price) as sum_price"); 
$cl->setGroupBy("one",SPH_GROUPBY_ATTR); //dont care about sorting 
$cl->setRankingMode(SPH_RANK_NONE); //no point actually ranking results. 
$cl->SetLimits(0,1); 
$cl->AddQuery($query, $index); 

//run both queries at once... 
$results = $cl->RunQueries(); 

var_dump($results); 
//$results[0] contains the normal text query results, use its total_found 
//$results[1] second contains just the SUM() data 

Ceci affiche également la configuration en tant que requêtes multiples! http://sphinxsearch.com/docs/current.html#multi-queries