ElasticSearch 7.13.1 java中的增删改查

前言:
现在大部分博客或者csdn都是老版本的其中很多特性都收到改变,通过一下午的spring官网的钻研,终于通关了es7.13.1的代码实现,闲话不多说

pom文件

   <dependency>
  <groupId>org.elasticsearch.client</groupId>
  <artifactId>elasticsearch-rest-high-level-client</artifactId>
  <version>7.13.1</version>
</dependency>


<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.13.1</version>
</dependency>

<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.13.1</version>
</dependency>

config类


import org.apache.http.HttpHost;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GulimallEsSearchConfig {
    public static final RequestOptions COMMON_OPTIONS;

    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        COMMON_OPTIONS = builder.build();
    }

    /**
     * 方式一:无账号密码连接方式
     * new HttpHost("localhost", 9200, "http")));
     * //集群配置法
     * new HttpHost("localhost", 9201, "http")));
     **/
    @Bean
    public static RestHighLevelClient esRestClient() {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        //集群配置法
                        new HttpHost("localhost", 9200, "http")));
        return client;
    }
    /**
     *方式二 使用账号密码连接
     *
     @Bean public RestHighLevelClient esRestClient(){
     RestClientBuilder builder = RestClient.builder(
     new HttpHost("21.145.229.153",9200,"http"),
     new HttpHost("21.145.229.253",9200,"http"),
     new HttpHost("21.145.229.353",9200,"http"));
     CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
     credentialsProvider .setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("elastic","1qaz!QAZ"));
     builder.setHttpClientConfigCallback(f->f.setDefaultCredentialsProvider(credentialsProvider ));
     RestHighLevelClient restClient = new RestHighLevelClient (builder);
     return restClient;
     }*/
}

代码实现


import org.apache.commons.lang.StringUtils;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;

import java.io.IOException;
import java.util.*;

/**
 * //增, source 里对象创建方式可以是JSON字符串,或者Map,或者XContentBuilder 对象
 * IndexRequest indexRequest = new IndexRequest("index","ID").source(builder);
 * highLevelClient.index(indexRequest);
 * //删
 * DeleteRequest deleteRequest = new DeleteRequest("index", "ID");
 * highLevelClient.delete(deleteRequest);
 * //改, source 里对象创建方式可以是JSON字符串,或者Map,或者XContentBuilder 对象
 * UpdateRequest updateRequest = new UpdateRequest("index","ID").doc(builder);
 * highLevelClient.update(updateRequest);
 * //查
 * GetRequest getRequest = new GetRequest("index","ID");
 * highLevelClient.get(getRequest);
 */
public class EmployeeCRUDApp {
    public static void main(String[] args) {
        RestHighLevelClient restHighLevelClient = GulimallEsSearchConfig.esRestClient();
    // add(restHighLevelClient);
      // bathAdd(restHighLevelClient);
     //   updateById(restHighLevelClient);
        deleteById(restHighLevelClient);
    }
//创建索引,并新增了一条:
    private static void add(RestHighLevelClient restHighLevelClient) {

        IndexRequest request = new IndexRequest("es_user", "user_type");
        Map<String, Object> jsonMap = new HashMap<>();
        jsonMap.put("user_name", "黄");
        jsonMap.put("post_date", new Date());
        jsonMap.put("age", 18);
        jsonMap.put("gender", "男");
        jsonMap.put("height", 180);
        jsonMap.put("address", "北京");
        request.source(jsonMap);
        IndexResponse response = null;
        try {
            response = restHighLevelClient.index(request, GulimallEsSearchConfig.COMMON_OPTIONS);
            if (response.getResult().name().equalsIgnoreCase("created")) {
                System.out.println("创建成功!");
            } else {
                System.out.println("失败!");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
//批量插入数据:
    private static void bathAdd(RestHighLevelClient restHighLevelClient) {
        /**
         * 造点假数据
         */
        List<Map<String, Object>> list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            Map<String, Object> map = new HashMap<>();
            map.put("address", "北京市昌平" + 12 + i + "号");
            map.put("gender", "男");
            map.put("user_name", "黄_" + i);
            map.put("post_date", new Date());
            map.put("age", 23 + i);
            map.put("height", 155 + i);
            list.add(map);
        }
        /**
         * 批量从插入数据
         */
        BulkRequest request = new BulkRequest();
        for (int j = 0; j < list.size(); j++) {
            Map<String, Object> item = list.get(j);
            request.add(new IndexRequest("es_user").
                    source(item));
        }
        try {
            BulkResponse bulk = restHighLevelClient.bulk(request, GulimallEsSearchConfig.COMMON_OPTIONS);
            if (bulk.status().getStatus() == 200) {
                System.out.println("批量操作成功!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private static void query(RestHighLevelClient restHighLevelClient) {

        Integer start = 1;
        Integer limit = 0;
        String keyWord = "";
        Integer minBalance = 0;
        Integer maxBalance = 0;
        String address = "";
        String city = "";
        String firstname = "";
        String employer = "";
        //1.创建请求
        SearchRequest request = new SearchRequest();
        //这里是7.4.2不需要指定type了,8以后就没有type了
        request.indices("es_user", "user_type");
        //2、创建请求参数
        SearchSourceBuilder ssb = new SearchSourceBuilder();
        //分页并排序(第一页是从0开始的,所以上面的start-1)
        ssb.from(start).size(limit).sort("balance", SortOrder.DESC);
        //指定返回字段
        ssb.fetchSource(new String[]{"account_number", "balance", "firstname", "lastname", "age", "gender", "address", "employer", "email", "city", "state"}, new String[]{});
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        /**
         * //QueryBuilders.matchQuery()表示模糊查询----用来做keyWord的搜索
         * //QueryBuilders.termQuery()表示精确查询
         /**
         * 精确匹配:要采用 字段.keyword 才匹配得到,直接匹配那么匹配不到。原因:
         * elasticsearch 里默认的IK分词器是会将每一个中文都进行了分词的切割,所以你直接想查一整个词,或者一整句话是无返回结果的
         *
         */
        //精确匹配
        if (!StringUtils.isBlank(address)) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("address.keyword", address));
        }
        if (!StringUtils.isBlank(city)) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("city.keyword", city));
        }
        if (!StringUtils.isBlank(employer)) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("employer.keyword", employer));
        }
        //模糊匹配
        if (!StringUtils.isBlank(firstname)) {
            boolQueryBuilder.filter(QueryBuilders.matchQuery("firstname", firstname));
        }
        if (!StringUtils.isBlank(keyWord)) {
            //多字段模糊匹配,这里是should是或者的意思
            boolQueryBuilder.filter(QueryBuilders.multiMatchQuery(keyWord, "lastname", "email", "employer"));
        }

