为什么solr在更新时添加新文档?

时间:2017-11-12 23:39:08

标签: solr

curl 'http://localhost/solr/collection/update?commit=true' 
-H 'Content-type:application/json' 
-d 
'[ 
  { 
    "id":"11111", 
    "price":{"set":1000} 
  }
]'

如果存在id:11111,则更新价格值。 没关系。

如果id:11111不存在,则在solr索引中创建新文档。这种行为是不可取的。我希望错误的一些文字如下:你试图更新的文件不存在。 我无法理解什么是错的。

Solr版本:4.8.0。

schema.xml的一部分:

<field name="id" type="string"  indexed="true" stored="true" required="true"/>
<uniqueKey>id</uniqueKey>

2 个答案:

答案 0 :(得分:0)

这就是原子更新的当前实现似乎如何工作。我同意可能需要出错...你应该在用户邮件列表中提出问题,看看委员会的想法,也许他们同意你应该提出错误,他们会要求你然后打开一个jira。

哦,刚刚注意到4.8版本,这是相当陈旧的,您是否有机会测试当前版本中的行为?

答案 1 :(得分:0)

/update请求处理程序实际上更新了新文档和现有文档的索引,并处理了删除操作。

在指数化期间:

  • 如果文档没有标识符或其ID与任何索引文档都不匹配,则该文档被视为新文档。如果在索引期间没有生成id,并且如果需要uniqueKey字段,则拒绝该文档。
  • 具有与索引文档匹配的标识符的文档与其存储的版本合并:所有存储的字段都从索引加载并被请求参数中的字段值覆盖,并且生成的文档替换前一个文档(但在最后它是相同的操作)。

换句话说,更新请求 - 如果不是删除 - 总是在同一添加操作中结束。顺便说一句,solr.UpdateRequestHandler识别的XML架构包含 <add> <doc><field>元素,无论操作(添加或替换)如何。

最新版本的Solr提供了更多文档更新选项。 (请参阅atomic updatesin-place updates

您描述的是预期的行为。由于id字段是必需的,因此Solr将为缺少此字段的文档抛出错误。在您的情况下,文档在两种情况下都被编入索引,因为在两种情况下都会给出id。

使用此配置,您必须确保id字段对于您认为是新文档的内容为空,无论是客户端在准备请求时还是服务器端使用更新处理器,或者更新请求处理程序实现。也许阻止任何新文档的索引会更简单吗?