2009-08-14 67 views
3

我有一個相當簡單的需求在Solr中做一個條件更新,這很容易在MySQL中完成。Solr有條件添加/更新?

例如,

  • 我有叫一個獨特的領域100個文件<id>
  • 我張貼10個文件,其中一些可能是重複的<id>秒,在這種情況下,Solr的將更新現有記錄與同<id>小號
  • 我有一個字段名爲<dateCreated>,我想如果新<dateCreated>比老<dateCreated>(適用於重複0 greated只更新一當然)

我將如何能夠完成這樣的事情?

上下文正試圖對抗導致多次添加相同ID但是以錯誤順序執行的競態條件。

謝謝。

+0

你的問題是缺少信息。再試一次 – Noah 2009-08-14 22:08:21

+0

對不起,我吃了我的小於/大於和它們裏面的一切。更正! – 2009-08-14 22:17:55

回答

2

我能想到的方法有兩種:

  1. 寫自己的UpdateHandler並覆蓋addDoc以實施檢查。
  2. 在您的客戶端代碼中放入適當的鎖(關鍵部分)以獲取存儲的文檔,比較日期並以線程安全的方式有條件地添加新文檔。

請記住,Solr不是一個數據庫,比較它與MySQL是比較蘋果和橙子。

+0

謝謝,我希望得到已經支持的東西。 #1聽起來很有用但很複雜 - 我不是Java開發人員。 #2可能是我在最後期限的限制下要採取的方法。 – 2009-08-15 06:46:23

1

有了像這樣的真正自定義添加邏輯,我發現編寫自己的客戶端更新程序效果更好。它可以避免在Solr內部造成混亂,這使得將來更容易更新。您可以在SolrJ中明確地做到這一點,但如果您不是Java開發人員,則可能有您自己的首選語言的客戶端庫... PHP,Python,Ruby,C#等...

rsolr Ruby寶石(http://github.com/mwmitchell/rsolr/tree/master)使得它非常容易將自定義加載腳本一起破解。

2

從solr 4.0開始,通過_version_字段啓用樂觀併發。

http://yonik.com/solr/optimistic-concurrency/

要啓用,你需要確保你的schema.xml包含

<field name="_version_" type="long" indexed="true" stored="true"/> 

和solrconfig.xml中

<updateHandler class="solr.DirectUpdateHandler2"> 
    <updateLog> 
     <str name="dir">${solr.data.dir:}</str> 
    </updateLog> 
</updateHandler> 
+0

您通過在SolrInputDocument中使用\ _VERSION \ _字段來調用樂觀併發性。 – 2013-04-22 19:02:14