0

私は ebsite のパフォーマンスを向上させるためにスフィンクス検索エンジンに移行しているので、古い mysql クエリを新しいスフィンクス言語に翻訳しようとしています。

ポイントは、私の投稿への投票と、各投票に対して与えられたポイント (1 から 5 まで) の間の数学演算に基づいて結果をソートすることです。

たとえば、投稿に対して 3 票を獲得し、投票 1=5 ポイント、投票 2=3 ポイント、投票 3=2 ポイントを獲得した場合、私のテーブルには、整数 = 3 (投票 = 3) の投票という名前のフィールドと、フィールドが含まれます。整数は 5+3+2 (ポイント = 10) です。

このため、そのような投稿の最終的な評価はポイント/投票になります。この例では、10/3=3,333 になります...

私がSphinx APIを使用して降順で最高評価の投稿のリストを取得していると仮定すると、これは私がPHPスクリプトに持っていた古いmysqlクエリです:

mysql_query("SELECT * FROM table ORDER BY points/votes DESC LIMIT $start,$stop");

スフィンクス クエリを作成しようとしましたが、機能せず、常に 0 の結果が返されます。私が行ったすべての試行を説明する // コメント行をよく読んでください。

require("sphinxapi.php");
$cl = new SphinxClient;
$index = index;
$cl->setServer("localhost", 9312);
$cl->SetMatchMode(SPH_MATCH_FULLSCAN);
//$cl->SetSortMode(SPH_SORT_EXTENDED, 'IDIV(points,votes) DESC'); //not working
//$cl->SetSortMode(SPH_SORT_EXTENDED, '(points DIV votes) DESC'); //not working
//$cl->SetSortMode(SPH_SORT_EXTENDED, 'points/votes DESC'); //not working
//$cl->SetSortMode(SPH_SORT_EXTENDED, '(points/votes) DESC'); //not working
$cl->setLimits($start,$stop,$max_matches=1000);
$query = "";

何が間違っているかを見つけるのを手伝ってくれませんか...ありがとう。

4

2 に答える 2

0

Attributesまず、ポイントと投票が、NOTである必要がありますfields。属性はインデックスに格納され、並べ替えなどに使用できます。算術は数値属性 (文字列ではない) に対してのみ実行できます。

SPH_SORT_EXPR(すでに属性を取得していると仮定して)の正しい構文は次のようになります。

$cl->SetSortMode(SPH_SORT_EXPR, 'points/votes');

SPH_SORT_EXPR は常に降順であるため、最後に DESC は必要ありません。

sql_queryただし、スフィンクスにその比率を毎回計算させるのではなく、計算中に計算して単一の数値属性として保存する方が良いでしょう。ヒント: float ではなく整数として格納します。整数はより効率的にソートできます。

于 2013-07-10T09:16:27.940 に答える
0

使用する必要がありますSPH_SORT_EXPR

$cl->SetSortMode(SPH_SORT_EXPR, '(points/votes) DESC');
于 2013-07-10T05:46:41.790 に答える