我一直试图在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}}
我在一个请求中最多进行50次更新,并且请求可能包含具有独占字段的相同ID(例如title_en和title_es)。如果有一种方法可以查询是否存在id列表,我可以拆分数据并执行单独的插入和更新命令......这将是一个可接受的替代方案,但是已经有一个处理程序来执行此操作吗?我想在这一点上避免做任何内部惯例。
感谢。
答案 0 :(得分:4)
使用Solr 4.0,您可以执行Partial update of all those document,只使用已更改的字段将保持完整文档相同。 id应该匹配。
答案 1 :(得分: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记录并只返回它找到的记录的ID。然后,您可以对其进行后期处理以细分您的更新和插入内容。