如何更新solr索引?

时间:2011-03-11 06:59:47

标签: solr

当用户创建文档时,我将日期添加到solr索引。每次数据更改如编辑或删除时,我是否必须重新索引整个数据?

在这种情况下,reindex意味着什么?当我做的时候

$this->indexData(array(
        'id' => $pid,
        'title' => $data['titel']
));

对于每个文档并执行$solr->addDocuments,它是否只覆盖现有数据?

我尝试在添加/删除/编辑时重新索引整个索引但在删除某个字段后,其信息似乎仍然在索引中。

有什么想法吗?

3 个答案:

答案 0 :(得分:24)

当您将文档索引到solr时,它将覆盖具有相同<uniqueKey/>的任何现有文档,通常是id。所以是的,它会覆盖现有数据。

如果要更改文档的单个字段,则必须重新索引整个文档,因为solr不支持仅更新字段。因此,当您删除字段时,您必须在没有字段的情况下重新索引文档。这将覆盖现有数据。别忘了在最后发送commit

使用Solr 4,您可以更新文档的单个字段。见Atomic_Updates

答案 1 :(得分:5)

++以上。

此外,如果您有大量此类更改,则存在潜在问题:

当您在solr中“更新”文档时(正如Morja所说),这不是“就地”更新。会发生什么是Solr维护其文档的内部查找表,当您更新文档时,它必须保留重定向列表,以便当在倒置索引中命中指向“更新”文档的指针时,它知道转到新文档该文件的版本。

如果你有足够的内存,这很好,但最终Solr需要在耗尽内存时重建查找,跟踪所有的变化。这(根据我的经验)会导致意外的减速和不必要的优化。

对你来说可能不是问题,但对我而言。 (千元+每小时更新)

答案 2 :(得分:0)

问题可能是你没有在更新后提交文档(它是一个删除和插入),但过于频繁的提交可能会触发优化,所以要小心。

您无需重新索引整个数据,但必须使用更新的文档重建整个文档。