1

내 필드 매핑 :ElasticSearch : 오브젝트 필드의 기존 배열에 객체를 덧붙이

"Pincode": { 

    "analyzer": "standard", 
    "type": "string" 

}, 
    "Residence_address": { 

     "include_in_parent": true, 


      "type": "nested", 
      "properties": { 
       "address": { 
        "analyzer": "standard", 
        "type": "string" 
       }, 
       "Address_type": { 
        "analyzer": "standard", 
        "type": "string" 
       }, 
       "Pincode": { 
        "analyzer": "standard", 
        "type": "string" 
       } 
      } 

     } 

내가 가진 데이터 :

"Residence_address": [ 

     { 
      "address": "safadfsdf", 
      "Address_type": "Owned", 
      "Pincode": "50005756768674" 
     } 
     , 
     { 
      "address": "Collage of lkj", 
      "Address_type": "Rented", 
      "Pincode": "419005" 
     } 

    ], 
"Pincode": [ 

    "11" ,"12" 

] 

내가 삽입 할 때 PIN 코드 : 그 잘 작동

"Pincode": ["15"] 

. 정상 배열 필드 (객체 배열 아님)의 경우 추가가 올바르게 작동합니다.

하지만 같은 개체 삽입 할 때 : 나는이 코드를 사용하여 삽입하면

"Residence_address": [ 
        { 
        "address": "abbbbbb", 
        "Address_type": "bcccccc", 
        "Pincode": "67999999" 
        } 
       ] 

을 :

org.elasticsearch.index.mapper.MapperParsingException: object mapping [Residence_address] trying to serialize a value with no field associated with it, current value [{"address":"abbbbbb","Address_type":"bcccccc","Pincode":"67999999"}] 
    at org.elasticsearch.index.mapper.object.ObjectMapper.serializeValue(ObjectMapper.java:702) 
    at org.elasticsearch.index.mapper.object.ObjectMapper.parse(ObjectMapper.java:497) 
    at org.elasticsearch.index.mapper.object.ObjectMapper.serializeValue(ObjectMapper.java:706) 
    at org.elasticsearch.index.mapper.object.ObjectMapper.serializeNonDynamicArray(ObjectMapper.java:695) 
    at org.elasticsearch.index.mapper.object.ObjectMapper.serializeArray(ObjectMapper.java:604) 
    at org.elasticsearch.index.mapper.object.ObjectMapper.parse(ObjectMapper.java:489) 
    at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:544) 
    at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:493) 
    at org.elasticsearch.index.shard.IndexShard.prepareIndex(IndexShard.java:493) 
    at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:192) 
    at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$PrimaryPhase.performOnPrimary(TransportShardReplicationOperationAction.java:574) 
    at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$PrimaryPhase.routeRequestOrPerformLocally(TransportShardReplicationOperationAction.java:444) 
    at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$PrimaryPhase.doRun(TransportShardReplicationOperationAction.java:370) 
    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:36) 
    at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction.doExecute(TransportShardReplicationOperationAction.java:112) 
    at org.elasticsearch.action.index.TransportIndexAction.innerExecute(TransportIndexAction.java:136) 
    at org.elasticsearch.action.index.TransportIndexAction.doExecute(TransportIndexAction.java:114) 
    at org.elasticsearch.action.index.TransportIndexAction.doExecute(TransportIndexAction.java:63) 
    at org.elasticsearch.action.support.TransportAction.execute(TransportAction.java:75) 
    at org.elasticsearch.action.update.TransportUpdateAction.shardOperation(TransportUpdateAction.java:217) 
    at org.elasticsearch.action.update.TransportUpdateAction.shardOperation(TransportUpdateAction.java:170) 
    at org.elasticsearch.action.support.single.instance.TransportInstanceSingleOperationAction$AsyncSingleAction$1.run(TransportInstanceSingleOperationAction.java:187) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

도움하십시오 : 그것은 나에게 오류를 제공

 updateRequest.script("ctx._source.Residence_address += ADD"); 
      JSONArray Address = (JSONArray) temp.get("Residence_address");    
      i = 0; 
      while(i < Address.size()){ 
        System.out.println(Address.get(i).toString()); 
        updateRequest.addScriptParam("ADD", Address.get(i++).toString()); 
       } 

.

답변

2

Address에 여러 개의 주소가있는 경우 동일한 매개 변수 이름이 ADD 인 많은 매개 변수를 추가하면 작동하지 않습니다. ,

ctx._source.Residence_address += [ ADD0, ADD1, ADD2 ] 

그리고 당신은 세 가지 스크립트 매개 변수가 ADD0이라는 것입니다 : 당신이 3 개 주소가있는 경우

 String newAddrs = ""; 
     JSONArray Address = (JSONArray) temp.get("Residence_address");    
     int i = 0; 
     while(i < Address.size()){ 
       newAddrs += "ADD" + i + (i < Address.size() - 1 ? "," : ""); 
       updateRequest.addScriptParam("ADD"+i, Address.get(i++)); 
     } 
     updateRequest.script("ctx._source.Residence_address += ["+newAddrs+"]"); 

그래서, 당신과 같은 스크립트로 끝날 것

이 대신 시도 ADD1, ADD2

+0

감사합니다. @val. 나는 노력했다. 그러나 그것은 나에게 같은 오류를 준다. – Bond

+0

스크립트 매개 변수를 추가 할 때'toString()'호출을 제거 할 수 있습니까? – Val

+0

부분적으로 작동합니다. 두 개체를 추가하려고합니다. 하지만 마지막 객체 만 추가 할 수 있습니다. – Bond