elasticsearch 删除的底层逻辑
elasticsearch 删除在内部,删除文档的语法模式与之前基本一致,只不过要使用 DELETE 方法:DELETE /user/info/1 如果文档被找到,Elasticsearch 将返回 200 OK 状态码和以下响应体。注意_version 数字已经增加了。删除一个文档也不会立即从磁盘上移除,它只是被标记成已删除。Elasticsearch 将会在你之后添加更多索引的时候才会在后台进行删除内容的清理。
有时候我们删除的内容非常多,达到索引的 80% 上时,会考虑索引重建即 reindex,这时直接删除 index 是非常快的,类似于删除表的操作。
elasticsearch 删除单条数据
下面通过代码的方式演示删除单条数据的方式,并且结合 head 查看删除后的结果。
查看删除前的数据
1.确保 es 服务已经启动。 2.打开浏览器访问http://127.0.0.1:9200/_plugin/head 查看我们之前创建的 userInfo。
这里一共有 3 条数据内容。
创建 DeleteData 类
在com.syl.es下创建 DeleteData 类,并编写单条数据删除函数。
package com.syl.es;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
public class DeleteData {
public static void main(String args[]){
deleteEs();
}
/**
* 删除索引数据
*/
public static void deleteEs(){
//索引服务的地址
String elasticServer= "127.0.0.1";
//索引服务的端口
Integer elasticServerPort = 9300;
Client client=null;
try{
//初始化连接
Settings settings = Settings.settingsBuilder().build();
client = TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName(elasticServer), elasticServerPort));
//删除为1的索引数据
client.prepareDelete("user","userInfo","1").execute().actionGet();
//关闭连接
client.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
以 Java Application 的方式,运行DeleteData.java文件。
查看执行结果
注意:刷新下浏览器或点击下 head 中的重新连接
我们看到已经删除 id 为 1 的数据了。
jelasticsearch 删除多条数据
下面通过代码的方式演示删除多条数据的方式,并且结合 head 查看删除后的结果。关于批量删除多条数据,我们有 2 种方法可行。下面我们比较以下两种方法的不同。
批量删除方法 1:deleteEsBulk
在DeleteData.java中编写 deleteEsBulk 方法
/**
* 批量删除索引数据
*/
public static void deleteEsBulk(){
//索引服务的地址
String elasticServer= "127.0.0.1";
//索引服务的端口
Integer elasticServerPort = 9300;
Client client=null;
try{
//初始化连接
Settings settings = Settings.settingsBuilder().build();
client = TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName(elasticServer), elasticServerPort));
BulkRequestBuilder bulkRequest = client.prepareBulk();
//设置删除的索引的数据id
bulkRequest.add(client.prepareDelete("user", "userInfo", "2") );
bulkRequest.add(client.prepareDelete("user", "userInfo", "3") );
BulkResponse bulkResponse = bulkRequest.get();
//判断执行是否成功
if(bulkResponse.hasFailures()){
System.out.println("bulk error:"+bulkResponse.buildFailureMessage());
}
bulkRequest.get();
//关闭连接
client.close();
}catch (Exception e) {
e.printStackTrace();
}
}
修改主函数,调用删除索引函数
注释掉 deleteEs 的调用,增加调用 deleteEsBulk。
public class DeleteData {
public static void main(String args[]){
//deleteEs();
deleteEsBulk();
}
以 Java Application 的方式,运行DeleteData.java文件。
查看运行结果
我们可以看到 id 为 2,3 的数据已经被删除掉了。
批量删除方法 2:deleteEsBulkList `
补充说明:因为上面执行成功后将会删除数据,所以需要重新执行 AddData 类,请大家自行执行以下。
在DeleteData.java中编写 deleteEsBulkList 方法
/**
* 批量删除索引数据
*/
public static void deleteEsBulkList(){
//索引服务的地址
String elasticServer= "127.0.0.1";
//索引服务的端口
Integer elasticServerPort = 9300;
Client client=null;
try{
//初始化连接
Settings settings = Settings.settingsBuilder().build();
client = TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName(elasticServer), elasticServerPort));
BulkRequestBuilder bulkRequest = client.prepareBulk();
//删除数据的id
List dataList= new ArrayList();
dataList.add("2");
dataList.add("3");
//执行删除
for(int i=0;i
修改主函数,调用删除索引函数
注释掉 deleteEsBulk 的调用,增加调用 deleteEsBulkList。
public class DeleteData {
public static void main(String args[]){
//删除索引
//deleteEs();
//批量删除索引1
//deleteEsBulk();
//批量删除索引2
deleteEsBulkList();
}
以 Java Application 的方式,运行DeleteData.java文件。
查看运行结果
可以看到 id 为 2,3 的数据已经被删除掉了。
对比总结:可以看到第二种方式比较灵活,实际项目我们一般都是第二种删除方法,删除数据由 list 指定比较随意。