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" 字段值为 "张三" 的文档。
- 然后点击 "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。然后使用RestHighLevelClient
的delete
方法执行删除请求,并通过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
执行批量删除操作。请确保在实际使用中进行