2013-02-15 88 views
1

我一直试图做solr中的UPSERT(插入或更新,如果已经存在)的等价物。我只知道什么不起作用,我读过的solr/lucene文档没有帮助。这是我曾尝试:在一个请求,并要求SOLR可以执行UPSERT吗?

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}} 

我做的最多50个更新可能包含独家字段(title_en和title_es例如)相同的ID。如果有一种查询ID列表是否存在的方法,我可以拆分数据并执行单独的插入和更新命令......这将是一个可接受的替代方案,但是是否已有一个处理程序来执行此操作?在这一点上,我想避免在室内做任何事情。

谢谢。

回答

4

使用Solr 4.0,您可以做一个Partial update of all those document只需更改的字段将保持完整的文档相同。该id应该匹配。

+0

但是如果文档不存在,你会得到:“找不到更新的文档”,这与upsert的行为不同 – Bemis 2013-02-15 07:00:22

+0

我认为它是..请检查http://lucene.472066.n3.nabble。 COM /更新的文档,td3994401.html – Jayendra 2013-02-15 10:48:29

+0

从螺纹: “ >>另一个想法:我们可以切换可能创造 - 如果 - 不存在的,以 >>默认情况下,用现有的乐观并发机制, >>指定文档应该存在 >>因此,如果文档应该存在,指定_version_ = 1并且_version_ = 0 >>(如果您不在意,请使用默认值) 我刚刚做了这个改变。 “ 任何想法这个变化是什么以及如何使用它? – Bemis 2013-02-20 03:16:56

0

Solr不支持开箱即用的UPSERT机制。您可以创建一条记录,或者您可以更新一条记录,而且语法不同。

如果您更新记录,您必须确保您所有的其他预插入的字段存储(不只是索引)。在封面之下,更新会创建一个全新的记录,只是预先填入之前存储的值。但是,如果功能非常强大(可能在Lucene本身)。

你看过DataImportHandler?您反转控制流程(从Solr开始),但它支持检查哪些记录需要更新以及需要创建哪些记录。

或者您也可以运行一个solr查询,如http://solr.example.com:8983/solr/select?q=id%3A(ID1+ID2+ID3)&fl=id&wt=csv您要求Solr查找您的ID记录并仅返回它找到的记录的ID。然后,您可以对该更新和插入进行后期处理。