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);
    }

最小值/最大值/平均值

猜你喜欢

转载自www.cnblogs.com/perferect/p/13161995.html
今日推荐