将新字段更新为现有文档

时间:2012-08-03 08:10:00

标签: solr

是否有可能将新字段更新为现有文档? 例如: 有一个包含多个字段的文档,例如

ID=99999
Field1:text
Field2:text

此文档已在索引中,现在我想在没有旧数据的情况下向此文档插入新字段:

ID=99999
Field3:text

现在,旧文档将被删除,并将创建一个带有ID的新文档。因此,如果我现在搜索ID 99999,结果将是:

ID=99999
Field3:text

我在Solr Wiki上读到了这个

  

如何更新现有文档的特定字段?

     

我想更新文档中的特定字段,这可能吗?我只需要为一个特定文档索引一个字段。我是否必须为此索引所有文档?

     

不,只是一个文件。假设您有一个CMS并且您编辑了一个文档。您只需要使用整个文档的add solr语句(仅限一个字段)重新索引此文档。

     

在Lucene中更新文档时,操作实际上是删除后跟添加。您将需要>添加完整的文档,因为Lucene中没有这样的“仅更新字段”语义。

那么有什么解决方案吗?这个功能是否会在另一个版本中实现(我目前使用的是3.6.0)。作为一种解决方法,我考虑编写脚本或应用程序,它将收集现有字段,添加新字段并更新整个文档。但我认为这会受到影响。你还有其他想法吗?

祝你好运

3 个答案:

答案 0 :(得分:10)

我有2个答案(或多或少都不好):

  1. 要更新Solr中的文档,您必须重新索引整个文档(要更新文档ID中的Field3:99999,您必须使用所有字段的值重新索引该文档)
  2. 在Solr 4中,他们实现了这样的功能,但它们有一个条件:所有字段都必须存储,而不仅仅是索引。发生了什么,他们正在使用存储的值并在后台重新索引文档。如果你有兴趣,可以写一篇很好的文章:http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/这个解决方案有明显的缺陷,当你存储所有字段时,它就是索引的大小。
  3. 我希望这可以帮助您解决问题。如果您还有其他问题,请询问

答案 1 :(得分:7)

可以在Solr 4中执行此操作。请考虑以下文档

{
 "id": "book123",
 "name" : "Solr Rocks"
}

为了向文档添加作者字段,字段值将是具有“set”属性和字段值的json对象

$ curl http://localhost:8983/solr/update -H 'Content-type:application/json' -d '
[
 {"id"       : "book123",
  "author"   : {"set":"The Community"}
 }
]'

您的新文件

$ curl http://localhost:8983/solr/get?id=book123

将是

{
 "doc" : {
    "id"    : "book123",
    "name"  : "Solr Rocks"
    "author": "The Community"
 }
}

设置将添加或替换作者字段。除了设置,您还可以选择增加(增加)和添加(添加)

答案 2 :(得分:1)

从Solr 4开始,您可以更新solr中的字段....无需重新索引整个索引....支持各种修饰符,如....

set - 设置或替换特定值,或者如果将null指定为新值,则删除该值 add - 为列表添加其他值 remove - 从列表中删除值(或值列表) removeregex - 从与给定Java正则表达式匹配的列表中删除 inc - 按特定数量递增数值(使用负值递减)

示例:

文件

{
 "id": "1",
 "name" : "Solr"
 "views" : "2"
}

现在用

更新
$ curl http://localhost:8983/solr/demo/update -d '
[
 {"id"         : "1",
  "author"   : {"set":"Neal Stephenson"},
  "views"   : {"inc":3},
  }
]' 

将导致

{
 "id": "1",
 "name" : "Solr"
 "views" : "5"
 "author" : "Neal Stephenson"
}