添加和更新Solr和lucene字段

时间:2013-10-12 02:38:30

标签: solr lucene

我是solr的新手。有人可以解决以下问题。 1.目前我的指数有1.5万条记录。我需要将字段的值更新为新值。我该怎么做。它会重新编制索引吗?示例代码会很有用。

  1. 我还有另外需要添加索引字段但又不想重新索引整个内容。我有文件ID。对于这个要求,如果有帮助,我可以使用lucene。

2 个答案:

答案 0 :(得分:0)

查看4.0中添加的atomic update功能。 它允许您更改特定字段的值而无需重新索引整个文档。 请记住,必须存储模式中的所有字段(不使用copyFields)。如果您需要进一步的帮助,请写下更详细的说明。

答案 1 :(得分:0)

目前我有一个1.5毫米记录的索引。我需要将字段的值更新为新值。我该怎么做。它会重新编制索引吗?示例代码会很有用。

好消息是,Solr的最新版本(我认为从4.3或4.4开始)允许您执行他们称之为Atomic Updates的操作。见这里:

http://wiki.apache.org/solr/Atomic_Updates

从编码的角度来看,就好像你只是在更新所需的字段一样。使用Java SolrJ API就是这样的:

假设您有一个名为“stuffedAnimals”的多值字段的文档。该字段已包含“泰迪熊”和“填充乌龟”作为值。你想要更新它并添加一个新的值,如“粉红色蓬松火烈鸟”。你能做的是:

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将不知道更新后要在其中放入什么值。