solr的原子更新/局部更新

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時也會把這個字段以前的數據丟掉。
相關文章
相關標籤/搜索