SOLR能执行UPSERT操作吗?

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

我一次请求可以进行多达50个更新,并且请求可能包含具有独特字段(例如title_en和title_es)的相同id。如果有一种查询列表id是否存在的方法,我可以将数据拆分并执行单独的插入和更新命令...这将是一个可接受的替代方案,但已经有处理程序可以实现这一点了吗?我希望在此时避免进行任何内部例程。

谢谢。

2个回答

4
使用Solr 4.0,您可以进行部分更新所有文档,只需更改已更改的字段,同时保持完整文档相同。 id应匹配。

1
但如果文档不存在,则会返回“找不到要更新的文档”,这与upsert的行为不同。 - Bemis
我认为是这个,请检查:http://lucene.472066.n3.nabble.com/Updating-documents-td3994401.html - Jayendra
从线程中: "
另一个想法:我们可能可以默认切换到创建-如果不存在,并使用现有的乐观并发机制来指定文档应该存在。
因此,如果文档应该存在,则指定_version_=1,如果您不关心,则指定_version_=0(默认值)。 我刚刚提交了这个更改。"
你知道这个更改是什么,如何使用它吗?
- Bemis
不确定,您需要检查补丁。 - Jayendra
我之前使用的是solr 4.0 alpha,遇到了那些错误。现在测试一下 solr 4.1,它能正常工作:curl 'localhost:8983/solr/update?commit=true' -H 'Content-type:application/json' -d '[{"id":"-1","description":{"set":"oops"}}]' {"responseHeader":{"status":0,"QTime":27}}PS - 部分更新是对upsert(很直观)的可怕名称替代。 - Bemis

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。然后,你可以后处理来划分你的更新和插入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接