168Elasticsearch 基础入门--开发elasticsearch删除数据篇

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。

image.png

这里一共有 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 中的重新连接

image.png

我们看到已经删除 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文件。
查看运行结果

image.png

我们可以看到 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文件。
查看运行结果

image.png

可以看到 id 为 2,3 的数据已经被删除掉了。
对比总结:可以看到第二种方式比较灵活,实际项目我们一般都是第二种删除方法,删除数据由 list 指定比较随意。

你可能感兴趣的:(168Elasticsearch 基础入门--开发elasticsearch删除数据篇)