zoukankan      html  css  js  c++  java
  • 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时也会把这个字段之前的数据丢掉。
     
  • 相关阅读:
    django + dropzone.js 上传文件
    随机知识点---后续整理
    Python项目在Jenkins中的自动化测试实践(语法检查、单元测试,coverage(代码覆盖率)、自动打包)
    my read / zikao / nanjingdaxue
    OS + CentOS kernel parameter
    network / Wireshark
    使用docker部署springBoot并且yml配置文件不打包到jar中
    idea + springBoot项目配置远程调试
    MySql优化建议
    springBoot事务失效导致批量插入性能巨幅降低
  • 原文地址:https://www.cnblogs.com/limingluzhu/p/5535314.html
Copyright © 2011-2022 走看看