RestHighLevelClient Java操作ES实现CRUD (

该代码示例展示了如何使用Java的RestHighLevelClient进行Elasticsearch的操作,包括创建、查看、删除索引,创建、更新、获取和删除文档,批量操作,全量和条件查询,排序,过滤字段,以及高亮显示和聚合查询。
package com.example.javahighlevelrestclienttest;

import com.alibaba.fastjson.JSON;
import com.example.javahighlevelrestclienttest.Entity.User;
import org.apache.lucene.search.TotalHits;
import org.assertj.core.util.Lists;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
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.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
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.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.indices.GetIndexResponse;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.BucketOrder;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedStringTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Stream;

@SpringBootTest
class JavaHighLevelRestClientTestApplicationTests {

    @Autowired
    private RestHighLevelClient esRestClient;

    //创建索引
    @Test
    void createIndex() throws IOException {
        //创建索引 --- 请求对象
        CreateIndexRequest request = new CreateIndexRequest("user");
        //发送请求 --- 获取响应
        CreateIndexResponse createIndexResponse = esRestClient.indices().create(request, RequestOptions.DEFAULT);
        //响应状态
        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println("索引操作:" + acknowledged);
        //关闭ES客户端
        esRestClient.close();
    }

    //查看索引
    @Test
    void getIndex() throws IOException {
        GetIndexRequest getIndexRequest = new GetIndexRequest("user");
        GetIndexResponse getIndexResponse = esRestClient.indices().get(getIndexRequest, RequestOptions.DEFAULT);
        //打印 别名
        System.out.println(getIndexResponse.getAliases());
        //打印 数据流
        System.out.println(getIndexResponse.getDataStreams());
        //打印 设置信息
        System.out.println(getIndexResponse.getSettings());
        //打印 映射关系
        System.out.println(getIndexResponse.getMappings());
    }

    //删除索引
    @Test
    void delIndex() throws IOException {
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("user");
        AcknowledgedResponse delete = esRestClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
        //获取删除状态
        boolean acknowledged = delete.isAcknowledged();
        //true or false
        System.out.println(acknowledged);
    }

    //创建文档
    @Test
    void createDoc() throws IOException, ParseException {
        IndexRequest indexRequest = new IndexRequest("user");
        //设置索引及索引中文档的唯一性标识id(如果不指定,则ES会默认随机生成一个id)
        //indexRequest.index("user").id("1001");

        Date day=new Date();
        SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = sdf.format(day);

        User user = new User();
        user.setUserName("泽泽");
        user.setAge(23);
        user.setGender("男");
        user.setTimestamp(format);

        //向ES中插入数据,必须将数据格式转换为JSON
        String s = JSON.toJSONString(user);
        //保存内容
        indexRequest.source(s,XContentType.JSON);

        //发送信息 获取响应
        IndexResponse index = esRestClient.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(index.getResult());

        //关闭ES客户端
        esRestClient.close();
    }

    //修改文档
    @Test
    void updateDoc() throws IOException {
        //配置修改参数 --- 表示要修改user索引中id为1001的文档内容
        UpdateRequest request = new UpdateRequest("user","1001");
        //把age修改为18
        request.doc(XContentType.JSON, "age", 18);
        //发送请求 --- 获取响应
        UpdateResponse update = esRestClient.update(request, RequestOptions.DEFAULT);
        System.out.println(update.getResult());

        esRestClient.close();
    }

    //查看文档
    @Test
    void getDoc() throws IOException {
        GetRequest getRequest = new GetRequest("user","Q-hwWYcBlZOjc5PgvviU");

        GetResponse documentFields = esRestClient.get(getRequest, RequestOptions.DEFAULT);

        System.out.println(documentFields.getSourceAsString());

        esRestClient.close();
    }

    //删除文档
    @Test
    void delDoc() throws IOException {
        //删除文档 --- 请求对象
        DeleteRequest request = new DeleteRequest();
        //设置请求参数 --- 表示要删除user索引中id为1001的文档
        request.index("user").id("1001");

        //发送请求 --- 获取响应
        DeleteResponse response = esRestClient.delete(request,RequestOptions.DEFAULT);
        System.out.println(response.getResult());

        //关闭ES客户端
        esRestClient.close();
    }

    //批量创建文档
    @Test
    void bulkCreateDoc() throws IOException {
        //批量新增文档 --- 请求对象
        BulkRequest request = new BulkRequest();
        //以JSON格式批量新增文档 --- 存入请求体中
        request.add(new IndexRequest().index("user").source(XContentType.JSON, "name", "牛子","sex","boy","age",21,"",""));
        request.add(new IndexRequest().index("user").source(XContentType.JSON, "name", "天乐","sex","boy","age",18));
        request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "乐乐","sex","girl","age",20));

        //发送请求 --- 获取响应
        BulkResponse response = esRestClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(response.getTook());

        //关闭ES客户端
        esRestClient.close();
    }

    //批量删除文档
    @Test
    void bulkDelDoc() throws IOException {
        //批量删除文档 --- 请求对象
        BulkRequest request = new BulkRequest();
        //将要删除的文档id存入请求体中
        request.add(new DeleteRequest().index("user").id("1001"));
        request.add(new DeleteRequest().index("user").id("1002"));
        request.add(new DeleteRequest().index("user").id("1003"));

        //发送请求 --- 获取响应
        BulkResponse response = esRestClient.bulk(request,RequestOptions.DEFAULT);
        System.out.println(response.getTook());
        System.out.println(response.getItems());

        //关闭ES客户端
        esRestClient.close();
    }

    //全量查询
    @Test
    void matcAllDoc() throws IOException{
        //1.查询索引中的全部文档 --- matchAllQuery 全量查询
        //创建搜索请求对象
        SearchRequest request = new SearchRequest();
        //设置参数 --- 表示查询哪个索引中的文档内容
        request.indices("user");
        //构建查询的请求体 --- 存入搜索请求对象中
        request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
        //发送请求 --- 获取响应
        SearchResponse response = esRestClient.search(request,RequestOptions.DEFAULT);
        //获取查询到的结果集
        SearchHits hits = response.getHits();
        System.out.println(hits.getTotalHits()); //结果集的条数
        System.out.println(response.getTook());  //总耗时

        //遍历结果集
        for (SearchHit hit : hits) {
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
//            User user = new User();
            String name = (String) sourceAsMap.get("userName");
            Integer age = (Integer) sourceAsMap.get("age");
            String gender = (String) sourceAsMap.get("gender");
            String timestamp = (String) sourceAsMap.get("timestamp");

            System.out.println(name+" "+age+" "+gender+" "+timestamp);
            System.out.println(hit.getSourceAsString());
        }

        //关闭ES客户端
        esRestClient.close();
    }

    //条件查询
    @Test
    void mustDoc() throws IOException {
        //2.条件查询--- termQuery age=21
        //创建搜索请求对象
        SearchRequest request = new SearchRequest();
        //设置参数 --- 表示查询哪个索引中的文档内容
        request.indices("user");
        //构建查询的请求体 --- 存入搜索请求对象中
        request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age",21)));

        //发送请求 --- 获取响应
        SearchResponse response = esRestClient.search(request,RequestOptions.DEFAULT);
        //获取查询到的结果集
        SearchHits hits = response.getHits();
        System.out.println(hits.getTotalHits()); //结果集的条数
        System.out.println(response.getTook());  //总耗时
        //遍历结果集
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }

        //关闭ES客户端
        esRestClient.close();
    }

    //分页查询
    @Test
    void pageSizeDoc() throws IOException {
        //3.分页查询
        //创建搜索请求对象
        SearchRequest request = new SearchRequest();
        //设置参数 --- 表示查询哪个索引中的文档内容
        request.indices("user");
        //构建查询的请求体
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        builder.from(0);
        builder.size(3);
        //将构建好的查询请求体存入搜索请求对象中
        request.source(builder);

        //发送请求 --- 获取响应
        SearchResponse response = esRestClient.search(request,RequestOptions.DEFAULT);
        //获取查询到的结果集
        SearchHits hits = response.getHits();
        System.out.println(hits.getTotalHits()); //结果集的条数
        System.out.println(response.getTook());  //总耗时
        //遍历结果集
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }

        //关闭ES客户端
        esRestClient.close();
    }

    //排序查询
    //做全量查询,对查询结果中的年龄age字段做降序排序。
    @Test
    void sortMatchAllDoc() throws IOException {
        //4.对查询结果进行排序
        //创建搜索请求对象
        SearchRequest request = new SearchRequest();
        //设置参数 --- 表示查询哪个索引中的文档内容
        request.indices("user");
        //构建查询的请求体
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        builder.sort("age", SortOrder.ASC);
        //将构建好的查询请求体存入搜索请求对象中
        request.source(builder);

        //发送请求 --- 获取响应
        SearchResponse response = esRestClient.search(request,RequestOptions.DEFAULT);
        //获取查询到的结果集
        SearchHits hits = response.getHits();
        System.out.println(hits.getTotalHits()); //结果集的条数
        System.out.println(response.getTook());  //总耗时
        //遍历结果集
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }

        //关闭ES客户端
        esRestClient.close();
    }

    //过滤字段查询
    //做全量查询,同时排除性别sex字段。
    @Test
    void filterMatchAll() throws IOException {
        //5.过滤字段
        //创建搜索请求对象
        SearchRequest request = new SearchRequest();
        //设置参数 --- 表示查询哪个索引中的文档内容
        request.indices("user");
        //构建查询的请求体
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        //不包括
        String[] excludes = {"sex"};
        //包括 俩者写一个就可,不包括就过滤指定字段,包括就只显示包括的字段。
        String[] includes = {};
        builder.fetchSource(includes,excludes);
        //将构建好的查询请求体存入搜索请求对象中
        request.source(builder);

        //发送请求 --- 获取响应
        SearchResponse response = esRestClient.search(request,RequestOptions.DEFAULT);
        //获取查询到的结果集
        SearchHits hits = response.getHits();
        System.out.println(hits.getTotalHits()); //结果集的条数
        System.out.println(response.getTook());  //总耗时
        //遍历结果集
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }

        //关闭ES客户端
        esRestClient.close();
    }

    //组合条件查询
    //查询年龄 age=18 或者 name=张起灵 的文档内
    @Test
    void compositeQuery() throws IOException {
        //6.组合查询
        //创建搜索请求对象
        SearchRequest request = new SearchRequest();
        //设置参数 --- 表示查询哪个索引中的文档内容
        request.indices("user");
        //构建查询的请求体
        SearchSourceBuilder builder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.should(QueryBuilders.matchQuery("age",18));
        boolQueryBuilder.should(QueryBuilders.matchQuery("name","天乐"));
        builder.query(boolQueryBuilder);
        //将构建好的查询请求体存入搜索请求对象中
        request.source(builder);

        //发送请求 --- 获取响应
        SearchResponse response = esRestClient.search(request,RequestOptions.DEFAULT);
        //获取查询到的结果集
        SearchHits hits = response.getHits();
        System.out.println(hits.getTotalHits()); //结果集的条数
        System.out.println(response.getTook());  //总耗时
        //遍历结果集
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }

        //关闭ES客户端
        esRestClient.close();
    }

    //高亮显示
    @Test
    void testHighlight() throws IOException, ParseException {
        //搜索请求对象
        SearchRequest searchRequest = new SearchRequest("user");
        //搜索源构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //boolQuery搜索方式
        //先定义一个MultiMatchQuery
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("乐乐18", "name", "age")
                .minimumShouldMatch("50%")
                .field("name", 10);

        //定义一个boolQuery
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        //定义过虑器
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));

        searchSourceBuilder.query(boolQueryBuilder);
        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","age","gender","timestamp"},new String[]{});

        //设置高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<tag>");
        highlightBuilder.postTags("</tag>");
        highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
