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

发布时间:2024年01月08日

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

使用客户端删除

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

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

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

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

POST /your_index/_delete_by_query
{
  "query": {
    "term": {
      "name.keyword": "张三"
    }
  }
}

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

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

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

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


1、第一种

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

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” 值的文档:

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 来执行删除操作。以下是一个正确的示例代码:

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” 值的文档:

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

文章来源:https://blog.csdn.net/qq_45525848/article/details/135465796
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。