• 04-springboot整合elasticsearch初识-简单增删改查及复杂排序,分页,聚合操作


        前面大概了解了一下elasticsearch的数据存储和数据的查询。现在学习一下,es的复杂操作。

        官网相关文档地址:https://www.elastic.co/guide/en/elasticsearch/client/java-api/7.x/java-docs-delete-by-query.html

        spring boot提供的Elasticsearch 的Data查询:https://docs.spring.io/spring-data/elasticsearch/docs/4.0.1.RELEASE/reference/html/#repositories.definition

    1.简单操作

        前面介绍了es的简单使用,现在梳理一下,通常工作使用中,用到的增删改查功能。

        通过继承ElasticsearchRepository接口,通过提供的模板方法进行操作。AbstractElasticsearchRepository类已经帮我们封装好了常用的增删改查的方法,我们只要调用就行。

    本质也是通过springboot 提供的es的操作类进行操作。eg:

    @Override
    public Page<T> findAll(Pageable pageable) {
           SearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withPageable(pageable).build();
           return elasticsearchOperations.queryForPage(query, getEntityClass());
    }
    private void createIndex() {
    	elasticsearchOperations.createIndex(getEntityClass());
    }
    private void putMapping() {
    	elasticsearchOperations.putMapping(getEntityClass());
    }
    
    

    1.新增和修改

    都是用封装好的index方法进行操作。

    @Test
        public void updateEntity(){
            Person person = Person.builder().id("66666").name("六哥ya!!!").age(19).build();
            Person p = repository.index(person);
            p= repository.findById("66666").get();
            log.info("=========================== {} ==================",p);
    
        }
    

    2.查询方法

    • 前面介绍的根据,方法名关键字自动生成json
    • 用@Query查询的方法
    • 使用Elasticsearch提供的方法
    ElasticSearch中提供了一些通用的方法:
    findAll()
    findById()
    findAllById()
    count();
    Page<T> search(QueryBuilder query, Pageable pageable) 
    

    3.删除的方法

    public void deleteById(ID id)
    
    public void delete(T entity)
    
    deleteAll(Iterable<? extends T> entities)
    
    

    2.复杂操作

    在实际使用中,可能涉及到比较复杂的业务,所以,要了解一下复杂业务情况下,ES在Java中怎么进行操作

    1.排序

    springboot也提供了排序的封装,但是要注意的是,不能对text进行排序,只能对数字或者字母排序。
    除此之外,实体类上要增加注解@Field(fielddata=true)
    Sort类提供了排序相关的字段方法,具体可以查看相关类及API文档

     public void getList(){
            Sort order = Sort.by(new Sort.Order(Sort.Direction.DESC, "age"));
            Iterable<Person> all = repository.findAll(order);
            for (Person person : all) {
                log.info("==============={}================",person);
            }
    }
    

    2.分页

    repository存储库提供的查询方法

    @Test
        public void getPageList() throws JsonProcessingException {
    //        PageRequest age = PageRequest.of(1, 10, Sort.Direction.ASC, "age");
            PageRequest of = PageRequest.of(1, 10);
            MatchAllQueryBuilder query = QueryBuilders.matchAllQuery();
            Page all = repository.findAll(of);
            Page search = repository.search(query, of);
            log.info("==============={}================", JsonMapperUtil.toString(all));
            log.info("==============={}================", JsonMapperUtil.toString(search));
        }
    
    

    es java API查询的方法

     NativeSearchQuery nq = new NativeSearchQueryBuilder().withPageable(of).build();
     Page<Person> people = operations.queryForPage(nq, Person.class);
    
    

    3.聚合操作

    关联查询

    @Test
        public void getSortList(){
            TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("by_country").field("country")
                    .subAggregation(AggregationBuilders.dateHistogram("by_year")
                            .field("dateOfBirth")
                            .subAggregation(AggregationBuilders.avg("avg_children").field("children"))
                    );
            NativeSearchQuery query = new NativeSearchQueryBuilder().addAggregation(aggregationBuilder).build();
            List<Person> people = operations.queryForList(query, Person.class);
        }
    
    

    最小值/最大值/平均值

  • 相关阅读:
    bzoj 1858 线段树
    bzoj 1877 最小费用流
    bzoj 1833 数位dp
    Codeforces Round #285 (Div. 1) B
    HDU2028 Lowest Common Multiple Plus
    HDU5706 GirlCat
    HDU2022 海选女主角
    687E: TOF
    687D: Dividing Kingdom II
    687D: Dividing Kingdom II
  • 原文地址:https://www.cnblogs.com/perferect/p/13161995.html
Copyright © 2020-2023  润新知