SpringData-Elasticsearch——SDE综合案例

package com.atguigu.es.demo;

import com.atguigu.es.demo.pojo.User;
import com.atguigu.es.demo.repository.UserRepository;
import com.fasterxml.jackson.databind.ObjectMapper;
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.BoolQueryBuilder;
import org.elasticsearch.index.query.Operator;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedLongTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
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.SortBuilders;
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 org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.IndexOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.FetchSourceFilter;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

@SpringBootTest
class EsDemoApplicationTests {

    @Autowired
    private ElasticsearchRestTemplate restTemplate;

    @Autowired
    private UserRepository userRepository;

    //原生客户端
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    @Test
    void testRestClient() throws IOException {
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        // 查询和过滤
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        sourceBuilder.query(boolQueryBuilder);
        boolQueryBuilder.must(QueryBuilders.matchQuery("name", "冰冰").operator(Operator.AND));
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("age").gte(22).lte(25));

        // 排序
        sourceBuilder.sort("age", SortOrder.DESC);
        // 分页
        sourceBuilder.from(2);
        sourceBuilder.size(2);

        // 高亮
        sourceBuilder.highlighter(new HighlightBuilder().field("name").preTags("<em>").postTags("</em>"));

        // 结果集过滤
        sourceBuilder.fetchSource(new String[]{"id", "name", "age"}, null);

        // 聚合
        sourceBuilder.aggregation(AggregationBuilders.terms("genderAgg").field("gender"));

        System.out.println(sourceBuilder);
        SearchResponse response = this.restHighLevelClient.search(new SearchRequest(new String[]{"user"}, sourceBuilder), RequestOptions.DEFAULT);
        System.out.println(response);

        // 搜索结果集对象
        org.elasticsearch.search.SearchHits searchHits = response.getHits();
        System.out.println("总共命中的记录数:" + searchHits.getTotalHits());
        org.elasticsearch.search.SearchHit[] hitsHits = searchHits.getHits();
        for (org.elasticsearch.search.SearchHit hitsHit : hitsHits) {
            String json = hitsHit.getSourceAsString();
            User user = OBJECT_MAPPER.readValue(json, User.class);
            System.out.println(user);
            // 获取高亮结果集
            Map<String, HighlightField> highlightFields = hitsHit.getHighlightFields();
            HighlightField highlightField = highlightFields.get("name");
            user.setName(highlightField.getFragments()[0].string());
            System.out.println(user);
        }

        // 聚合结果集
        Aggregations aggregations = response.getAggregations();
        ParsedLongTerms genderAgg = aggregations.get("genderAgg");
        List<? extends Terms.Bucket> buckets = genderAgg.getBuckets();
        buckets.forEach(bucket -> {
            System.out.println("桶的名称:" + bucket.getKeyAsNumber().longValue());
            System.out.println("桶的名称:" + bucket.getKeyAsString());
            System.out.println("桶的元素数量:" + bucket.getDocCount());
        });
    }


    @Test
    void testSearch() {
        //原生搜索查询构建器
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        //匹配查询
        queryBuilder.withQuery(QueryBuilders.matchQuery("name", "柳岩"));
        //过滤查询
        queryBuilder.withFilter(QueryBuilders.rangeQuery("age").gte(22).lte(25));
        //排序查询
        queryBuilder.withSort(SortBuilders.fieldSort("age").order(SortOrder.DESC));
        //分页查询   分页条件:1-页码,从0开始(pageNum-1), 2-pageSize每页显示几条
        queryBuilder.withPageable(PageRequest.of(2, 2));
        //高亮查询
        queryBuilder.withHighlightBuilder(new HighlightBuilder().field("name").preTags("<em>").postTags("</em>"));
        //结果集过滤
        queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{"id", "name", "age"}, null));
        //聚合查询
        queryBuilder.addAggregation(AggregationBuilders.terms("genderAgg").field("gender"));

        //获取结果集
        SearchHits<User> searchHits = this.restTemplate.search(queryBuilder.build(), User.class);

        //解析查询结果集
        System.out.println("总共命中记录数" + searchHits.getTotalHits());
        //获取结果集列表
        List<SearchHit<User>> hitList = searchHits.getSearchHits();

        hitList.forEach(hit -> {
            //获取普通结果集
            User user = hit.getContent();
            System.out.println(user);
            //设置高亮结果集
            user.setName(hit.getHighlightField("name").get(0));
            System.out.println(user);

        });
        //解析聚合结果集
        Aggregations aggregations = searchHits.getAggregations();
        ParsedLongTerms genderAgg = aggregations.get("genderAgg");
        //获取桶的集合
        List<? extends Terms.Bucket> buckets = genderAgg.getBuckets();
        buckets.forEach(bucket ->{
            System.out.println("桶的名称"+bucket.getKeyAsNumber().longValue());
            System.out.println("桶的元素数量"+bucket.getDocCount());
        });
    }

    @Test
    void contextLoads() {
        IndexOperations indexOps = this.restTemplate.indexOps(User.class);
        if (!indexOps.exists()) {
            indexOps.create();
        }
        indexOps.putMapping(indexOps.createMapping());
    }

    @Test
    void testCURD() {
        //添加
        //this.userRepository.save(new User(1l,"柳岩","123213",20,false));
        this.userRepository.saveAll(Arrays.asList(
                new User(1l, "柳岩", "123213", 20, false),
                new User(2l, "刘冰冰", "123213", 22, false),
                new User(3l, "李冰冰", "123213", 23, false),
                new User(4l, "张三", "123213", 24, false),
                new User(5l, "李四", "123213", 25, false),
                new User(6l, "王冰冰", "123213", 26, false)
        ));
        //删除
        this.userRepository.deleteById(1l);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值