2011-06-28 2 views
1

コンテンツIDに1つのキーワードを割り当てる検索インデックス(2つの列テーブル)を構築しました。ヒット頻度別にキーワードの検索結果を並べ替えるにはどうすればいいですか?

現在、単一のキーワードを検索しています。

しかし、 SELECT media_id, keyword FROM search_index WHERE keyword = 'b' OR keyword = 'a'のような複数のキーワードを検索すると(そして'a'最初にすべてのヒット、'b')アルファベットキーワード順に結果を返します。

私は結果ページでPHPを使ってみましたが、表示するよりも多くのデータをデータベースからロードして、受け入れ可能なソートを取得する必要があります。この手法では、スクリプトはより頻繁に割り当てられたキーワードに対してタイムアウトすることさえあります。

また、GROUP BYはアルファベット順の結果を1つのIDにグループ化するように見えました。

編集: 最後に、私はSELECT DISTINCT media_id, keyword, COUNT(media_id) AS num FROM search_index GROUP BY media_id ORDER BY num DESCのようなものを見つけましたが、それはちょっとうまくいくが、実際は遅いです。

私は 'b'と 'a'を検索すると、その結果の最初に 'a'と 'b'のIDが必要です。

どのように私はMySQLに、1つのIDのヒット頻度で出力を並べ替えるように指示することができますか?

答えて

0

オーケーBY search_indexのORDER FROMランクAS CAST(符号付きキーワード= 'B')私は自分自身をそれを考え出しました。

最も速いのは、SELECT media_id, keyword, COUNT(media_id) AS num WHERE ... GROUP BY media_idを実行してから、numフィールドを単純なphp-usort関数で処理しているようです。

function SortFrequency($a, $b) 
{ 
    if ($a['num'] == $b['num']) return 0; 
    return ($a['num'] > $b['num']) ? -1 : 1; 
} 

usort($results, 'SortFrequency'); 
0

MySQLには、関連性スコアを返すfull text searchがあります。

+0

私の検索インデックスソリューションでは使用しないことを教えてくれてありがとう。確かに、私はすべてのキーワードを 'TEXT'フィールドに入れ、フルテキストで検索することができましたが、300K +の行テーブルでそのようなもののパフォーマンスを感じたことがありますか?私はそうは思わない。 (インデックスは数ミリ秒以内に検索結果を提供することができます。 –

+0

申し訳ありません。ただ助けてくれるようにしよう。 –

+0

私は本当に助けを感謝します、私は本当に!しかし、それは、答えが質問の意図を無視するとどこにも導かれません。 –

1

どうやってこのようなことができますか?

SELECT *、CAST(キーワード= '' 符号付き)+ RANK DESC

関連する問題