前面大概了解了一下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);
}
最小值/最大值/平均值