        if (minBalance != null && maxBalance != null) {
            //范围查找(只针对数值,不能针对字符串)
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("balance").gte(minBalance).lte(maxBalance));
        }
        ssb.query(boolQueryBuilder);
        System.out.println("获取到的请求参数:" + ssb);
        request.source(ssb);
        Map<String, Object> map = new HashMap<>();
        List<Map<String, Object>> list = new ArrayList<>();
        SearchResponse response = null;
        RestStatus status = null;
        try {
            response = restHighLevelClient.search(request, GulimallEsSearchConfig.COMMON_OPTIONS);
            status = response.status();
            map.put("status", status);
            long totalHits = response.getHits().getTotalHits().value;
            Integer totalPage = (int) Math.ceil((double) totalHits / limit);
            map.put("currPage", start);
            map.put("pageSize ", limit);
            map.put("totalPage", totalPage);
            map.put("totalCount ", totalHits);
            SearchHit[] searchHits = response.getHits().getHits();
            for (SearchHit hit : searchHits) {
                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                String index = hit.getIndex();
                list.add(sourceAsMap);
            }
            map.put("list", list);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("失败");
        }
        System.out.println("查询成功:" + map.toString());
    }

//查询多个id的数据
    private static void seleBathId(RestHighLevelClient restHighLevelClient) {
        SearchRequest request = new SearchRequest();
        request.indices("eslog");
        SearchSourceBuilder builder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        //addIds后面是多个id
        boolQueryBuilder.filter(QueryBuilders.idsQuery().addIds("oI9GVHQBH0SEUrtlhvX7", "oY9HVHQBH0SEUrtlaPUO", "3Fz9aHQBxI7zG-AK_rLc"));
        builder.query(boolQueryBuilder);
        request.source(builder);
        List<Map<String, Object>> list = new ArrayList<>();
        Map<String, Object> map = new HashMap<>();
        try {
            SearchResponse response = restHighLevelClient.search(request, GulimallEsSearchConfig.COMMON_OPTIONS);
            SearchHit[] searchHits = response.getHits().getHits();
            for (SearchHit hit : searchHits) {
                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                list.add(sourceAsMap);
            }
            map.put("data", list);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    //根据id修改数据:
    private static  void updateById(RestHighLevelClient restHighLevelClient){
        Map<String, Object> map = new HashMap<>();
        map.put("id", "TTuoTHoBOK-qS7Z1MnFq");
        map.put("address", "北京市昌平" + 10082 + "号");
        map.put("gender", "nv");
        map.put("user_name", "测试修改");
        map.put("post_date", new Date());
        map.put("age", 23);
        map.put("height", 168);

        UpdateRequest request = new UpdateRequest("es_user","user_type",map.get("id").toString()).doc(map);

        try {
            UpdateResponse update = restHighLevelClient.update(request, GulimallEsSearchConfig.COMMON_OPTIONS);
            if(update.status().getStatus() == 200){
                System.out.println("修改成功");
            }else {
                System.out.println("修改失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private static  void deleteById(RestHighLevelClient restHighLevelClient){
        Map<String, Object> map = new HashMap<>();
        map.put("id", "TTuoTHoBOK-qS7Z1MnFq");

        DeleteRequest request = new DeleteRequest("es_user","user_type",map.get("id").toString());
        try {
            DeleteResponse update = restHighLevelClient.delete(request, GulimallEsSearchConfig.COMMON_OPTIONS);
            if(update.status().getStatus() == 200){
                System.out.println("删除成功");
            }else {
                System.out.println("删除失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}