3

メッセージのヘッダーをSQLServerデータベースに格納するように、10000近くのドメインをホストする電子メールサービスがあります。

メッセージ本文でキーワードを検索するアプリケーションを実装する必要があります。メッセージはNASストレージシステムにファイルとして保存されます。

概念実証として、SQLサーバーベースの検索システムを実装しました。メッセージを解析し、すべての単語をメンバーIDとメッセージIDとともにデータベーステーブルに格納します。データベースは、ヘッダーデータベースとは別のサーバー上にありました。

そのシステムの問題は、1つのドメインでメッセージを処理した後、6億行のテーブルになってしまうことでした。明らかに、これはあまりスケーラブルなソリューションではありません。

ヘッダーはSQLServerテーブルに格納されているため、検索されたキーワードを含むメッセージを表示するには、検索アプリケーションからのmessageIDをヘッダーテーブルに結合する必要があります。

より良いアーキテクチャに関する提案はありますか?SQLサーバーを使用するより良い代替手段はありますか?1日に2,000万通以上のメッセージを受信して​​います。私たちはサーバーやメンテナンスなどのリソースが限られている小さな会社です。

ありがとう

4

8 に答える 8

4

Hadoopを見てください。これは、Google に触発された巨大なデータセットを操作するための完全な「map-reduce」フレームワークです。Rackspace はクライアントの電子メール検索に使用していると思われます (ただし、私は間違っている可能性があります)。

于 2009-08-14T19:28:11.883 に答える
3

lucene.netは大いに役立ちますが、どのようにアプローチしても、多くの作業が必要になります。

于 2009-08-14T19:16:56.820 に答える
2

これには SQL を使用しないことを検討してください。それは役に立ちません。

ヘッダーのテキストを検索するためのGREPおよびその他のフラットファイル手法は、はるかに高速でシンプルです。

于 2009-08-14T19:20:59.510 に答える
1

また、役に立つかもしれないJava luceneのものをチェックアウトすることもできます。分散 lucene インデックスであるKattaと、インデックスの同期に rsync を使用できるSolrの両方が役立つ場合があります。私はどちらも非常に洗練されているとは考えていませんが、実際の開発に着手する前に、既に構築され、機能することがわかっているものを使用する方がよい場合がよくあります。詳細を知らなければ、より具体的な推奨事項を作成するのは困難です。

于 2009-08-14T19:26:05.007 に答える
1

6 億行を分割できる場合は、データベースのシャーディングを検討してください。すべての行にわたるクエリは遅くなります。少なくとも、言語で別れることはできます。それらがすべて英語である場合は、一般的な検索に基づいて意味のあるデータを分割する方法を見つけてください。ここでは推測ですが、ドメインは TLD (.com、.net、.org など) でグループ化される可能性があります。

全文検索については、SQL Server と Lucene.NET と cLucene と MySQL と PostgreSQL を比較してください。結果をランク付けする必要がない場合は、全文検索が高速になることに注意してください。データベースがまだ遅い場合は、パフォーマンス チューニングを調べてください。それが失敗する場合は、Linux ベースのデータベースを調べてください。

http://incubator.apache.org/lucene.net/

http://sourceforge.net/projects/clucene/

于 2009-08-14T20:04:37.100 に答える
0

SQLServerの全文検索サービス/機能を調べます。私自身は使ったことがありませんが、StackOverflowが使っていることを一度読んだことがあります。

于 2009-08-14T19:36:43.660 に答える
0

3 つのソリューション:

  1. 既存のテキスト検索エンジンを使用する (lucene が最も多く言及されており、他にもいくつかあります)
    • メッセージ全体を SQL データベースに保存し、含まれている全文検索を使用します (最近のほとんどの DB にはそれがあります)。
    • 単語が出現するたびに新しいレコードを作成しないでください。単語レコードの大きなフィールドに新しい値を追加するだけです。このテーブルに SQL を使用しない場合は、キーが単語で値が出現リストであるキー値ストアを使用するとさらに効果的です。インスピレーションを得るために、いくつかの逆インデックスの参考文献をチェックしてください

しかし、正直なところ、唯一の合理的なアプローチは#1だと思います

于 2009-08-14T20:04:02.967 に答える
0

BigTable ( http://en.wikipedia.org/wiki/BigTable ) が検索を行うのだろうか。

于 2009-08-14T19:33:25.523 に答える