4

私はsolrでUPSERT(すでに存在する場合は挿入または更新)と同等のことを行おうとしています。私は何が機能しないかを知っているだけで、私が読んだsolr/luceneのドキュメントは役に立ちませんでした。これが私が試したことです:

curl 'localhost:8983/solr/update?commit=true' -H 'Content-type:application/json' -d '[{"id":"1","name":{"set":"steve"}}]'
{"responseHeader":{"status":409,"QTime":2},"error":{"msg":"Document not found for update.  id=1","code":409}}

1つのリクエストで最大50の更新を行います。リクエストには、排他フィールド(title_enやtitle_esなど)を持つ同じIDが含まれる場合があります。IDのリストが存在するかどうかを照会する方法があれば、データを分割して、個別の挿入コマンドと更新コマンドを実行できます...これは許容できる代替手段ですが、これを行うハンドラーは既にありますか?現時点では、社内でのルーチンは避けたいと思います。

ありがとう。

4

2 に答える 2

4

Solr 4.0 を使用すると、変更されたフィールドのみを使用して、これらすべてのドキュメントの部分的な更新を行うことができ、完全なドキュメントを同じに保つことができます。ID が一致する必要があります。

于 2013-02-15T04:07:38.840 に答える
0

Solr はそのままでは UPSERT メカニズムをサポートしていません。レコードを作成することも、レコードを更新することもできますが、構文は異なります。

また、レコードを更新する場合は、事前に挿入された他のすべてのフィールドが保存されていることを確認する必要があります (単にインデックスを作成するだけではありません)。内部的には、更新により、以前に保存された値が事前入力された完全に新しいレコードが作成されます。しかし、その機能は非常に深い場合 (おそらく Lucene 自体) にあります。

DataImportHandlerを見ましたか? 制御フローを逆にします (Solr から開始) が、どのレコードを更新する必要があり、どのレコードを作成する必要があるかをチェックする機能がサポートされています。

または、 http://solr.example.com:8983/solr/select?q=id%3A(ID1+ID2+ID3)&fl=id&wt=csvのような solr クエリを実行して、Solr に検索を依頼することもできます。レコードを識別し、見つかったレコードの ID のみを返します。次に、それを後処理して更新と挿入をセグメント化できます。

于 2013-02-15T13:12:03.400 に答える