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 执行批量删除操作。请确保在实际使用中进行

相关推荐
一条闲鱼_mytube3 小时前
git自动压缩提交的脚本
大数据·git·elasticsearch
不能放弃治疗3 小时前
第 29 章 - ES 源码篇 - 网络 IO 模型及其实现概述
后端·elasticsearch
天空之外1365 小时前
Spring Boot Actuator、Spring Boot Actuator使用、Spring Boot Actuator 监控、Spring程序监控
java·spring boot·spring
B1nnnn丶5 小时前
通用导出任何对象列表数据的excel工具类
java·spring boot·excel
赛博末影猫5 小时前
SpringBoot(Ⅱ-2)——,SpringBoot版本控制,自动装配原理补充(源码),自动导包原理补充(源码),run方法
java·spring boot·后端
光岳楼观景6 小时前
Springboot -- JSON
spring boot·后端·json
百年bd6 小时前
AI对话机器人简单实现--智谱BigModel+SpringBoot+Vue2+ElementUI
spring boot·elementui·vue2·ai助手·智谱ai·ai对话机器人
楚疏笃7 小时前
ES 磁盘使用率检查及处理方法
大数据·elasticsearch·搜索引擎
光岳楼观景8 小时前
SpringBoot -- Docker Compose的支持
spring boot·docker·eureka
骑着王八撵玉兔9 小时前
【Spring Boot 】详解
java·数据库·spring boot·后端·spring·spring cloud