//        highlightBuilder.fields().add(new HighlightBuilder.Field("description"));
        searchSourceBuilder.highlighter(highlightBuilder);

        //向搜索请求对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索,向ES发起http请求
        SearchResponse searchResponse = esRestClient.search(searchRequest,RequestOptions.DEFAULT);
        //搜索结果
        SearchHits hits = searchResponse.getHits();
        //匹配到的总记录数
        TotalHits totalHits = hits.getTotalHits();
        //得到匹配度高的文档
        SearchHit[] searchHits = hits.getHits();
        //日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(SearchHit hit:searchHits){
            //文档的主键
            String id = hit.getId();
            //源文档内容
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            //源文档的name字段内容
            String name = (String) sourceAsMap.get("name");
            //取出高亮字段
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if(highlightFields!=null){
                //取出name高亮字段
                HighlightField nameHighlightField = highlightFields.get("name");
                if(nameHighlightField!=null){
                    Text[] fragments = nameHighlightField.getFragments();
                    StringBuffer stringBuffer = new StringBuffer();
                    for(Text text:fragments){
                        stringBuffer.append(text);
                    }
                    name = stringBuffer.toString();
                }
            }

            //由于前边设置了源文档字段过虑,这时description是取不到的
            String description = (String) sourceAsMap.get("description");
            //学习模式
            String studymodel = (String) sourceAsMap.get("studymodel");
            //价格
            Double price = (Double) sourceAsMap.get("price");
            //日期
            Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.out.println(name);
            System.out.println(studymodel);
            System.out.println(description);
        }
    }

    @Test
    void testTime(){
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = df.format(new Date());
        System.out.println("当前时间"+df.format(new Date()));
        //1代表为一个月    正的往前  负的为后
        Date date = stepMonth(new Date(), -1);
        System.out.println("前一个月时间为"+df.format(date));
    }

    Date stepMonth(Date sourceDate, int month){
        Calendar c = Calendar.getInstance();
        c.setTime(sourceDate);
        c.add(Calendar.MONTH, -1);
        return c.getTime();
    }

    @Test
    void ssss() {
        String sss1 = "(Spring|Mysql|ElasticSearch)   ";
        System.out.println(sss1);
        String trim = sss1.trim();
        System.out.println(trim);

        //替换
        String substring = trim.replace("(", "");
//        System.out.println("替换为 " + substring);
//
//        //正则分割
//        String[] split = substring.split("\\||\\)");
//        Spliterator<String> spliterator = Arrays.stream(split).spliterator();
//        System.out.println(spliterator);
//
//        for (int i = split.length - 1; i >= 0; i--) {
//            System.out.println(split[i]);
//        }
        Stream.of(substring.split("\\||\\)|,")).forEach(keyword -> {
            System.out.println("打印"+keyword);
        });
    }

    @Test
    void ssss1111() {
        String s = "a,b,c,d,e,,,,,";
        String[] string1 = new String[20];
        String[] string2 = new String[20];
        string1 = s.split(",");
        string2 = s.split(",",1);
        for (String a: string2) {
            System.out.println("2222 "+a);
        }
        for (String a: string1) {
            System.out.println("1111 "+a);
        }

//                正数 按组分割 只分割一次
//                负数      正常分割,首位有符号时候分割,但会有空字符
//                没有数字 正常分割
    }

    //热词Top10排序
    @Test
    void getTermsandOrderBy(){
        SearchRequest searchRequest = new SearchRequest("user");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //聚合查询 top10热词
        TermsAggregationBuilder field = AggregationBuilders.terms("order_by_word").field("word")
                .size(10)
                .order(BucketOrder.aggregation("_count",false));
        sourceBuilder.aggregation(field);
        searchRequest.source(sourceBuilder);
        List<User> hotWordList = Lists.newArrayList();
        try {
            SearchResponse response = esRestClient.search(searchRequest, RequestOptions.DEFAULT);
            Terms terms = response.getAggregations().get("order_by_word");
            for (Terms.Bucket bucket : terms.getBuckets()) {
                User hotWordVO = new User();
                String fieldValue = bucket.getKeyAsString();
                long count = bucket.getDocCount();
                hotWordVO.setWord(fieldValue);
                hotWordVO.setCount(count);
                hotWordList.add(hotWordVO);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        System.out.println(hotWordList.toArray());
    }

}

查看数据结构的

        //查看表别名与本名结构
        Request request;
        request = new Request("GET", "_cat/aliases?v&h=alias,index");
        Response response = elasticTemplate.request(request, restHighLevelClient);

        //查看表数量
        request = new Request("GET", "_cat/indices?v&h=idx,docs.count");
        response = elasticTemplate.request(request, restHighLevelClient);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值