2012-02-23 8 views
0

私はかなり複雑な(私が思う)検索状況を伴うASP.NET MVCのWebアプリケーションを開発中です。基本的に、私はタイトルと内容のエントリの束を持っています。これらは、全文検索を提供したい分野です。キャッチは、私もこれらのエントリの評価を追跡していることです(上席投票/下向き投票など)。私はデータベースとしてMongoDBを使用していますが、私はこれらすべての投票のための別のコレクションを持っています。 map/reduce関数を使用して、投票コレクション内のすべてのドキュメントを記事の単一の「スコア」にすることを計画しています。私が検索をするとき、その記事のスコアがランキングに影響を与えたい。常に更新されたデータを使った全文検索

私はさまざまなフルテキスト検索サービスを見てきました。クールな子供たちがLucene(そして私の場合はLucene.NET)を使用しているようです。問題は、最初に索引を作成するときにスコアが文書の一部ではないため、Luceneをどのように設定するのか分かりません。誰かが記事に投票するたびに、私はLuceneインデックスを更新する必要がありますか?私はここで少し失われています。

私はまだこのコードを書いていないので、あなたがこの問題を解決する良い方法を持っているなら、分かち合いましょう。

答えて

3

問題はスコアが私が 最初のインデックスを作成する文書の一部ではないので、私は私が

何が問題のLucene

を設定する方法を知らないということですか?単に評価/投票(おそらく0)にデフォルト値を使用し、後で人々がそれを更新して投票するときには、デフォルト値を使用してください。

誰かが記事を投票するたびに、 Luceneインデックスを更新する必要がありますか?

いいえ、これは高価で低速です。あなたのアプリではおそらく膨大な量の更新があり、luceneはディスクに頻繁にフラッシュするときに遅くなることがあります。一般的には、全文検索のリアルタイム更新は、全文検索ほど重要ではない。

溶液#1:だから私は、次の戦略を提案し、あなたがluceneのに関連するすべての更新プログラムを格納するMongoDBの中

1.Createコレクション:

{ 
    _id, 
    title, 
    content, 
    rating, //increment it 
    status(new, updated, delete) // you need this for lucene 
} 

2.Afterあなたがツールそれを作成する必要がありますこれをバックグラウンドでこのアップデートをすべて処理します(たとえば、10分ごとに1回)。 10000のluceneの更新/挿入/削除の後、ディスクにデータをフラッシュする必要があるということを思い出して、luceneインデックスの更新を高速化してください。

上記のソリューションでは、データは10分間は無効ですが、挿入が高速になります。

溶液#2:

  1. のLuceneに関連するそれぞれの更新のための非同期メッセージを送信します。
  2. メッセージを受信するたびにこのメッセージを処理してluceneを更新してください。
  3. 非同期処理が非常に重要です。それ以外の場合は、アプリケーションのパフォーマンスに影響する可能性があります。

私は#1と一緒に行くつもりです。なぜなら、サーバーにとっては安価でなければならないからです。

あなたがもっと好きなものを選んでください。

+0

基本的にキューを作成します。私はそれが好きです。 –

0

MongoDBまたはデータベースに直接アクセスし、投票を増減します。あなたは常に私のビューでデータベースを更新する必要があります。複雑になる必要はありません。何かが追加され、データベースに何か追加されます。更新、挿入、削除することができます。変更を追跡する必要があり、追跡場所はmongodbまたはSQLデータベースにあります。フィールドを検索するには、mongodbフィールドの検索パラメータを使用し、返されたすべてのフィールドを結合して自分でランク付けします。

+0

ええ、あなたはおそらく、議決権の増減について正しいと思います。しかし、mongodbよりも高度な検索が必要です。ステミングとフレーズ検索は、フルテキスト検索ツールで利用できますが、単純なmongodbクエリでは利用できません。 –

+0

フルテキスト検索でどの程度詳細に行きたいかが重要です。クエリを単語に分割し、各単語のすべてのエントリを取り出してランク付けし、最もクエリワードの多いドキュメントを取得します。それは選択の問題です。 – iefpw

関連する問題