0

Sphinxを使用して、フィールドが異なる複数のMySQLテーブルを検索し、関連性に基づいてすべての結果を1つのセットに結合しようとしています。

各テーブルのインデックスを使用してSphinxを構成し、すべてのインデックスを一度に検索することで結果を正常に結合しています。

SEARCHシェルを使用してクエリを実行すると、すべての結果情報が期待どおりに返されます。ただし、PHP APIを使用すると、結果は行のIDのみで返されるため、どのテーブルからのものかを判断する方法がありません。

PHP APIに、それがどのテーブル/インデックスからのものであるかを教えてもらい、実際のデータを照会できるようにする方法はありますか?

私が検討している代替案は、シェルスクリプトからの出力を処理しようとすることですが、それは厄介なようです。

PHPは次のとおりです。 $search= $ _GET ['query']; //接続情報$sphinxClient= new SphinxClient(); $ sphinxClient-> SetServer('localhost'、9312); $ sphinxClient-> SetMaxQueryTime(5000);

//Sphinx Result Configuration
$sphinxClient->SetMatchMode(SPH_MATCH_ANY);
$sphinxClient->SetRankingMode( SPH_RANK_PROXIMITY_BM25 );
$sphinxClient->SetLimits(0, 20);

// Give me back the results as an array
$sphinxClient->SetArrayResult(true);

$searchResults = $sphinxClient->Query( $search, 'user model' );

シェルスクリプトは単純です。

./search SEARCHTERM

ここで、SEARCHTERMは検索です

次のようなものを出力します。

Sphinx 2.0.3-リリース(r3043)Copyright(c)2001-2011、Andrew Aksyonoff Copyright(c)2008-2011、Sphinx Technologies Inc(http://sphinxsearch.com)

設定ファイルを使用する'/usr/local/sphinx/etc/sphinx.conf'... index'user':クエリ'NEWTON':0.000秒で合計10個の一致を10個返しました

一致の表示:1。document = 1、weight = 2629、time = Thu Jan 1 00:33:32 1970 id = 1 first_name = Joe last_name = Shmo company = Acme

JSON形式のPHPAPI出力: {"error": ""、 "warning": ""、 "status": "good"、 "fields":["name"、 "code_name"、 "code"、 "description "、"rating "、" angles "、" published "、" key_words "、" reference_num "、" expected "、" used_num "、" avg_runtime "、" examples "、" editor "、" published_time "]、" attrs " :{"time":2}、 "matches":[{"id":1、 "weight": "1"、 "attrs":{"time":2012}}]、 "total": "1" 、"total_found": "1"、 "時間":"0.000"、 "words":{"posuere":{"docs": "1"、 "hits": "2"}}}

4

3 に答える 3

3

APIを検索すると、一致するドキュメントのIDだけでなく、見つかったドキュメントの他のすべてのint値も取得されると確信しています。

したがって、ソースに次のようなものを追加してみることができます

SELECT id, "1" as type FROM table1

sql_attr_uint = type

フィールドは、typeIDがどのテーブルからのものかを示します

ただし、異なるテーブルの複数のインデックスを一度に検索する場合は、いくつかの問題があることに注意してください。

  1. IDが結果セットに2回以上表示されないようにする必要があります(通常、推奨される解決策は、IDを1000000または同様の方法で埋めることです-個人的にはひどいです)

  2. 結果には、検索されている最初のインデックスの列のみが含まれます。すべてのソースが同じ列を返すことを確認する必要があります。

個人的には、一度に複数のインデックスを検索することを考えるたびに、それぞれを個別に検索して、そのように結果を表示することになりました。

更新:必要なsql_attr_uintを追加しました

于 2012-04-05T08:28:11.280 に答える
1

Sphinxがオブジェクト(行)IDを返すのは正常です。問題はモデルにあります。IDでオブジェクトを判別できない場合は、モデルが間違っています。可能なオプションは次のとおりです。

  • オブジェクトタイプ(テーブルまたはリンクされたテーブルのグループ)ごとに個別のスフィンクスインデックスを作成します
  • オブジェクトの数え上げを改善して、オブジェクトを識別できるようにします。たとえば、接頭辞を付けます。
于 2012-04-05T09:54:05.253 に答える
0

テーブルの構造が同じ場合は、SQLクエリでユニオンを使用できます

SELECT * FROM table1 WHERE id IN (ids,from,sphinx)
UNION
SELECT * FROM table2 WHERE id IN (ids,from,sphinx)
...
UNION
SELECT * FROM tableN WHERE id IN (ids,from,sphinx)

これはCPUを集中的に使用することに注意してください

于 2012-04-10T09:46:34.863 に答える