0

내 봄 부팅 프로젝트에 봄 데이터 Elasticsearch API를 사용하고 있는데 나는 다음과 같은 DeviceVO 클래스가 : 나는 부분적으로 DeviceTag에 태그를 추가/제거에서이 문서를 업데이트해야Elasticsearch 부분 업데이트를 수집

@Document(indexName = "devices", type = "device") 
@Data 
@NoArgsConstructor 
@AllArgsConstructor 
@Builder 
public class DeviceVO { 

    @Id 
    private String id; 

    @Field(type = FieldType.text) 
    private String name; 

    //other fields 

    @Field(type = FieldType.Nested) 
    private Set<DeviceTagVO> deviceTags; 

    private LocalDateTime createdOn; 
} 

을 세트.

은 내가 속성을 업데이트하기 위해 다음과 같은 사용자를 할 수 있습니다 알고

 IndexRequest indexRequest = new IndexRequest(); 
     indexRequest.source("name", newName); 
     UpdateQuery updateQuery = new UpdateQueryBuilder().withId(DeviceVO.getId()).withClass(DeviceVO.class).withIndexRequest(indexRequest).build(); 
     elasticsearchTemplate.update(updateQuery); 
내가 업데이트 쿼리를 사용하여 설정 항목을 제거 추가 할 수있는 방법

?

private void updateSearchIndexRemoveDeviceTag(DeviceVO deviceVO, DeviceTagVO tag) { 


     String scriptTagId = "{\n" + 
       " \"script\": {\n" + 
       " \"lang\": \"painless\",\n" + 
       " \"inline\": \"(ctx._source.deviceTagIds = ctx._source.deviceTagIds ?: []).remove(ctx._source.deviceTagIds.indexOf(params.tags))\",\n" + //check if device tags is null 
       " \"params\": {\n" + 
       "  \"tags\": \"" + tag.getId() + "\"\n" + 
       " }\n" + 
       " }\n" + 
       "}"; 

     try { 
      client.execute(new Update.Builder(scriptTagId).index("devices").type("device").id(deviceVO.getId()).build()); 

     } catch (IOException e) { 
      throw new ElasticSearchException("error.updating.device.index", "remove device tag from index"); 
     } 
    } 
(봄에 사용) 농담 아직이 기능을 지원하지 않기 때문에, 우리는 업데이트 쿼리 내 인라인 스크립트를 사용

답변