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时也会把这个字段之前的数据丢掉。
 

转载于:https://www.cnblogs.com/limingluzhu/p/5535314.html

root@f1ef6bb4588a:/opt/solr# ps aux | grep java root 6700 0.0 0.0 12820 2048 pts/1 S+ 03:26 0:00 grep java root@f1ef6bb4588a:/opt/solr# ps aux | grep java root 6700 0.0 0.0 12820 2048 pts/1 S+ 03:26 0:00 grep java root@f1ef6bb4588a:/opt/solr# root@f1ef6bb4588a:/opt/solr# grep -R "SOLR_HOST" /opt/solr/ /opt/solr/CHANGES.txt: }' http://$SOLR_HOST:$SOLR_PORT/api/cluster /opt/solr/CHANGES.txt: }' http://$SOLR_HOST:$SOLR_PORT/api/cluster /opt/solr/CHANGES.txt:* SOLR-7545: Honour SOLR_HOST parameter with bin/solr{,.cmd} /opt/solr/bin/solr:if [ "$SOLR_HOST" != "" ]; then /opt/solr/bin/solr: SOLR_TOOL_HOST="$SOLR_HOST" /opt/solr/bin/solr: echo " Can be run on remote (non-Solr) hosts, as long as a valid SOLR_HOST is provided in solr.in.sh" /opt/solr/bin/solr: echo "Can be run from remote (non-Solr) hosts, as long as a valid SOLR_HOST is provided in solr.in.sh" /opt/solr/bin/solr: SOLR_HOST="$2" /opt/solr/bin/solr: PASS_TO_RUN_EXAMPLE+=" -h $SOLR_HOST" /opt/solr/bin/solr:if [ "$SOLR_HOST" != "" ]; then /opt/solr/bin/solr: SOLR_HOST_ARG=("-Dhost=$SOLR_HOST") /opt/solr/bin/solr: SOLR_HOST_ARG=() /opt/solr/bin/solr: if [ "$SOLR_HOST" != "" ]; then /opt/solr/bin/solr: REMOTE_JMX_OPTS+=("-Djava.rmi.server.hostname=$SOLR_HOST") /opt/solr/bin/solr: echo -e " SOLR_HOST = $SOLR_HOST" /opt/solr/bin/solr: "${SOLR_HOST_ARG[@]}" "-Duser.timezone=$SOLR_TIMEZONE" "-XX:-OmitStackTraceInFastThrow" \ /opt/solr/bin/solr.cmd:IF NOT "%SOLR_HOST%"=="" ( /opt/solr/bin/solr.cmd: set "SOLR_TOOL_HOST=%SOLR_HOST%" /opt/solr/bin/solr.cmd:echo Can be run on remote (non-Solr^) hosts, as long as a valid SOLR_HOST is provided in solr.in.cmd /opt/solr/bin/solr.cmd:echo Can be run from remote (non-Solr^) hosts, as long as a valid SOLR_HOST is provided in solr.in.cmd. /opt/solr/bin/solr.cmd:set SOLR_HOST=%~2 /opt/solr/bin/solr.cmd:IF NOT "%SOLR_HOST%"=="" ( /opt/solr/bin/solr.cmd: set SOLR_HOST_ARG=-Dhost=%SOLR_HOST% /opt/solr/bin/solr.cmd: set SOLR_HOST_ARG= /opt/solr/bin/solr.cmd: IF NOT "%SOLR_HOST%"=="" set REMOTE_JMX_OPTS=%REMOTE_JMX_OPTS% -Djava.rmi.server.hostname=%SOLR_HOST% /opt/solr/bin/solr.cmd: @echo SOLR_HOST = %SOLR_HOST% /opt/solr/bin/solr.cmd:IF NOT "%SOLR_HOST_ARG%"=="" set "START_OPTS=%START_OPTS% %SOLR_HOST_ARG%" /opt/solr/bin/solr.in.cmd:REM set SOLR_HOST=192.168.1.1 /opt/solr/bin/solr.in.sh:#SOLR_HOST="192.168.1.1" root@f1ef6bb4588a:/opt/solr# grep -R "8983" /opt/solr/server/etc/*.xml /opt/solr/server/etc/jetty-http.xml: <Set name="port"><Property name="jetty.port" default="8983" /></Set> /opt/solr/server/etc/jetty-https.xml: <Set name="port"><Property name="solr.jetty.https.port" default="8983" /></Set> /opt/solr/server/etc/jetty-https8.xml: <Set name="port"><Property name="solr.jetty.https.port" default="8983" /></Set> root@f1ef6bb4588a:/opt/solr# tail -n 100 /opt/solr/server/logs/solr-8983-console.log OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory (errno = 12). OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory (errno = 12). OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory (errno = 12). OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory (errno = 12). library initialization failed - unable to allocate file descriptor table - out of memoryroot@f1ef6bb4588a:/opt/solr#
最新发布
03-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值