当用户创建文档时,我将日期添加到solr索引。每次数据更改如编辑或删除时,我是否必须重新索引整个数据?
在这种情况下,reindex意味着什么?当我做的时候
$this->indexData(array(
'id' => $pid,
'title' => $data['titel']
));
对于每个文档并执行$solr->addDocuments
,它是否只覆盖现有数据?
我尝试在添加/删除/编辑时重新索引整个索引但在删除某个字段后,其信息似乎仍然在索引中。
有什么想法吗?
答案 0 :(得分:24)
当您将文档索引到solr时,它将覆盖具有相同<uniqueKey/>
的任何现有文档,通常是id。所以是的,它会覆盖现有数据。
如果要更改文档的单个字段,则必须重新索引整个文档,因为solr不支持仅更新字段。因此,当您删除字段时,您必须在没有字段的情况下重新索引文档。这将覆盖现有数据。别忘了在最后发送commit
。
使用Solr 4,您可以更新文档的单个字段。见Atomic_Updates
答案 1 :(得分:5)
++以上。
此外,如果您有大量此类更改,则存在潜在问题:
当您在solr中“更新”文档时(正如Morja所说),这不是“就地”更新。会发生什么是Solr维护其文档的内部查找表,当您更新文档时,它必须保留重定向列表,以便当在倒置索引中命中指向“更新”文档的指针时,它知道转到新文档该文件的版本。
如果你有足够的内存,这很好,但最终Solr需要在耗尽内存时重建查找,跟踪所有的变化。这(根据我的经验)会导致意外的减速和不必要的优化。
对你来说可能不是问题,但对我而言。 (千元+每小时更新)
答案 2 :(得分:0)
问题可能是你没有在更新后提交文档(它是一个删除和插入),但过于频繁的提交可能会触发优化,所以要小心。
您无需重新索引整个数据,但必须使用更新的文档重建整个文档。