我需要经常在solr中更新大量文档。例如,为user_id = 5设置“online”= true,依此类推。但是通过http处理程序的索引速度非常慢。 Solr支持通过查询删除文档,有没有办法按查询更新?
答案 0 :(得分:10)
不,遗憾的是,没有像查询更新这样的功能。它将非常有用,就像一个新功能,可以更新文档而无需完全重新提交;那是一个5岁jira issue。现在,您只需使用更新的字段重新提交您的文档,如果您使用相同的uniqueKey
,它们将被覆盖(意味着删除+重新插入)。
顺便问一下,您是否要为每个要更新的文档发出http请求?如果是,您可以更快地一次提交多个文档:
<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>
答案 1 :(得分:7)
仍然没有按查询更新,但2012年的答案已过时。现在在Solr 4.x中有https://wiki.apache.org/solr/Atomic_Updates,因此您可以分两步执行您想要执行的操作,而无需访问原始文档。
答案 2 :(得分:1)
正如javanna所回答的那样,没有任何工具可以通过查询进行更新,因为Solr也不允许您更新存储在索引中的文档中的单个字段,因此重新提交是唯一的更新方法。我很好奇为什么你的更新太慢了。以下是一些可以提高更新速度的方法。
如果在更新每个单独的文档后发出提交,请等待并仅在更新索引中的一批文档后发出更新。来自Solr Tutorial:
提交可能是一项昂贵的操作,因此最好进行许多更改 批处理中的索引,然后在结束时发送提交命令。 还有一个优化命令可以执行与提交相同的操作, 除了将所有索引段合并为单个段之外, 使搜索速度更快,并导致任何已删除的文档 除去。
查看使用软提交或自动软提交来减少更新延迟。有关详细信息,请参阅Solr Wiki上的NearRealtimeSearch页面。
答案 3 :(得分:1)
您可以开发一个最小的Solr插件,它将在solr服务器端为您完成工作 看一下: Discussion on Solr mailing list
答案 4 :(得分:0)
我会将DIH与修改后的SQL查询一起使用,该查询将接受来自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