2009-08-14 28 views
3

私はSolrで条件付きの更新を行う必要がありますが、これはMySQLで簡単に達成できます。例えばSolr条件付き追加/更新?

  • 私はSolrには、既存のレコードを更新することになる場合には、重複<id> sであり、その一部10件の文書を、ポスティングい<id>
  • と呼ばれるユニークなフィールドを持つ100件の文書を持っています同じ<id>
  • と私は、フィールドが<dateCreated>と呼ばれ、私は新しい<dateCreated>が(これは0を複製するために適用され、古い<dateCreated>よりgreatedされている場合にのみ<doc>を更新したいと思います持っていますのみ)

このようなことはどのように達成できますか?

コンテキストが競合状態に対抗しようとしているため、同じIDに対して複数の追加が行われていますが、間違った順序で実行されています。

ありがとうございました。

+0

に含まれています。もう一度やり直してください – Noah

+0

申し訳ありません。訂正されました! –

答えて

2

私は2つの方法を考えることができます。

  1. 独自01​​を書くと、そのチェックを実装するためにaddDocをオーバーライドします。
  2. クライアントコードに適切なロック(クリティカルセクション)を配置して、格納されたドキュメントをフェッチし、日付を比較し、新しいドキュメントを条件付きでスレッドセーフな方法で追加します。

Solrはデータベースではなく、MySQLがリンゴとオレンジを比較していることを覚えておいてください。

+0

ありがとう、私はすでにサポートされているものを期待していました。 #1は役に立ちますが複雑です。私はJava開発者ではありません。締め切りの制約の中で、おそらく#2が私が進めるアプローチです。 –

1

このようなカスタムロジックを追加すると、独自のクライアントサイドアップデータを作成する方が効果的です。これにより、Solrの内部構造が損なわれることがなくなり、将来の更新が容易になります。あなたはSolrJでこの作業を行うことができますが、Java開発者でない場合は、おそらく自分の好みの言語でクライアントサイドのライブラリがあります... PHP、Python、Ruby、C#など...

rsolr Ruby gem(http://github.com/mwmitchell/rsolr/tree/master)を使用すると、カスタム読み込みスクリプトを非常に簡単にハックすることができます。

2

solr 4.0以降、楽観的同時実行性は_version_フィールドで有効になります。

http://yonik.com/solr/optimistic-concurrency/

はあなたが確認する必要があり、有効にするには必ずあなたのschema.xmlは

<field name="_version_" type="long" indexed="true" stored="true"/> 

とsolrconfig.xmlあなたの質問は情報が不足している

<updateHandler class="solr.DirectUpdateHandler2"> 
    <updateLog> 
     <str name="dir">${solr.data.dir:}</str> 
    </updateLog> 
</updateHandler> 
+0

基本的には、SolrInputDocumentの\ _VERSION \ _フィールドを使用してオプティミスティック同時実行を呼び出します。 –

関連する問題