solr的原子更新/局部更新

来源:互联网 发布:飞升真元段体数据 编辑:程序博客网 时间:2024/04/27 18:47
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_值说明:
  1.  version<0,如果这个文档存在,则solr会拒绝修改,如果不存在,则add这个文档
  2. 当version=0时,如果待修改的文档存在,则修改这个文档,如果不存在。则add这个文档
  3. version=1 ,如果文档存在,则update这个文档,如果不存在,则拒绝修改,
  4. version>1, 如果文档的_version_值和传入的version值不一样,则拒绝修改,值一样则修改。
 
原子更新的几点问题:
  1. 如果有字段的store=false,但是在更新的时候没有给这个字段设置值,则这个字段在更新的时候数据会被丢掉; store=true的字段则不会。
  2. 针对multi-field字段,如果store=false, 则在原子更新 使用add时也会把这个字段之前的数据丢掉。

0 0