2012-08-03 151 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" 
} 
相關問題