es查询:会员ID不为空且资源类型为api或page,分页,根据访问时间倒序排序
package com.jiuku.modules.es.service.impl;
import com.jiuku.modules.es.entity.AdminLogEntity;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import java.util.List;
/**
* @Author: Hanweihu
* @Description:
* @Date: Created in 14:55 2021/3/12
*/
public class Test {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
/**
* @Description: 筛选时间区间、must与should组合、分页查询、根据字段排序
* @author: Hanweihu
* @date: 2021/3/12 15:03
* @param pageNum 第几页
* @param limit 一页几条
*/
public void testES(int pageNum, int limit) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
// must与should组合
.must(QueryBuilders.boolQuery().filter(QueryBuilders.wildcardQuery("会员ID字段", "*")))
.filter(QueryBuilders.boolQuery()
.should(QueryBuilders.termQuery("资源类型字段", "api"))
.should(QueryBuilders.termQuery("资源类型字段", "page"))
)
// 筛选:时间区间
.filter(QueryBuilders.rangeQuery("时间字段").gte(开始时间long类型).lte(结束时间long类型));
SearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withQuery(boolQueryBuilder)
// 分页查询(注意:ES的页码是从0开始的)
.withPageable(PageRequest.of(pageNum - 1, limit))
// 根据字段排序
.withSort(SortBuilders.fieldSort("排序字段").order(SortOrder.valueOf("DESC")))
.build();
// 分页查询 AdminLogEntity是自定义的实体类,换成你们自己的
AggregatedPage<AdminLogEntity> goodsPage = elasticsearchTemplate.queryForPage(nativeSearchQuery, AdminLogEntity.class);
long total = goodsPage.getTotalElements(); // 总数据量
long totalPage = goodsPage.getTotalPages(); // 总页数
List<AdminLogEntity> goodsList = goodsPage.getContent(); // 当前页数据集合
}
}