2013-02-15 155 views
1

我一直試圖做solr中的UPSERT(插入或更新,如果已經存在)的等價物。我只知道什麼不起作用,我讀過的solr/lucene文檔沒有幫助。這是我曾嘗試:在一個請求,並要求SOLR可以執行UPSERT嗎?

curl 'localhost:8983/solr/update?commit=true' -H 'Content-type:application/json' -d '[{"id":"1","name":{"set":"steve"}}]' 
{"responseHeader":{"status":409,"QTime":2},"error":{"msg":"Document not found for update. id=1","code":409}} 

我做的最多50個更新可能包含獨家字段(title_en和title_es例如)相同的ID。如果有一種查詢ID列表是否存在的方法,我可以拆分數據並執行單獨的插入和更新命令......這將是一個可接受的替代方案,但是是否已有一個處理程序來執行此操作?在這一點上,我想避免在室內做任何事情。

謝謝。

回答

4

使用Solr 4.0,您可以做一個Partial update of all those document只需更改的字段將保持完整的文檔相同。該id應該匹配。

+0

但是如果文檔不存在,你會得到:「找不到更新的文檔」,這與upsert的行爲不同 – Bemis 2013-02-15 07:00:22

+0

我認爲它是..請檢查http://lucene.472066.n3.nabble。 COM /更新的文檔,td3994401.html – Jayendra 2013-02-15 10:48:29

+0

從螺紋: 「 >>另一個想法:我們可以切換可能創造 - 如果 - 不存在的,以 >>默認情況下,用現有的樂觀併發機制, >>指定文檔應該存在 >>因此,如果文檔應該存在,指定_version_ = 1並且_version_ = 0 >>(如果您不在意,請使用默認值) 我剛剛做了這個改變。 「 任何想法這個變化是什麼以及如何使用它? – Bemis 2013-02-20 03:16:56

0

Solr不支持開箱即用的UPSERT機制。您可以創建一條記錄,或者您可以更新一條記錄,而且語法不同。

如果您更新記錄,您必須確保您所有的其他預插入的字段存儲(不只是索引)。在封面之下,更新會創建一個全新的記錄,只是預先填入之前存儲的值。但是,如果功能非常強大(可能在Lucene本身)。

你看過DataImportHandler?您反轉控制流程(從Solr開始),但它支持檢查哪些記錄需要更新以及需要創建哪些記錄。

或者您也可以運行一個solr查詢,如http://solr.example.com:8983/solr/select?q=id%3A(ID1+ID2+ID3)&fl=id&wt=csv您要求Solr查找您的ID記錄並僅返回它找到的記錄的ID。然後,您可以對該更新和插入進行後期處理。