2011-02-04 11 views
4

私は2.000.000メッセージのデータベースを持っています。ユーザーの領収書を受け取ると、単語の出現に基づいてデータベースに関連するメッセージを見つける必要があります。larggestデータベースで同様のメッセージを見つける方法

データベースを要約するためにバッチプロセスを実行しようとしました: 1 - すべてのメッセージのすべての単語(a、the、for、for ...を除く)を格納します。 2 - すべてのメッセージとそこに含まれている単語の間の関連付けを作成する(この単語の頻度はメッセージに表示される)

次に、メッセージを受け取ったとき: 1 - 2 - データベース内のクエリを実行し、一致する単語の数でソートされたメッセージを取得します。

しかし、類似したメッセージを取得するために自分の単語ベースとクエリを更新するプロセスは非常に重く、遅いです。ワードベースの更新は、3000バイトのメッセージに対して〜1.2111秒続く。類似したクエリのクエリは、同じサイズのメッセージが〜9.8秒間続きます。

データベースのチューニングはすでに完了しており、コードは正常に動作しています。

私はそれを行うためのより良いアルゴリズムが必要です。

アイデア?

+0

フルテキスト検索は必要ありませんか? http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html – Mchl

+1

「Collective Intelligence」という本を強くお勧めします。http://www.amazon.com/Programming-Collective-Intelligence -Building-Applications/dp/0596529325/ref = sr_1_1?ie = UTF8&qid = 1296849440&sr = 8-1。これはPython向けに書かれていますが、別の言語で実装するための理論はたくさんあります。本書の最初の章には、あなたがやろうとしていることが含まれています –

+0

私はちょうど注文しました –

答えて

2

Apache Solr(http://lucene.apache.org/solr/)の設定をお勧めします。何百万ものドキュメントをセットアップし、索引付けすることは非常に簡単です。 Solrは必要なすべての最適化を処理します(オープンソースですが、必要があると感じたらそれを微調整することができます)。

利用可能なAPIを使用してクエリできます。私は、Java API SolrJ(http://wiki.apache.org/solr/Solrj)を好んでいます。私は通常、1秒未満で結果が返ってくるのを見ます。

Solrは、通常、テキストインデックスのためにMySQLより優れています。

+0

私はApache Solrを使って実装をテストします –

1

類似性マッチングはまだまだ複雑な分野ですが、MySQLリファレンスのfull text matching、特に複雑な例をご覧ください。

現在のすべてのメッセージの類似性行列を作成し、夜間バッチを実行して類似性行列に新しいメッセージを追加するために、一回限りのジョブを実行することは可能です。

+0

私は類似性matrizを更新する夜間のバッチを作った。また、フルテキスト検索を使用して実装のベンチマークを実行します。ありがとう –

関連する問題