一致するIDがない場合の更新
(The bot translated the original post https://lists.apache.org/thread/m26rl0nm4gk2po4kloq50zxcwj1t1kfc into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)
みなさん、こんにちは。
私はSolrの更新コードを書いており、使用しているSolrのバージョンは8.5.1です。
これまでのところ、次のように送信することで部分的な更新に成功しています。
{
"id":"1",
"month":{"set":1}
}
この方法で、IDが1のレコードのmonthフィールドを1に更新することができます。
しかし、問題は、IDが1の既存のレコードがない場合、提供されたIDとmonth情報で新しいレコードが作成されることです。
一つの回避策は、更新を発行する前に、ID:1に対してSolrクエリを実行し、結果が空でない場合にのみ更新を行うことです。
ただ、これより良い方法があるのか知りたいです。
よろしくお願いします。
もしあなたの懸念が正しく理解できていれば、ドキュメントがすでに存在する場合にのみアトミック更新を行い、存在しない場合は更新が拒否されるようにしたいということでしょうか?つまり、新しいドキュメントが追加されないようにしたいということですか? もしそうであれば、ドキュメントに以下のように値を1とした"version"フィールドを追加してください:
{
"id":"1",
"_version_":1,
"month":{"set":1}
}
楽観的同時実行制御についての詳細は、Apache Solrリファレンスガイド8.5の「Updating Parts of Documents」セクションを参照してください。
Updating Parts of Documents | Apache Solr Reference Guide 8.5
「_version_フィールドの内容が '1' と等しい場合、ドキュメントは単に存在している必要があります。この場合、バージョンの一致は行われませんが、ドキュメントが存在しない場合は、更新が拒否されます。」
Rahul
Rahul、ありがとう。
はい、それがまさに私の求めていることです。楽観的な同時性の部分は少し複雑そうなので、それらを確認しませんでした。
試してみましたが、version:1とid:1で試したところ、ID=1のレコードが存在しないというエラーが表示され、更新が拒否されました。これは理想的です。
しかし、有効なIDでも更新に失敗しました:
{
"id":"6bdc3c1d-d21a-43e3-aa84-baeeda601bb3",
"_version_":1,
"month":{"set":14}
}
このコード断片はデータベースをスキャンして生成されたもので、私たちはすべてのレコードについて月の値を取得し(そのレコードがSolrに存在しなくても)、それらをSolrで更新します。
Solrサーバーは、サポートされていない操作のエラーを報告しています。
Status: {"data":{"responseHeader":{"rf":1,"status":500,"QTime":1},"error":{"trace":"java.lang.UnsupportedOperationException
at org.apache.lucene.queries.function.FunctionValues.longVal(FunctionValues.java:49)
at org.apache.solr.update.VersionInfo.getVersionFromIndex(VersionInfo.java:225)
at org.apache.solr.update.UpdateLog.lookupVersion(UpdateLog.java:1058)
at org.apache.solr.update.VersionInfo.lookupVersion(VersionInfo.java:204)
at org.apache.solr.update.processor.DistributedUpdateProcessor.doVersionAdd(DistributedUpdateProcessor.java:387)
at org.apache.solr.update.processor.DistributedUpdateProcessor.lambda$versionAdd$0(DistributedUpdateProcessor.java:339)
at org.apache.solr.update.VersionBucket.runWithLock(VersionBucket.java:50)
at org.apache.solr.update.processor.DistributedUpdateProcessor.versionAdd(DistributedUpdateProcessor.java:339)
at org.apache.solr.update.processor.DistributedUpdateProcessor.processAdd(DistributedUpdateProcessor.java:225)
at org.apache.solr.update.processor.DistributedZkUpdateProcessor.processAdd(DistributedZkUpdateProcessor.java:245)
at org.apache.solr.update.processor.LogUpdateProcessorFactory$LogUpdateProcessor.processAdd(LogUpdateProcessorFactory.java:103)
at org.apache.solr.handler.loader.JsonLoader$SingleThreadedJsonLoader.handleAdds(JsonLoader.java:507)
at org.apache.solr.handler.loader.JsonLoader$SingleThreadedJsonLoader.processUpdate(JsonLoader.java:145)
at org.apache.solr.handler.loader.JsonLoader$SingleThreadedJsonLoader.load(JsonLoader.java:121)
at org.apache.solr.handler.loader.JsonLoader.load(JsonLoader.java:84)
at org.apache.solr.handler.UpdateRequestHandler$1.load(UpdateRequestHandler.java:97)
at org.apache.solr.handler.ContentStreamHandlerBase.handleRequestBody(ContentStreamHandlerBase.java:68)
at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:211)
at org.apache.solr.core.SolrCore.execute(SolrCore.java:2596)
at org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall.java:802)
at org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:579)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:420)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:352)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1596)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:545)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:590)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1607)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1297)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1577)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1212)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:221)
at org.eclipse.jetty.server.handler.InetAccessHandler.handle(InetAccessHandler.java:177)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:322)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.Server.handle(Server.java:500)
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383)
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:270)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:388)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938)
at java.base/java.lang.Thread.run(Unknown Source)","code":500}},"status":500,"config":{"method":"POST","transformRequest":[null],"transformResponse":[null],"jsonpCallbackParam":"callback","headers":{"Content-type":"application/json","Accept":"application/json,text/plain,
*/*","X-Requested-With":"XMLHttpRequest"},"data":"[{"id":"6bdc3c1d-d21a-43e3-aa84-baeeda601bb3","_version_":1,"month":{"set":14}}]","url":"biocache/update","params":{"wt":"json","_":1620991739159,"commitWithin":1000,"overwrite":true},"timeout":10000},"statusText":"Server Error","xhrStatus":"complete","resource":{"0":"[","1":"{","2":"","3":""","4":"i","5":"d","6":""","7":":","8":""","9":"6","10":"b","11":"d","12":"c","13":"3","14":"c","15":"1","16":"d","17":"-","18":"d","19":"2","20":"1","21":"a","22":"-","23":"4","24":"3","25":"e","26":"3","27":"-","28":"a","29":"a","30":"8","31":"4","32":"-","33":"b","34":"a","35":"e","36":"e","37":"d","38":"a","39":"6","40":"0","41":"1","42":"b","43":"b","44":"3","45":""","46":",","47":"","48":""","49":"_","50":"v","51":"e","52":"r","53":"s","54":"i","55":"o","56":"n","57":"_","58":""","59":":","60":"1","61":",","62":"","63":""","64":"m","65":"o","66":"n","67":"t","68":"h","69":""","70":":","71":"{","72":""","73":"s","74":"e","75":"t","76":""","77":":","78":"1","79":"4","80":"}","81":"","82":"}","83":"]"}}
Response:
{
"responseHeader": {
"rf": 1,
"status": 0,
"QTime": 11
}
}
解決策について何かアイデアはありますか?
ありがとう
Alex,
そのスタックトレースのコードを追跡する時間が取れなかったんだけど、ドキュメント内のフィールドではなく、URLのパラメータとしてversion=1を渡してみて、何か異なることが起こるか試してみるとどうだろう?また、IDが確かに有効なものであることを二重に確認しておくといいよ。
例:http://localhost:8983/solr/techproducts/update?_version_=1
Rahul
こんにちは、Rahulさん、
問題が解決しました。エラーの原因は、なぜか_version_が文字列フィールドとして定義されていたことです。それをlongに変更したら、すべてうまくいきました。
それでは
トピックへ返信するには、ログインが必要です。