2012-04-05 10 views
0

私は、Sphinxを使用して異なるフィールドを持つ複数のMySQLテーブルを検索し、すべての結果を関連性に基づいて単一のセットに結合しようとしています。スフィンクスPHP APIを使用した複数のテーブルと集計結果の検索

私は各テーブルのインデックスを使って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'); 

シェルスクリプトは単純です: SEARCHTERMがどのように見える何かを出力し、検索

ある

./search SEARCHTERM 

スフィンクス2.0.3を-release(r3043)設定ファイル '/ usr/local/sphinx/etc/sphinx'を使用している場合は、このファイルを削除する必要があります。 .conf '... index' user ':クエリ' NEWTON ':0.000秒で合計10件の一致が返されました。

1. document = 1、weight = 2629、time = Thu Jan 1 00 :33:32 1970 ID = 1 FIRST_NAME =ジョー LAST_NAME = Shmo 会社=アクメ

JSON形式でPHPのAPI出力: { "エラー": ""、 "警告": ""、 "ステータス": "良い"、 "フィールド":[ "名前"、 "code_name" 「参照」、「承認」、「used_num」、「avg_runtime」、「例」、「編集」、「編集」、「編集」、 {"id":1、 "weight": "1"、 "attrs":{"time":2012} "一致": "attrs":{"時間":2}、 }} ]、 "total": "1"、 "total_found": "1"、 "time": "0" "words":{"posuere":{"docs": "1"、 "ヒット": "2"}}

+1

CPU集約であることを注意してください、それはですので、あなたがPHPのAPIの検索を実行するコードを追加してください。どのようにそれを行うより明確に。その次に、シェルのコマンドラインを文書化しておいてください。そうすれば、それを互いに比較することができます。 – hakre

+0

./searchシェルスクリプトは本番用に開発されていません。これは、インデックスのステータスと内容をデバッグして監視するためのツールです。代わりに、Sphinx APIを使用する必要があります。 –

答えて

1

を必要とsql_attr_uintを追加しましたそれはスフィンクスはあなたが(行)オブジェクトIDを返すことが普通です。あなたのモデルに問題があります。どのオブジェクトであるかをidで判断できない場合は、モデルが間違っています。 可能なオプションは、次のとおり

  • 例えばいくつか付けることによって、可能なオブジェクトの識別をするために自分のオブジェクトの記数を改善するオブジェクトタイプ(テーブルまたはリンクされたテーブルのグループ)
  • ごとに個別スフィンクスインデックスを作成します。
3

APIを検索するときに、 tは唯一の一致するドキュメントだけでなく、見つかった文書の他のすべてのint型の値のIDを取得します。

だから、あなたはあなたの元に

SELECT id, "1" as type FROM table1 

sql_attr_uint = type 

typeフィールドが今どのテーブルを示していますのようなものを追加してみてください可能性がありIDは

から

からです。ただし、一度に異なるテーブルの複数のインデックスを検索する場合は、いくつかの問題があります。あなたはidは、よりその一回、あなたの結果セットに表示されていないことを確認する必要があり

  1. (通常提案された解決策は、1000000または何らかの同様の方法により、パッドにIDだろう - 個人的に私はひどい見つけます。)

  2. 結果には、検索対象の最初のインデックスの列のみが含まれます。すべてのソースが同じ列を返すようにする必要があります。

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

更新:

+0

返事をありがとう、その非常に役立ちます。ユニークさを保証するためにid値を埋め込む方法は? SQLクエリ自体で?また、もう少し詳しく説明できますか?私が上に投稿するAPIから得ている出力は、どの列からも値を返さないので、これは問題ではないと仮定しました。 –

+0

@BrianPeacock、あなたのソース定義も投稿してください – mobius

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) 

を照会これは

関連する問題