2011-08-25 7 views
25

MongoDBをSolrと組み合わせて使う方法を見てきましたが、ここではいくつかの質問には部分的な回答しかありませんが、具体的なものはありません。私のアプリケーションでは、MongoDBにはたくさんの文書が保存されています(おそらく数百万にも上ります)。これらの文書の一部のプロパティで全文検索を実装したいので、Solrが最良の方法ですこの。java - MongoDB + Solr公演

私が知りたいことは、パフォーマンスが良いようにすべてを設定/実行する方法です。今、ここに(と私はその最適ではないと知っている)私は何をすべきかです:MongoDBの中にオブジェクトを挿入するときのプロパティを更新する場合

1-、私はその後、Solrの

SolrServer server = getServer(); 
SolrInputDocument document = new SolrInputDocument(); 
document.addField("id", documentId); 
... 
server.add(document); 
server.commit(); 

2-それを追加最初のSolrのはただ一つのフィールドを更新することはできませんので、オブジェクト、私はその後、私はSolrのインデックスが対象と新しいものからすべてのプロパティを更新すると、最初に私のクエリを照会する場合

StreamingUpdateSolrServer update = new StreamingUpdateSolrServer(url, 1, 0); 
SolrInputDocument document = new SolrInputDocument(); 
document.addField("id", documentId); 
... 
update.add(document); 
update.commit(); 

、3-ような何かをするMongoDBからオブジェクトを取得しますSolrを実行してから、文書リストを取得するときSolrDocumentListは、私は各ドキュメントを通過し、:

、4-すると、そこからプロパティを取得できるようにするには、同じIDを持つにMongoDBからオブジェクトを取得する文書

  • のIDを取得します私はまだその部分をやっていないし、Javaでそれを行う方法を本当に確信していない

    ここで説明するシナリオのそれぞれについて、より効率的な方法でこれを行う方法に関する提案がありますか? Solrで多数の文書を持ち、一度に1つの文書を追加するときにインデックスを再構築するのに1時間かかることはありません。ここでの私の要件は、ユーザーが一度に1つの文書を追加したい場合があり、すぐに文書を取得できるようにすることです。

  • +0

    各ドキュメントとインデックスを作成する性質がどのくらいあるの?保存="false"をインデックス化 –

    +0

    @JustinThomas - それぞれのドキュメントは約10のプロパティを持つことができます。そのうちのいくつかは長い説明です。説明のフルテキスト検索のインデックスを作成したいと思います。それはあなたの質問に答えますか? – Guillaume

    答えて

    14

    あなたのアプローチは実際には良いです。コンパスのような一般的なフレームワークでは、ORMフレームワーク(http://www.compass-project.org/overview.htmlを参照)によって実行されたインデックス変更に自動的に反映するために、より低いレベルで記述したものを実行しています。

    SoloとMongoの両方がsync'dになっていることを確認するため、MongoDBにあるすべてのデータを定期的に再索引付けします。ドキュメント数、フィールド数、フィールドあたりのトークン数、アナライザーのパフォーマンス:コンプレックスで15分以内に5〜8百万のドキュメント(約20フィールド、テキストフィールドが短い)のインデックスを作成することがよくありますRAMバッファが小さすぎず、すべての文書が追加されるまでコミット/最適化しないようにしてください)。

    パフォーマンスに関して、コミットにはコストがかかり、最適化には非常にコストがかかります。 Solrconfig.xmlのmergefactorの値を変更することができます(高い値は書き込みパフォーマンスを向上させ、低い値は読み取りパフォーマンスを向上させます、10は適切な値です)。

    インデックス作成時間が恐ろしいようです。ただし、Luceneインデックスのストレージはセグメントベースであるため、書き込みスループットはインデックスのサイズにあまり依存してはいけません(http://lucene.apache.org/java/2_3_2/fileformats.html)。しかし、ウォームアップ時間が増加しますので、あなたのsolrconfigにfirstSearcherとnewSearcherパラメータではなく、あまりにも複雑ではないクエリ(fieldcachesをロードするために特に並べ替えのために)

    • は、典型的な存在であることを確認する必要があります。あなたが遅く、検索の価格で速く考慮しなければインデックスに行った変更をしたい場合は、XML設定ファイルは、
    • useColdSearcherは
    • 真の優れた検索性能を持つために
      • falseに設定されるか、または。データは、それがMongoDBのに書き込まれたわずか数Xミリ秒後に検索可能になった場合、それはあなたのために許容可能である場合

    また、あなたはUpdateHandlerのcommitWithin機能を使用することができます。このようにして、Solrはあまり頻繁にコミットしなくてはなりません。 Solrのパフォーマンス要因の詳細については

    、文書を削除するには http://wiki.apache.org/solr/SolrPerformanceFactors

    を参照してください、あなたはドキュメントIDにより削除(のschema.xmlに定義されている)またはクエリによって次のいずれかです。 http://lucene.apache.org/solr/api/org/apache/solr/client/solrj/SolrServer.html

    +0

    'deleteById'の良い点、私は実際にそれを見ませんでした(私は言う必要がありませんでした、私はもっと複雑なものがあると仮定した)。 これについて多くのことを知っているように思えるので、気にしない場合はもう少し質問してください: 1. RAMバッファはどれくらいですか? 2.サンプルのsolrconfig.xmlファイルのfirstSearcherとnewSearcherを変更していませんでしたか? 3.最後に、私はsolcatのインスタンスをtomcatの下で実行しています。その中に5つのコアがあります。パフォーマンスに関する何かが変化して、複数のsolrインスタンスが実行されていますか? ありがとうございました – Guillaume

    +0

    1.最適なバッファサイズを見つけるためにいくつかのベンチマークを実行する必要があります。私は32Mで始めることをお勧めします。また、RAMバッファのサイズを増やしても大きな改善が見られない場合は、すべての繰り返しでRAMバッファに使用できるメモリの量を倍増してください。 – jpountz

    +0

    2.そうではありません:Solrでソートや関数クエリに必要なローディング・フィールド・キャッシュが必要です。結果的に、新しいインデックスにフィールド・キャッシュを使用する最初の問合せでパフォーマンスが低下するため、これらのフィールドキャッシュをロードするクエリを配置します(アプリケーションと同じフィールドに並べ替えを実行するクエリをnewSearcherとfirstSearcherに配置するだけです)。 – jpountz

    1
    1. さらに多くの文書を待ち、X分ごとに索引付けすることもできます。 (もちろんこれはあなたのアプリケーションに非常に依存します)

    2. 文書が小さく、すべてのデータ(MongoDBに保存されている)を必要としない場合は、必要なフィールドのみをSolrドキュメントに入れることができます。それらを格納しますが

    <field name="nameoyourfield" type="stringOrAnyTypeYouuse"のインデックスを作成することはない="true"/>