SpringBoot+Elasticsearch使用resthighlevelclient对象删除指定的文档数据

SpringBoot+Elasticsearch使用resthighlevelclient对象删除指定的文档数据

使用客户端删除

在 Kibana 中,你可以使用 Dev Tools 或者 Console 来执行 Elasticsearch 查询和删除操作。

​ 以下是一个使用 Dev Tools 执行删除文档的示例:

​ 1.打开 Kibana,转到左侧导航栏的 "Dev Tools" 或者 "Console"。

​ 2.在 Dev Tools 或者 Console 中输入如下删除请求:

json 复制代码
POST /your_index/_delete_by_query
{
  "query": {
    "term": {
      "name.keyword": "张三"
    }
  }
}

请替换 /your_index/ 为你实际的索引名称。这个请求会删除索引中所有 "name" 字段值为 "张三" 的文档。

  1. 然后点击 "Run" 或者使用快捷键执行该请求。

请注意,name.keyword 是默认情况下使用的字符串字段的名称,确保在你的映射中使用了正确的字段名称。如果你的 "name" 字段不是关键字类型(keyword),你可能需要调整查询条件。

确保在执行删除操作之前做好备份,并谨慎操作,因为删除操作是不可逆的。


1、第一种

在Spring Boot中使用RestHighLevelClient删除Elasticsearch中的文档数据,你可以通过以下方式实现:

java 复制代码
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;

@Service
public class ElasticsearchService {

    @Autowired
    private RestHighLevelClient elasticsearchClient;

    public void deleteDocumentByName(String name, String indexName, String typeName) throws IOException {
        // 构建DeleteRequest
        DeleteRequest deleteRequest = new DeleteRequest(indexName, typeName, name);

        // 可以设置其他参数,如路由、超时等
        // deleteRequest.routing("your-routing");
        // deleteRequest.timeout("10s");

        // 执行删除请求
        DeleteResponse deleteResponse = elasticsearchClient.delete(deleteRequest, RequestOptions.DEFAULT);

        // 处理删除响应
        String index = deleteResponse.getIndex();
        String id = deleteResponse.getId();
        long version = deleteResponse.getVersion();
        System.out.println("Deleted document with id " + id + " from index " + index + " with version " + version);
    }
}

在上面的代码中,首先构建了一个DeleteRequest对象,指定了要删除的文档的索引、类型(如果有)、文档ID。然后使用RestHighLevelClientdelete方法执行删除请求,并通过DeleteResponse获取删除的结果。

请注意,Elasticsearch 7.x 版本已经移除了类型(type)的概念,因此在新的索引中,typeName参数可能是可选的,具体取决于你的Elasticsearch版本和索引的映射设置。如果你的索引中没有使用类型,可以将typeName设置为null或者省略。


2、第二种在 Elasticsearch 7.x 以前

如果你的Elasticsearch索引中有一个字段名为 "name",并且你想要删除该字段值为 "张三" 的文档,可以使用 Elasticsearch 的 Query DSL 来构建一个删除请求。以下是一个示例代码,演示如何使用 RestHighLevelClient 来删除具有特定 "name" 值的文档:

java 复制代码
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;

@Service
public class ElasticsearchService {

    @Autowired
    private RestHighLevelClient elasticsearchClient;

    public void deleteDocumentByName(String name, String indexName) throws IOException {
        // 构建查询请求,查找具有特定 name 值的文档
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.termQuery("name", name));

        SearchRequest searchRequest = new SearchRequest(indexName);
        searchRequest.source(searchSourceBuilder);

        // 执行查询请求
        SearchResponse searchResponse = elasticsearchClient.search(searchRequest, RequestOptions.DEFAULT);

        // 遍历查询结果,获取文档 ID 并删除文档
        for (var hit : searchResponse.getHits().getHits()) {
            String documentId = hit.getId();
            deleteDocumentById(indexName, documentId);
        }
    }

    private void deleteDocumentById(String indexName, String documentId) throws IOException {
        // 构建删除请求
        DeleteRequest deleteRequest = new DeleteRequest(indexName, documentId);

        // 执行删除请求
        DeleteResponse deleteResponse = elasticsearchClient.delete(deleteRequest, RequestOptions.DEFAULT);

        // 处理删除响应
        String index = deleteResponse.getIndex();
        String id = deleteResponse.getId();
        long version = deleteResponse.getVersion();
        System.out.println("Deleted document with id " + id + " from index " + index + " with version " + version);
    }
}

