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方法進行操作。

public interface PersonRepository extends ElasticsearchRepository<Person,String> {

    @Query("{\"match\": {\"name\": {\"query\": \"?0\"}}}")
    List<Person> findByName(String name);

    List<Person> findByNameAndId(String name, int id);
}

 @Autowired
 PersonRepository repository;


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

最小值/最大值/平均值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM