9


2

私は1つの解決策を開発したWebアプリケーション開発問題を抱えていますが、私が見ているいくつかのパフォーマンス問題を回避するかもしれない他のアイデアを見つけようとしています。

問題文:

  • ユーザーが複数のキーワード/トークンを入力した

  • アプリケーションはトークンとの一致を検索します。

  • トークンごとに1つの結果が必要です。**つまり、エントリに3つのトークンがある場合、エントリIDは3回必要です。

  • 結果をランク付けするトークンマッチにXポイントを割り当てるポイントに基づいてエントリIDをソートする**ポイント値が同じ場合は、結果をソートするためにdateを使用する

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

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

  • edit *私はすでにエントリをトークン化したので、たとえば、 "see spot run"はエントリIDが1で、3つのトークン 'see'、 'spot'、 'run’を持ち、それらは別々になっています。トークンテーブル。エントリIDはそれらに関連しているため、テーブルは次のようになります。

'参照'、1 'スポット'、1 '実行'、1 '実行'、2 'スポット'、3

4 Answer


6


MySQLでは 'UNION ALL’を使用して、これを1回のクエリで達成できます。

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

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

SELECT * FROM `entries` WHEREトークンは"%x% "のように結合すべてのSELECT * FROM` entries` WHEREトークンは "%y%"のように結合すべてSELECT * FROM `entries`はWHEREトークンのように"%z% "ORDER BY score ect ...

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

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


3


私はこれが厳密にあなたが尋ねている質問に対する答えではないことを知っています。

MySQLでは、インデックス付きの列でMATCHを使用すると、指定した各キーワードに関連性スコア(各キーワードが言及された回数で概算されます)が与えられます。これは、自分の方法よりも正確です。

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


1


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

COUNT(*)をCとして選択
...
ID順にグループ化

これは本当に些細な例ですが、各結果に対する一致の頻度を知ることができ、これはまず疑似ランクになる可能性があります。


0


データベースではなく検索タスク用に設計されたデータ構造を使用すれば、おそらくはるかに優れたパフォーマンスが得られます。 たとえば、 inverted indexを作成してみてください。 ただし、自分で書くのではなく、 Luceneのようなものを調べてみてください。