ElasticSearch Java Api-5.x删除和更新索引数据

版本背景:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>5.4.1</version>
</dependency>

 

首先获取es的连接:

        

 / /设置集群名称  
     private static final   Settings settings = Settings.builder().put("cluster.name", "my-application").build();// 集群名  

        //创建client  

     private static final      client  = new PreBuiltTransportClient(settings)  

                          .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));  

 

 

     创建索引并建立映射

public String create(Map<String, Object> map) {
        
        
                IndexResponse response = client  
                        .prepareIndex("index", "type", "主键id")  
                        .setSource(
                                XContentFactory.jsonBuilder().startObject()  
                                    .field("业务字段1", "业务字段1的值")  
                                    .field("业务字段2", "业务字段2的值")  
                                .endObject()).execute()  
                        .actionGet(); 
           
        }
        
        return "success";
    }

  删除,根据主键id

public String deleteESInfo(Map<String, Object> map) {
        
                     DeleteResponse deleteresponse =client.prepareDelete( "index", "type",  "主键id")  
                                .execute()  
                                .actionGet();  
                     result=deleteresponse.getResult().toString();
                 
                
             
        return result;
    }

但是这个只是根据主键删除,如果根据条件查询去删除那?之前在 2.X版本里 这个Delete By Query功能被去掉了 因为官方认为会引发一些错误 如需使用 需要自己安装delete-by-query插件。5.0版本以上,又选择回归。来条件删除

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();  
        queryBuilder.must(QueryBuilders.termQuery("业务字段1", "业务字段1的值"));    
          
        BulkByScrollResponse response =  
                DeleteByQueryAction.INSTANCE.newRequestBuilder(client)  
                    .filter(queryBuilder)   
                    .source("index")                                    
                    .get();                                               
          
        long deleted = response.getDeleted(); 

然后就是根据主键去更新es信息,其中,没有出现在field里面去更新的,不覆盖原有值。

UpdateResponse  response = ElasticsearchConfig.client.prepareUpdate("index", "type", "主键id")
            .setDoc(XContentFactory.jsonBuilder() 
                    .startObject()
                    .field("业务字段1", "2")
                    .field("业务字段2", "1")  
                    .endObject()).execute()  
            .actionGet();

 

转载于:https://www.cnblogs.com/huch/p/9121575.html

要使用 Elasticsearch Java API 对百万数据索引进行重命名,并进行性能优化,可以尝试以下方法: 1. 使用 Elasticsearch Java API 执行批量操作。与 Bulk API 类似,使用 Elasticsearch Java API 也可以一次性处理多个文档的重命名操作,从而提高索引重命名的性能。例如: ``` BulkRequest bulkRequest = new BulkRequest(); bulkRequest.add(new UpdateRequest("my_index", "_doc", "1").doc(jsonBuilder().startObject().field("name", "new_name").endObject())); bulkRequest.add(new UpdateRequest("my_index", "_doc", "2").doc(jsonBuilder().startObject().field("name", "new_name").endObject())); ... BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT); ``` 这将在一次 API 调用中更新多个文档的名称,而不是逐个更新。 2. 在执行重命名操作之前,可以考虑关闭索引刷新机制。通过将 RefreshInterval 设置为 -1,可以关闭索引刷新机制。例如: ``` UpdateSettingsRequest request = new UpdateSettingsRequest("my_index"); Settings settings = Settings.builder().put("index.refresh_interval", "-1").build(); request.settings(settings); client.indices().putSettings(request, RequestOptions.DEFAULT); ``` 这将关闭索引刷新机制。在执行完索引重命名操作后,可以将 RefreshInterval 设置为 1s,以重新启用刷新机制。例如: ``` UpdateSettingsRequest request = new UpdateSettingsRequest("my_index"); Settings settings = Settings.builder().put("index.refresh_interval", "1s").build(); request.settings(settings); client.indices().putSettings(request, RequestOptions.DEFAULT); ``` 这将每秒钟执行一次索引刷新操作。请注意,关闭刷新机制可能会导致某些查询结果不准确,因为查询可能会返回尚未刷新数据。 3. 在执行重命名操作时,使用异步操作可以提高性能。可以使用 Elasticsearch Java API 提供的异步操作实现。例如: ``` BulkRequest bulkRequest = new BulkRequest(); bulkRequest.add(new UpdateRequest("my_index", "_doc", "1").doc(jsonBuilder().startObject().field("name", "new_name").endObject())); bulkRequest.add(new UpdateRequest("my_index", "_doc", "2").doc(jsonBuilder().startObject().field("name", "new_name").endObject())); ... ActionListener<BulkResponse> listener = new ActionListener<BulkResponse>() { @Override public void onResponse(BulkResponse bulkResponse) { // 执行成功的回调 } @Override public void onFailure(Exception e) { // 执行失败的回调 } }; client.bulkAsync(bulkRequest, RequestOptions.DEFAULT, listener); ``` 这将使用异步方式执行批量操作,从而提高性能。 通过以上方法,可以对百万数据Elasticsearch 索引进行重命名,并进行性能优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值