質問
Solr で条件付き更新を行うという非常に単純なニーズがありますが、これは MySQL で簡単に実現できます。
例えば、
- という固有のフィールドを持つドキュメントが 100 個あります。
<id>
- 10 個のドキュメントを投稿していますが、一部が重複している可能性があります
<id>
s。この場合、Solr は既存のレコードを同じ内容で更新します。<id>
s - というフィールドがあります
<dateCreated>
を更新したいだけです<doc>
新しい場合<dateCreated>
古いものよりも優れています<dateCreated>
(これは重複に適用されます)<id>
もちろんsのみです)
どうすればそのようなことを達成できるのでしょうか?
コンテキストは、同じ ID に対して複数の追加が間違った順序で実行される結果となる競合状態に対処しようとしています。
ありがとう。
解決
次の 2 つの方法が考えられます。
- 自分で書いてください
UpdateHandler
そしてオーバーライドaddDoc
そのチェックを実装します。 - 保存されたドキュメントを取得し、日付を比較し、スレッドセーフな方法で条件付きで新しいドキュメントを追加するには、クライアント コードに適切なロック (クリティカル セクション) を設定します。
Solr はデータベースではなく、MySQL と比較するのはリンゴとオレンジを比較するようなものであることに注意してください。
他のヒント
の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>
このような本当にカスタム加算ロジックでは、私は自分自身のクライアント側のアップデータを書くことがうまく機能することを見つけます。それは簡単に将来的に更新することができたSolrの内部に周りいじくるからあなたを保持します。あなたは間違いなくSolrJでこれを行うことができますが、Javaのdevのない場合は、クライアント側ライブラリは、自分自身の言語で、おそらくそこにある... PHP、PythonやRubyの、C#など...
rsolrルビーの宝石( http://github.com/mwmitchell/rsolr/tree/マスターには)カスタム・ロード・スクリプトを一緒にハックすることが非常に簡単になります。
所属していません StackOverflow