2012-02-08 184 views
7

我需要经常更新solr中的大量文档。例如,为user_id = 5设置“online”= true,依此类推。但通过http处理程序索引的速度非常慢。 Solr支持通过查询删除文件,有没有办法通过查询进行更新?通过查询更新Solr索引

+0

关于这个话题还有一个很好阐述的jira问题,以及为什么它没有解决:https://issues.apache。org/jira/browse/SOLR-7490 – cheffe 2016-02-15 11:20:16

回答

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

由于javanna回答,没有任何设施通过查询来更新,如Solr的也不允许你更新各个领域在存储在索引中的文档中,重新提交是唯一的更新方法。我很好奇,但为什么你的更新速度如此之慢。以下是一些可以提高更新速度的方法。

  • 如果在更新每个单独的文档后发出提交,请等待并且只有在更新了索引中的一批文档后才发出更新。从Solr Tutorial

    提交可以是一个昂贵的操作,所以最好做在批处理许多变化 到一个索引,然后在最后发送commit命令。 除了将所有索引段合并为一个段, 还有一个优化命令,它与commit, 具有相同的功能,因此可以更快地搜索并删除所有已删除的文档,从而删除 。

  • 查看使用软提交或自动软提交以减少更新延迟。有关更多详细信息,请参阅Solr Wiki上的NearRealtimeSearch页面。

+0

我认为更新过程很慢,仅仅是因为很多http请求......好的建议! – javanna 2012-02-08 12:49:02

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

6

目前仍然通过查询没有更新,但是从2012年的答案是过时的。现在在Solr 4.x中有https://wiki.apache.org/solr/Atomic_Updates,所以你可以在两步中做你想做的事情,而不需要访问原始文档。

+0

原子更新有限制。正如Erick在maillist中所说的那样,它仍然是场景后面的整个文档更新。使用原子更新时未列出的文档的字段必须“存储”,否则在原子更新后它们的原始值可能会丢失,因为我认为它从原始索引中检索这些未列出的字段的值,并将它们与列出的字段合并以进行原子更新,然后在整个场景后面更新整个文档。 (在撰写评论时,最新的Solr是v6.1.0) – 2016-06-29 09:57:49