Sphinx(PHP)から情報を取得する最良の方法は何ですか?
-
03-07-2019 - |
質問
sphinxは初めてで、新しいWebサイトにセットアップしています。 それはうまく機能しており、コンソールで検索で検索すると、すべてが動作します。
PHP APIと検索を使用すると、同じ結果が得られます。ただし、見つかった行のIDと重みのみが表示されます。たとえば、いくつかのテキストフィールドを「一致」ハッシュと一緒に取得する方法はありますか?
これを行う方法がない場合、スフィンクスの重みの並べ替え順序でデータベース(sql)からレコードを取得する方法(すべてを同時に検索する)について、だれかが良い考えを持っていますか?
解決
ORDER BYでmysql FIELD()関数呼び出しを使用して、すべてが指定されたスフィンクスの順序になっていることを確認できます。
$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)
他のヒント
ええ、スフィンクスは結果をもたらしません。 しかし、IN()句を使用してクエリを並べ替え、すべてをまとめる簡単な方法を見つけました。
何かを質問する
SELECT * FROM table WHERE id IN(id_list... )
結果をテーブルにIDでインデックス付けするだけです:
while ($row = mysql_fetch_objects)
$result[$row->id] = $row;
およびsphinxから一致する結果が得られ、並べ替えが非常に簡単です:
$ordered_result = array();
foreach ($sphinxs_results['matches'] as $id => $content)
$ordered_result[] = $result1[$id];
これは、$ sphinxs_resultsの順序が正しい場合に機能します。
そのほとんどはpatの答えですが、ループは1つです。大きな結果に違いがあるかもしれません。
残念ながら、sphinxは一致したフィールドを返さず、そのIDのみを返しました(sphinxインデックスにはデータが含まれていません-データからのハッシュのみ)。 この問題については、sphinxsearch.comフォーラムに投稿してください。
アレックスが言うように、スフィンクスはその情報を返しません。 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;