上面的代码首先构建一个搜索请求,使用 QueryBuilders.termQuery 来匹配具有特定 "name" 值的文档。然后,遍历搜索结果,获取文档的 ID,并使用 deleteDocumentById 方法删除相应的文档。请确保在实际使用中进行适当的错误处理和资源管理。


3、第三种在 Elasticsearch 7.x 中

在 Elasticsearch 7.x 中,不再支持直接删除文档时使用 SearchRequest 查询文档然后删除的方式,而是直接使用 DeleteByQueryRequest 来执行删除操作。以下是一个正确的示例代码:

java 复制代码
import org.elasticsearch.action.delete.DeleteByQueryRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;

@Service
public class ElasticsearchService {

    @Autowired
    private RestHighLevelClient elasticsearchClient;

    public void deleteDocumentByName(String name, String indexName) throws IOException {
        // 构建删除请求,删除具有特定 name 值的文档
        DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(indexName);
        deleteByQueryRequest.setQuery(QueryBuilders.termQuery("name", name));

        // 执行删除请求
        elasticsearchClient.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);

        System.out.println("Deleted documents with name " + name + " from index " + indexName);
    }
}

在这个示例中,使用了 DeleteByQueryRequest 来构建删除请求,并通过 QueryBuilders.termQuery 指定要删除的文档的条件(在这里是 "name" 字段等于 "张三")。然后,通过 elasticsearchClient.deleteByQuery 执行删除操作。请确保在实际使用中进行适当的错误处理和资源管理。


4、批量删除

要批量删除 Elasticsearch 中符合特定条件的文档,你可以使用 DeleteByQueryRequest。以下是一个示例代码,演示如何使用 RestHighLevelClient 批量删除具有特定 "name" 值的文档:

java 复制代码
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;

@Service
public class ElasticsearchService {

    @Autowired
    private RestHighLevelClient elasticsearchClient;

    public void deleteDocumentsByName(String name, String indexName) throws IOException {
        // 构建批量删除请求
        BulkRequest bulkRequest = new BulkRequest();

        // 构建查询请求,查找具有特定 name 值的文档
        bulkRequest.add(new DeleteByQueryRequest(indexName)
                .setQuery(QueryBuilders.termQuery("name", name)));

        // 执行批量删除请求
        elasticsearchClient.bulk(bulkRequest, RequestOptions.DEFAULT);

        System.out.println("Deleted documents with name " + name + " from index " + indexName);
    }
}

在这个示例中,使用了 BulkRequest 来批量构建删除请求。对于每个删除请求,使用 DeleteByQueryRequest 来指定要删除的文档的条件(在这里是 "name" 字段等于 "张三")。然后,通过 elasticsearchClient.bulk 执行批量删除操作。请确保在实际使用中进行

相关推荐
techzhi4 分钟前
SeaweedFS S3 Spring Boot Starter
java·spring boot·后端
酷爱码7 分钟前
Spring Boot 整合 Apache Flink 的详细过程
spring boot·flink·apache
cacyiol_Z44 分钟前
在SpringBoot中使用AWS SDK实现邮箱验证码服务
java·spring boot·spring
weixin_438335404 小时前
Spring Boot实现接口时间戳鉴权
java·spring boot·后端
风象南6 小时前
SpringBoot的4种死信队列处理方式
java·spring boot·后端
coderSong256812 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
Mr_Air_Boy13 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
懒虫虫~15 小时前
基于SpringBoot解决RabbitMQ消息丢失问题
spring boot·rabbitmq
java干货16 小时前
深度解析:Spring Boot 配置加载顺序、优先级与 bootstrap 上下文
前端·spring boot·bootstrap
sclibingqing17 小时前
SpringBoot项目接口集中测试方法及实现
java·spring boot·后端