1

タイトル、著者、テキストの 3 つのフィールドでキーワード検索を作成しようとしています。関連性で並べ替えたいので、いずれかの分野で一致した場合に 1 ポイントを与えます。また、ストーリーの特定のタグを各行に格納する、tags というテーブルもあります。タグが一致した場合は、そのタグが使用された回数を関連性に追加します。ユーザーが検索を入力するとき、一連のキーワードを入力することがあります。文字列を分解し、for ループを使用してキーワードごとに以下の select ステートメントのコードを追加することを考えていました。これはかなり複雑に思えるので、これを行うより良い方法があるかどうか疑問に思っていましたか?

select text, ((case when S.sid in (select sid from tags where tahname like 'db') 
           then (select uses from tags T where S.sid = T.sid and tagname like 'db') +
              (case when title like '%db%' then 1 else 0 end) +
              (case when author like '%db%' then 1 else 0 end) +
              (case when text like '%db%' then 1 else 0 end)) as relevance

from stories S
order by relevance desc

ありがとうございました。

4

2 に答える 2

2

はい、キーワード検索を行うためのより良い方法があります。

使用している方法では、テーブル スキャンが強制されます。つまり、テーブル内のすべての行を読み取る必要があります。最終的にテーブルに含まれるデータの量によっては、特殊なフルテキスト インデックス作成方法を使用するよりも数百倍または数千倍遅くなる可能性があります。

さまざまなソリューションの比較を含む、私のプレゼンテーションFull Text Search Throwdownをご覧ください。含まれるもの:

于 2012-11-22T22:30:22.260 に答える
1

mysqlの全文検索機能が使える

http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

または、検索用に開発されたものを使用することをお勧めします

http://sphinxsearch.com/

于 2012-11-22T22:26:39.900 に答える