solr支持三種類型的原子更新:
- set - to set a field.
- add - to add to a multi-valued field.
- inc - to increment a field.
其中set可以是單值的也可以是multifiled, add 針對multi-field ,inc 對應數值類型
使用solrj進行原子更新
String zk= "127.0.0.1:2183"; String root="/solr"; CloudSolrClient solrClient=new CloudSolrClient(zk+root); solrClient.connect(); SolrInputDocument doc = new SolrInputDocument(); Map<String, String> partialUpdate = new HashMap<String, String>(); partialUpdate.put("set", "純植物染發1次男女不限僅限短發,提供免費WiFi"); doc.addField("grouponId", "123456"); doc.addField("name", partialUpdate); Map<String,List<String>> cities=new HashMap<String, List<String>>(); List list=new ArrayList(); list.add("北京"); list.add("長春"); cities.put("set",list); doc.addField("city",cities); doc.addField("_version_",1); Map<String,String> subCat=new HashMap<String, String>(); subCat.put("add","美容"); doc.addField("subCat",subCat); Map<String,Long> price=new HashMap<String, Long>(); price.put("inc",100L); doc.addField("price",price); try { solrClient.add("groupon",doc); solrClient.commit("groupon"); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { solrClient.close(); } catch (IOException e) { e.printStackTrace(); }
原始數據:
{ grouponId: "123456", cat: [ "麗人" ], subCat: [ "美發" ], name: "純植物染發1次男女不限僅限短發,提供免費WiFi1", price: 67.80000305175781, startTime: "2015-08-31T06:16:35Z", endTime: "2016-06-25T15:59:59Z", postTime: "2015-11-04T10:25:33.914Z", city: [ "北京市", "長春市" ], region: [ "新鄭市" ], district: [ "炎黃廣場" ], _version_: 1535465635791765500 }
執行代碼后:
{ grouponId: "123456", cat: [ "麗人" ], subCat: [ "美發", "美容" ], name: "純植物染發1次男女不限僅限短發,提供免費WiFi", price: 167.8000030517578, startTime: "2015-08-31T06:16:35Z", endTime: "2016-06-25T15:59:59Z", postTime: "2015-11-04T10:25:33.914Z", city: [ "北京", "長春" ], region: [ "新鄭市" ], district: [ "炎黃廣場" ], _version_: 1535467687828783000 }
關於更新中傳入的_version_值說明:
- version<0,如果這個文檔存在,則solr會拒絕修改,如果不存在,則add這個文檔
- 當version=0時,如果待修改的文檔存在,則修改這個文檔,如果不存在。則add這個文檔
- version=1 ,如果文檔存在,則update這個文檔,如果不存在,則拒絕修改,
- version>1, 如果文檔的_version_值和傳入的version值不一樣,則拒絕修改,值一樣則修改。
原子更新的幾點問題:
- 如果有字段的store=false,但是在更新的時候沒有給這個字段設置值,則這個字段在更新的時候數據會被丟掉; store=true的字段則不會。
- 針對multi-field字段,如果store=false, 則在原子更新 使用add時也會把這個字段之前的數據丟掉。