我是 solr 的新手。有人可以解决以下问题。1. 目前我有一个包含 1.5 条轧机记录的索引。我需要将字段的值更新为新值。我该怎么做。会重新索引吗?示例代码会有所帮助。
- 我还有另一个需要,我想添加一个索引字段,但不想重新索引整个内容。我有文件ID。对于这个要求,如果有帮助,我可以使用 lucene。
看看4.0 中添加的原子更新功能。它允许您更改特定字段的值,而无需重新索引整个文档。请记住,您的架构中的所有字段都必须存储(没有 copyFields)。如果您需要进一步的帮助,请写更详细的描述。
目前我有一个包含 1.5 条轧机记录的索引。我需要将字段的值更新为新值。我该怎么做。会重新索引吗?示例代码会有所帮助。
好消息是 Solr 的最新版本(我认为从 4.3 或 4.4 开始)允许您执行他们所谓的原子更新。看这里:
http://wiki.apache.org/solr/Atomic_Updates
从编码的角度来看,就好像您只是在更新所需的字段。使用 Java SolrJ API 它是这样的:
假设您有一个文档,其中包含一个名为“stuffedAnimals”的多值字段。该字段已包含“泰迪熊”和“填充乌龟”作为值。您想要更新它并添加一个新值,例如“pink fluffy flamingo”。你可以做的是:
SolrInputDocument updateDocument = new SolrInputDocument();
//here you must add the id field with the desired value, corresponding to the doc you want to update:
updateDocument.addField("id", 2312312);
//tell it to add the new value to the existing ones, rather then replace them with it:
updateDocument.addField("stuffedAnimals", new HashMap(){{put("add","pink fluffy flamingo");}});
问题在于性能:执行此操作时实际发生的情况是文档被完全删除并重新添加(不仅仅是字段)。如果您计划进行大量此类操作,则需要考虑这一点。
我还有另一个需要,我想添加一个索引字段,但不想重新索引整个内容。我有文件ID。对于这个要求,如果有帮助,我可以使用 lucene。
好吧,正如我上面所说的:当你更新一个字段时,文档实际上是完全重写的,这意味着它也被新字段重新索引了。如果您使用的是 Solr 4.4 或更早版本,则需要在 schema.xml 文件中声明新字段。如果您使用 Solr 4.5 或更高版本,则无需再担心 schema.xml。
最后,作为两个问题的备注:如果要更新 Solr 文档,请确保其所有字段都标记为“已存储”(schema.xml 中的已存储=true)。由于对字段的部分更新会转化为 Solr 删除和重新添加文档(应用了更新),如果某些字段没有被存储,Solr 将不知道在更新后要在其中放入什么值。