2012-08-03 110 views
10

是否有可能将新字段更新为现有文档? 例如: 存在具有多个字段的文档,例如,更新现有文档的新字段

ID=99999 
Field1:text 
Field2:text 

该文件已经在索引中,现在我要插入一个新的领域,以本文档,而无需将旧数据:

ID=99999 
Field3:text 

现在,旧的文件将被删除,新的带有ID的文件将被创建。所以,如果我现在要查找的ID 99999的结果将是:

ID=99999 
Field3:text 

我读这在Solr的维基

如何更新现有文档的某一特定领域?

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

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

在Lucene中更新文档的操作实际上是一个删除,然后是添加。由于Lucene中没有这种“只更新字段”的语义,因此您需要添加完整的文档。

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

问候

回答

10

我给你2回答(两者或多或少坏):

  1. 要更新Solr的文档内提交,你必须重新索引整个文档(以文件ID内更新字段3 :99999你必须重新索引该文件的所有字段的值)
  2. 在Solr 4中,他们实现了类似的功能,但他们有一个条件:所有字段必须存储,而不仅仅是索引。发生的是他们正在使用存储的值并在后台重新索引文档。如果你有兴趣,有关于它的好文章:http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/这个解决方案有明显的缺陷,那就是当你存储所有字段时索引的大小。

我希望这会帮助你解决你的问题。如果您还有其他问题,请询问

+0

非常感谢!你的第一个答案就是我想到的。你认为这会受到很大的影响吗?对于答案2:你能给我一个这个更新日志的官方链接吗?我无法找到此功能。尼斯链接:-) – 2012-08-03 09:27:22

+0

取决于你进行更改的频率,索引的大小,文档的大小,你使用的硬件。由于任何变化都会导致IO,CPU等成本的增加,你将不得不试验一下你的情况。对于第二部分,我无法在日志中找到它:http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?view=markup但是Yonik Seeley确认在http:// grokbase.com/t/lucene/solr-user/127bc3svh7/updating-documents – Fuxi 2012-08-03 10:12:40

+0

我的索引包含大约1,8百万个文档,每个文档都有大约10-30个多值字段。问题是,如果由于高性能损失而无法使用应用程序,开发应用程序将花费太多时间。建议将版本更改为4.0 alpha版本吗?你有什么经验吗?非常感谢:-) – 2012-08-03 10:28:45

6

可以在Solr 4中做到这一点。请看下面的文档

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

为了一个作者字段添加到文档中的字段值将与“设置”属性和字段值的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" 
} 
} 

设置将添加或替换作者字段。随着设置,你也可以选择增加(增量)并添加(添加)

+0

我想更新不使用ID字段的作者字段上的文档。我怎样才能做到这一点? – iNikkz 2015-01-20 08:26:03

0

从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" 
} 
相关问题