4

私はスフィンクスが初めてで、新しいウェブサイトに設定しています。正常に動作しています。コンソールで検索すると、すべてが機能します。

PHP APIと検索を使用しても、同じ結果が得られます。しかし、見つかった行の ID と重みのみが表示されます。たとえば、いくつかのテキストフィールドを「一致」ハッシュと一緒にする方法はありますか?

これを行う方法がない場合、データベース (sql) からレコードをスフィンクスの重みの並べ替え順 (同時にすべてを検索する) で取得する方法について誰かが良い考えを持っていますか?

4

4 に答える 4

4

ええ、スフィンクスは結果をもたらしません。しかし、IN() 句を使用してクエリを並べ替え、すべてをまとめる簡単な方法を見つけました。

何かを問い合わせる

SELECT * FROM table WHERE id IN(id_list... )

テーブル内の ID を使用して、結果にインデックスを付けるだけです。

while ($row = mysql_fetch_objects)
   $result[$row->id] = $row; 

スフィンクスから一致する結果が得られるため、並べ替えが非常に簡単です。

$ordered_result = array();
foreach ($sphinxs_results['matches'] as $id => $content)
   $ordered_result[] = $result1[$id];

$sphinxs_results が正しい順序である場合、これは機能します。

ほとんどパットの答えですが、ループが1つ少なくなります。大きな結果に多少の違いを生むことができると思います。

于 2009-03-06T11:19:05.957 に答える
1

ORDER BY で mysql FIELD() 関数呼び出しを使用して、すべてが sphinx で指定された順序になっていることを確認できます。


$idlist = array();
foreach ( $sphinx_result["matches"] as $id => $idinfo ) {
    $idlist[] = "$id";
}
$ids = implode(", ", $idlist);

SELECT * FROM table WHERE id IN ($ids) ORDER BY FIELD(id, $ids)
于 2009-03-19T13:56:48.220 に答える
0

アレックスが言うように、Sphinx はその情報を返しません。ID を使用して自分でデータベースにクエリを実行する必要があります。各 ID をループして、関連するデータを取得し、結果を重み付け順に保ちます。1 つのクエリですべてを実行するには、次のようなものを試すことができます (疑似コード - PHP は私の選択した言語ではありません)。

results = db.query("SELECT * FROM table WHERE id IN (%s)", matches.join(", "));
ordered_results = [];

for (match in matches) {
  for (result in results) {
    if (result["id"] == match) {
      ordered_results << result;
    }
  }
}

return ordered_results;
于 2009-03-05T23:51:49.413 に答える
0

残念ながら、sphinx は一致したフィールドを返さず、その ID のみを返しました (sphinx インデックスにはデータが含まれておらず、データからのハッシュのみでした)。この問題については、sphinxsearch.com フォーラムに投稿してください。

于 2009-03-05T16:52:51.730 に答える