2012-01-28 10 views
0

私は製品を含むサイトのミニ検索エンジンを作ろうとしています。私はすでにフルテキスト検索、LIKE句などを検討してきましたが、データベースが数千億もの巨額になるため、私はまだ進んでいきたいと考えています。複雑なmysqlのselect文

デザインは次のようなものになります。単語と単語のペアになっている表があります。私は製品が一致する製品IDにすべての単語IDのペアを含む別のテーブルを持っています。ユーザーが「2GBのメモリカード」を検索すると、スクリプトは「2GB」「メモリ」と「カード」を解析します。

それから私は使用:

SELECT pid 
    FROM indx_0 
WHERE wid = 294 OR wid = 20591 OR wid = 330 

は私が製品に一致する単語のペアで終わります。

私は、複数のものに応じてトップに行く製品を決定するPHPアルゴリズムを持っています。しかし、380kの結果をPHPの配列にロードすると、実行時間が非常に遅くなります。私はそれをすることはできません。しかし、もし私が1単語につき1000件の結果を出すことができれば、実行は高速ですが、すべての可能な結果が含まれているわけではありません。 "indx_0"テーブルの "pid"(製品ID)は "wid"(単語ID)に固有です。明らかに、一部の製品は1つ以上の一致を持つことになります。私は "wid"に対して最もマッチした "pid"を検索したい。

"2gb"と一致する200個の商品と200,000個の一致する "カード"と50,000個の一致する "メモリ"がありますが、それらの単語のすべて3個に一致する20個の商品と、

部分的に一致する20個の製品と200個の製品を取り出すことは可能ですか?

答えて

2

おそらく、プロダクトIDでグループ化し、一致する数を取得する必要があります。 1つの商品が3つのwIDすべてに一致し、他の商品が1に一致すると、3つの数字がリストの最初に表示されます。

SELECT pid, count(*) WordMatchCount 
    FROM indx_0 
    WHERE pid in (294, 20591, 330) 
    group by pid 
    order by WordMatchCount desc 
    limit 1000 
+0

ワウありがとうございました!私が変更する必要があったのは1つだけです。 "どこにいるのか"は実際には "どこにいるのか"です。それ以外は私が望んでいたのと同じように動作します。 – nick