Solr索引更新查询

8

我经常需要更新Solr中大量的文档,例如将"user_id = 5"的用户设置为"online=true"等。但是通过http处理程序进行索引速度非常慢。Solr支持通过查询删除文档,是否有一种方法可以通过查询更新文档呢?


关于这个主题以及为什么它没有解决,有一个详细的Jira问题:https://issues.apache.org/jira/browse/SOLR-7490 - cheffe
5个回答

11
很遗憾,目前并没有类似于按查询更新的功能。这个功能非常有用,可以实现无需完全重新提交文档即可对其进行更新;此问题已经存在了五年之久,详见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>

7

目前仍没有按查询更新的功能,但是2012年的答案已经过时。现在在Solr 4.x中有原子更新,因此您可以在不需要访问原始文档的情况下通过两个步骤完成您想要做的事情。


原子更新有限制。正如Erick在邮件列表中所说,它仍然是一个整个文档的更新。在使用原子更新时,您没有列出的文档字段必须被“存储”,否则它们的原始值可能会在原子更新后丢失,因为我认为它会从原始索引中检索这些未列出的字段的值,并将它们与列出的字段组合起来进行原子更新,然后在幕后更新整个文档。(最新的Solr版本是v6.1.0) - Scott Chu

1

1

正如javanna所回答的那样,没有任何工具可以通过查询来更新,因为Solr也不允许您更新索引中存储的文档中的单个字段,因此重新提交是唯一的更新方法。但我很好奇为什么您的更新速度如此缓慢。以下是一些可以提高更新速度的方法。

  • 如果您在更新每个单独的文档后都要提交,请等待并在更新索引中的一批文档后再发出更新请求。根据Solr教程

    提交可能是一个昂贵的操作,因此最好批量对索引进行多次更改,然后在最后发送提交命令。还有一个优化命令,它与提交执行相同的操作,另外还将所有索引段合并为单个段,使搜索更快,并删除任何已删除的文档。

  • 考虑使用软提交或自动软提交来减少更新延迟。请参阅Solr Wiki上的NearRealtimeSearch页面以获取更多详细信息。


我之前以为更新过程很慢只是因为有很多HTTP请求...好建议! - javanna

0

我会使用带有修改后的 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


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