2012-03-01 9 views
0

私はSolrとそのドキュメントのバックアップを保持するデータベースにリアルタイムの "ポンプ"挿入(および更新)ドキュメントの2つのソースからSolrインデックスデータを作成しています。Solr Update Handlerを修正して既存のドキュメントを上書きしないようにするにはどうすればよいですか?

私たちが遭遇した問題は、ポンプが挿入を実行している間にデータベースからデータをインポートすると、ポンプからドキュメントを索引付けし、データベースから抽出したdocで後で上書きすることができます。それはおそらく時代遅れです。

ポンプを閉じてデータベースからインポートしてポンプを再び開くと、アプリケーションに不安定さが生じる可能性があります。

私がしたいのは、自動的にドキュメントを上書きしないようにすることですが、条件付きで(例えば 'last_modified_date'フィールドの値によって)行うようにします。

私の質問は - どうすればいいですか? Solrソースを変更したり、新しいクラスをいくつかのアップデートプロセッサに上書きさせたり、solrconfigにいくつかのマジックラインを追加する必要がありますか?

答えて

2

残念ですが、Solrに自動的にドキュメントを更新しないように指示するオプションや設定はありませんが、代わりにいくつかの条件付きチェックを使用します。 Solrの現在のモデルは、すでに索引にあるものと同じ一意のIDを持つ文書を挿入すると、その文書を削除/追加操作で「更新」するということです。 Solrは現在、既存の索引付き文書の特定のフィールドのみを更新する機能もサポートしていません。詳細はSOLR-139号をご覧ください。

説明したシナリオに基づいて、データソースのアイテムの取得を処理するSolr以外のプロセスを作成し、次に条件付きチェックを実行してインデックス内に何があるかを確認し、索引の更新が必要です。

+0

を使用する場合、実際に私が今やったことは、カスタムの書き込みで動作しますそのに従ってコードの下

に進み、存在しているかどうかを確認するためにSolrのスクリプト・プロセッサを使用することができますUpdateProcessor私のプロセッサでプロセッサチェーンを使用しているjavabinベースのハンドラ)を使用して、特定のIDを持つドキュメントをSolrで検索し、日付をチェックする - チェックが可能であれば、要求をチェーンに送ります。正常に動作するように見えますが、Solrで既存のドキュメントをリモートから検索する手順を記述しなければならず、このソリューションのコスト効率に疑問があります。 – r3mbol

0

あなたは、その文書が唯一のSolrには、Java 8

function processAdd(cmd) { 

    doc = cmd.solrDoc; 
    var previousDoc=null; 

    try { 

     // create a term type object 
     var Term = Java.type("org.apache.lucene.index.Term"); 
     var TermObject =new Term("fieldForSearchTryUnique","Value of field"); 

     //retrieve document id from solr return -1 if not present 
     previousDocId= req.getSearcher().getFirstMatch(TermObject); 

     if(-1!=perviousDocId) { 
      // get complete document from solr for that searched field 
      previousDoc=req.getSearcher().doc(previousDocId); 
      // do required process here 
     } 
    } 
    catch(err) { 
     logger.error("error in update processor "+err) 
    } 
} 
関連する問題