10

1つのソリューションを開発したWebアプリ開発の問題がありますが、私が見ているパフォーマンスの問題を回避できる可能性のある他のアイデアを見つけようとしています。

問題文:

  • ユーザーがいくつかのキーワード/トークンを入力します
  • アプリケーションはトークンに一致するものを検索します
  • トークンごとに1つの結果が必要
    • つまり、エントリに3つのトークンがある場合、エントリIDが3回必要です。
  • 結果をランク付けする
    • トークンの一致にXポイントを割り当てる
    • ポイントに基づいてエントリIDを並べ替える
    • ポイント値が同じ場合は、日付を使用して結果を並べ替えます

私ができるようにしたいのですが、理解していませんが、in()の結果に似たものを返すが、チェックされた各エントリIDに一致するトークンごとに重複するエントリIDを返す1つのクエリを送信することです。

トークンごとに1つのクエリを実行する複数の個別のクエリを使用するという、私が行っている方法よりも優れた方法はありますか?もしそうなら、それらを実装する最も簡単な方法は何ですか?

編集
すでにエントリをトークン化したので、たとえば、「see spotrun」のエントリIDは1で、「see」、「spot」、「run」の3つのトークンがあり、それらは別のトークンテーブルにあります。 、それらに関連するエントリIDを使用して、テーブルを次のように表示します。

'see', 1 
'spot', 1 
'run', 1 
'run', 2 
'spot', 3 
4

4 に答える 4

6

MySQL で「UNION ALL」を使用して、1 つのクエリでこれを実現できます。

PHP でトークンをループして、トークンごとに UNION ALL を作成するだけです。

たとえば、トークンが「x」、「y」、および「z」の場合、クエリは次のようになります。

SELECT * FROM `entries` 
WHERE token like "%x%" union all 
    SELECT * FROM `entries` 
    WHERE token like "%y%" union all 
        SELECT * FROM `entries` 
        WHERE token like "%z%" ORDER BY score ect...

order 句は、結果セット全体を 1 つとして操作する必要があります。これが必要です。

パフォーマンスに関してはそれほど高速ではありませんが (私は推測しています)、データベースの場合、速度に関する主なオーバーヘッドは、多くの場合、PHP からデータベース エンジンにクエリを送信し、結果を受け取ることです。この手法を使用すると、これはトークンごとに 1 回ではなく 1 回だけ発生するため、パフォーマンスが向上しますが、それで十分かどうかはわかりません。

于 2008-09-06T20:12:44.307 に答える
3

これはあなたが求めている質問に対する厳密な回答ではないことはわかっていますが、テーブルが数百万行ではなく数千行である場合は、FULLTEXT ソリューションが最適な方法である可能性があります。

MySQL では、インデックス付きの列で MATCH を使用すると、指定した各キーワードに関連性スコア (各キーワードが言及された回数によって大まかに計算) が与えられます。これは、メソッドよりも正確であり、複数のキーワードに対してより効率的です。

ここを参照してください: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

于 2008-09-08T09:48:00.363 に答える
1

UNION ALL パターンを使用している場合は、次の部分をクエリに含めることもできます。

SELECT COUNT(*) AS C
...
GROUP BY ID
ORDER BY c DESC

これは非常に些細な例ですが、各結果の一致頻度が得られます。これは疑似ランクの開始点になる可能性があります。

于 2008-09-06T21:25:51.417 に答える
-1

データベースではなく検索タスク用に設計されたデータ構造を使用すると、パフォーマンスが大幅に向上する可能性があります。たとえば、転置インデックスの作成を検討してみてください。ただし、自分で作成するのではなく、ほとんどの作業を行うLuceneのようなものを調べることもできます。

于 2008-09-08T08:17:06.023 に答える