我经常需要更新Solr中大量的文档,例如将"user_id = 5"的用户设置为"online=true"等。但是通过http处理程序进行索引速度非常慢。Solr支持通过查询删除文档,是否有一种方法可以通过查询更新文档呢?
我经常需要更新Solr中大量的文档,例如将"user_id = 5"的用户设置为"online=true"等。但是通过http处理程序进行索引速度非常慢。Solr支持通过查询删除文档,是否有一种方法可以通过查询更新文档呢?
uniqueKey
,它们将被覆盖(也就是删除 + 重新插入)。<add>
<doc>
<field name="employeeId">05991</field>
<field name="office">Bridgewater</field>
</doc>
<doc>
<field name="employeeId">05992</field>
<field name="office">Bridgewater</field>
</doc>
<doc>
<field name="employeeId">05993</field>
<field name="office">Bridgewater</field>
</doc>
</add>
目前仍没有按查询更新的功能,但是2012年的答案已经过时。现在在Solr 4.x中有原子更新,因此您可以在不需要访问原始文档的情况下通过两个步骤完成您想要做的事情。
正如javanna所回答的那样,没有任何工具可以通过查询来更新,因为Solr也不允许您更新索引中存储的文档中的单个字段,因此重新提交是唯一的更新方法。但我很好奇为什么您的更新速度如此缓慢。以下是一些可以提高更新速度的方法。
如果您在更新每个单独的文档后都要提交,请等待并在更新索引中的一批文档后再发出更新请求。根据Solr教程:
提交可能是一个昂贵的操作,因此最好批量对索引进行多次更改,然后在最后发送提交命令。还有一个优化命令,它与提交执行相同的操作,另外还将所有索引段合并为单个段,使搜索更快,并删除任何已删除的文档。
考虑使用软提交或自动软提交来减少更新延迟。请参阅Solr Wiki上的NearRealtimeSearch页面以获取更多详细信息。
我会使用带有修改后的 SQL 查询的 DIH,该查询将接受来自 URL 的参数。SQL 查询将如下:
SELECT user_name, user_online FROM users WHERE user_id=${dataimporter.request.user_id}
然后,要重新索引选定的用户,您需要将user_id参数添加到URL中,像这样:
http://<host>:<port>/solr/dataimport?command=full-import&clean=false&user_id=5
关于使用DIH和自定义参数的文档:Solr - DataImportHandler