我在云模式下使用Solr v7.7.1。我面临与optimistic concurrency相关的问题:
我有一个嵌套的文档,可以在提交更新之前同时进行多次更新。在建立索引的过程中,我们获取要修改的文档及其_version_
,对其进行修改,然后将其与相同的_version_
一起发送至solr。如果更新在提交之前多次发生,则会引发以下错误:
原因: org.apache.solr.client.solrj.impl.HttpSolrClient $ RemoteSolrException: 来自服务器的错误 http://1.2.3.4:8983/solr/mcollection_shard1_replica_n2:版本 预计1111会发生冲突= 1645085633861910528 实际= 1645090791527284737
在上述错误中,我们基本上试图在索引和提交先前版本的文档之前为ID为1111
的文档建立索引。解决此问题的方法是简单地提交所有更新,然后再次尝试索引新文档。但是,即使提交后,solr也会使用相同的版本代码给出相同的错误。可能是什么问题?
一个奇怪的发现是,当solr不在云模式下运行时,不会遇到此问题。
答案 0 :(得分:1)
当我们使用嵌套文档时,这似乎是solr的一个非常具体的问题。
在为文档建立索引时,当提到_version_
时,solr通过执行real-time get来检查已存在的最新文档的版本。实时获取从更新日志中获取数据(这意味着还可以访问尚未打开以供搜索的数据)。为此,solr会执行以下操作:
http://1.2.3.4:8983/solr/mcollection/get?id=1111
现在,如果您有2个嵌套文档,则在一个文档(doc1)中,父级具有id = 1111,而在另一个文档(doc2)中,子级具有id = 1111,那么solr可能会检查 doc2的>版本。这可能是因为solr仍以平面结构索引所有文档,并且在进行实时获取时不考虑父子关系。
解决方案是使父文档和子文档的ID彼此不同。