首先,不建议java使用termQuery操作,推荐
matchQuery 和 matchPhraseQuery
@Repository
public interface EsAlSubjectEnterLogDao extends ElasticsearchRepository<AlSubjectEnterLogDocument, String> {
List<AlSubjectEnterLogDocument> findBySessionId(String sessionId);
}
1.新增操作
继承 ElasticsearchRepository
AlSubjectEnterLogDocument alSubjectEnterLogDocument = new AlSubjectEnterLogDocument();
esAlSubjectEnterLogService.save(alSubjectEnterLogDocument);
2.删除操作
同上
esAlSubjectEnterLogDao.deleteById(id);
3.查询操作
一:通过id查询
Optional<AlSubjectEnterLogDocument> opt = esAlSubjectEnterLogDao.findById(id);
AlSubjectEnterLogDocument alSubjectEnterLogDocument = opt.get();
二:通过某个值查询
public Page<AlSubjectEnterLogDocument> findBySubjectCode(String subjectCode) {
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
// queryBuilder.must(QueryBuilders.matchQuery("subjectCode",subjectCode));
queryBuilder.must(QueryBuilders.wildcardQuery("subjectCode",subjectCode));
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withIndices(AlSubjectEnterLogDocument.INDEX_NAME)
.withTypes(AlSubjectEnterLogDocument.TYPE)
.withQuery(queryBuilder)
.build();
Page<AlSubjectEnterLogDocument> alSubjectEnterLogDocumentList = esAlSubjectEnterLogDao.search(searchQuery);
return alSubjectEnterLogDocumentList;
}
三:计数查询
public Long countField(String field,String value) {
NativeSearchQueryBuilder searchQuery=new NativeSearchQueryBuilder();
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.termQuery(field,value.toLowerCase()));
// AlSubjectEnterLogDocument.INDEX_NAME 是index
// AlSubjectEnterLogDocument.TYPE是type如doc
searchQuery.withIndices(AlSubjectEnterLogDocument.INDEX_NAME).withTypes(AlSubjectEnterLogDocument.TYPE).withQuery(queryBuilder);
Long count=elasticsearchTemplate.count(searchQuery.build());
return count;
}
四:复杂分页查询
public Map<String, Object> dateUserAll() {
Map<String,Object> map = new HashMap<>();
NativeSearchQueryBuilder searchQuery=new NativeSearchQueryBuilder();
// 查询条件,必须已经登录
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.termQuery("hasLogin",true));
// 查询7天的数据
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
Calendar calendar = Calendar.getInstance();
// 现在 和 7 天前的时间
String nowTime = simpleDateFormat.format(calendar.getTime());
String sevTime = new String();
calendar.add(Calendar.DATE, -7);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
sevTime = simpleDateFormat.format(calendar.getTime());
//日期限制
QueryBuilder rangeBuilder = QueryBuilders
.rangeQuery("@timestamp")
.format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.gte(sevTime)
.lte(nowTime);
queryBuilder.filter(rangeBuilder);
Pageable pageable = new Pageable() {
@Override
public int getPageNumber() {
return 0;
}
@Override
public int getPageSize() {
return 10000;
}
@Override
public long getOffset() {
return 0;
}
@Override
public Sort getSort() {
return null;
}
@Override
public Pageable next() {
return null;
}
@Override
public Pageable previousOrFirst() {
return null;
}
@Override
public Pageable first() {
return null;
}
@Override
public boolean hasPrevious() {
return false;
}
};
searchQuery.withIndices("alengin*")
.withTypes("doc")
.withQuery(queryBuilder)
// 分页查询
.withPageable(pageable);
System.out.println(searchQuery.build().getQuery());
List list = elasticsearchTemplate.queryForList(searchQuery.build(), JSONObject.class);
System.out.println(list);
return map;
}
五:先根据时间group,再根据不同的登陆人group
Map<String,Object> map = new HashMap<>();
NativeSearchQueryBuilder searchQuery=new NativeSearchQueryBuilder();
// 查询条件,必须已经登录
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.termQuery("hasLogin",true));
// 查询7天的数据
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
Calendar calendar = Calendar.getInstance();
// 现在 和 7 天前的时间
String nowTime = simpleDateFormat.format(calendar.getTime());
String sevTime = new String();
calendar.add(Calendar.DATE, -6);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
sevTime = simpleDateFormat.format(calendar.getTime());
//日期限制
QueryBuilder rangeBuilder = QueryBuilders
.rangeQuery("@timestamp")
.format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.gte(sevTime)
.lte(nowTime);
queryBuilder.filter(rangeBuilder);
// 日期直方图
DateHistogramAggregationBuilder db=AggregationBuilders.dateHistogram("date").field("@timestamp").dateHistogramInterval(DateHistogramInterval.DAY).format("yyyy-MM-dd");
// 根据userId分组
db.subAggregation(AggregationBuilders.terms("userId").field("userId.keyword"));
// 通过userId分组
/*
TermsAggregationBuilder termsAggregation = AggregationBuilders.terms("group_userId").field("userId.keyword").order(BucketOrder.count(true));
termsAggregation.subAggregation(AggregationBuilders.dateHistogram("date").field("@timestamp").dateHistogramInterval(DateHistogramInterval.DAY).format("yyyy-MM-dd"));
*/
// 查询条件
searchQuery.withIndices("alengin*")
.withTypes("doc")
.withQuery(queryBuilder)
.addAggregation(db);
Aggregations aggregations=elasticsearchTemplate.query(searchQuery.build(), new ResultsExtractor<Aggregations>() {
@Override
public Aggregations extract(SearchResponse response) {
return response.getAggregations();
}});
Histogram term =aggregations.get("date");
if(term.getBuckets().size()>0){
for (org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Bucket bk : term.getBuckets()) {
JSONArray jsonArray = new JSONArray();
jsonArray = JSON.parseArray(bk.getAggregations().asList().toString());
JSONObject j = (JSONObject) jsonArray.get(0);
JSONArray buckets = (JSONArray) ((JSONObject) j.get("userId")).get("buckets");
map.put(bk.getKeyAsString(), buckets.size());
/*long count = bk.getDocCount();
map.put(bk.getKeyAsString(), count);*/
}
}
/*Terms term2 =aggregations.get("userId");
if(term2.getBuckets().size()>0){
for (Bucket bk : term2.getBuckets()) {
long count = bk.getDocCount();
map.put(bk.getKeyAsString(), count);
}
}*/
综合:
String userId = (String) jsonObject.get("userId");
Integer pageNum = 0;
Integer pageSize = 0;
if(StringUtils.isBlank(jsonObject.getString("pageNum"))){
pageNum = 0;
}else{
pageNum = Integer.valueOf(jsonObject.getString("pageNum"));
}
if(StringUtils.isBlank(jsonObject.getString("pageSize"))){
pageSize = 20;
}else{
pageSize = Integer.valueOf(jsonObject.getString("pageSize"));
}
// 是否订正
String mistakeStatus = jsonObject.getString("mistakeStatus");
if(StringUtils.isBlank(mistakeStatus)){
mistakeStatus = "0";
}
// 学科
String subjectCode = jsonObject.getString("subjectCode");
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
// queryBuilder.must(QueryBuilders.matchQuery("subjectCode",subjectCode));
queryBuilder.must(QueryBuilders.wildcardQuery("creUser",userId))
.must(QueryBuilders.wildcardQuery("mistakeStatus",mistakeStatus))
.must(QueryBuilders.wildcardQuery("subjectCode",subjectCode));
// 时间要求
//日期限制
String fromTime = jsonObject.getString("fromTime");
String toTime = jsonObject.getString("toTime");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
if(StringUtils.isBlank(fromTime) ){
// 7天前
Calendar calendar = Calendar.getInstance();
// 现在 和 7 天前的时间
calendar.add(Calendar.DATE, -7);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
// fromTime = simpleDateFormat.format(calendar.getTime());
fromTime = String.valueOf(calendar.getTime().getTime());
}
if(StringUtils.isBlank(toTime) ){
toTime = String.valueOf(new Date().getTime());
}
// 范围查询
QueryBuilder rangeBuilder = QueryBuilders
.rangeQuery("creTime")
// .format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
// 大于等于
.gte(fromTime)
// 小于等于
.lte(toTime);
queryBuilder.filter(rangeBuilder);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withIndices(AlMistakeDocument.INDEX_NAME)
.withTypes(AlMistakeDocument.TYPE)
.withQuery(queryBuilder)
// 分页
.withPageable(new PageRequest(pageNum,pageSize))
// 排序,如果creTime为空就默认date
.withSort(SortBuilders.fieldSort("creTime").unmappedType("date").order(SortOrder.DESC))
.build();
Page<AlMistakeDocument> alMistakeDocumentPage = esAlMistakeDao.search(searchQuery);
六、获取某一个
String mistakeId = jsonObject.getString("mistakeId");
AlMistakeDocument alMistakeDocument = null;
try {
alMistakeDocument = esAlMistakeDao.findById(mistakeId).get();
} catch (Exception e) {
e.printStackTrace();
}
七、更新保存
String mistakeId = jsonObject.getString("mistakeId");
AlMistakeDocument alMistakeDocument = null;
try {
alMistakeDocument = esAlMistakeDao.findById(mistakeId).get();
} catch (Exception e) {
e.printStackTrace();
}
esAlMistakeDao.save(alMistakeDocument);
Spring boot --es 新版本分页查询:
1.(推荐)
// 构造条件
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
if(StringUtils.isNotBlank(jsonObject.getString("subjectCode"))){
// 学科
queryBuilder.must(QueryBuilders.matchPhraseQuery("subjectCode",jsonObject.getString("subjectCode")));
}
if(StringUtils.isNotBlank(jsonObject.getString("gradeLevel"))){
// 年级
queryBuilder.must(QueryBuilders.matchPhraseQuery("gradeLevel",jsonObject.getString("gradeLevel")));
}
if(StringUtils.isNotBlank(jsonObject.getString("schoolName"))){
// 学校名
queryBuilder.must(QueryBuilders.matchQuery("schoolName",jsonObject.getString("schoolName")));
}
if(StringUtils.isNotBlank(jsonObject.getString("taskStatus"))){
// 任务状态
String taskStatus = jsonObject.getString("taskStatus");
BoolQueryBuilder taskStatusBuilder = QueryBuilders.boolQuery();
if("0".equals(taskStatus)){
// 任务开始
taskStatusBuilder.must(QueryBuilders.matchQuery("taskStatus","BEGIN"));
}
if ("1".equals(taskStatus)){
// 任务完成--包含标准完成和完成
BoolQueryBuilder taskStatusShouldBuilder = QueryBuilders.boolQuery();
taskStatusShouldBuilder
.should(QueryBuilders.matchQuery("taskStatus","COMPLETE"))
.should(QueryBuilders.matchQuery("taskStatus","STANDARD_COMPLETION"));
taskStatusBuilder.must(taskStatusShouldBuilder);
}
queryBuilder.must(taskStatusBuilder);
}
if(StringUtils.isNotBlank(jsonObject.getString("studentName"))){
// 学生名
queryBuilder.must(QueryBuilders.matchQuery("studentName",jsonObject.getString("studentName")));
}
if(StringUtils.isNotBlank(jsonObject.getString("province"))){
// 省
queryBuilder.must(QueryBuilders.matchQuery("province",jsonObject.getString("province")));
}
if(StringUtils.isNotBlank(jsonObject.getString("city"))){
// 市
queryBuilder.must(QueryBuilders.matchQuery("city",jsonObject.getString("city")));
}
if(StringUtils.isNotBlank(jsonObject.getString("county"))){
// 县
queryBuilder.must(QueryBuilders.matchQuery("county",jsonObject.getString("county")));
}
if(StringUtils.isNotBlank(jsonObject.getString("queryStartTime"))){
// 起始时间
//日期限制
QueryBuilder rangeBuilder = QueryBuilders
.rangeQuery("creTime")
.format("yyyy-MM-dd")
.gte(jsonObject.getString("queryStartTime"));
queryBuilder.filter(rangeBuilder);
}
if(StringUtils.isNotBlank(jsonObject.getString("queryEndTime"))){
// 起始时间
//日期限制
QueryBuilder rangeBuilder = QueryBuilders
.rangeQuery("creTime")
.format("yyyy-MM-dd")
.lte(jsonObject.getString("queryEndTime"));
queryBuilder.filter(rangeBuilder);
}
Integer pageNum = 0;
Integer pageSize = 0;
if(StringUtils.isBlank(jsonObject.getString("pageNo"))){
pageNum = 0;
}else{
pageNum = Integer.valueOf(jsonObject.getString("pageNo"));
}
if(StringUtils.isBlank(jsonObject.getString("pageSize"))){
pageSize = 20;
}else{
pageSize = Integer.valueOf(jsonObject.getString("pageSize"));
}
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withIndices(StudentTaskStatusDocument.INDEX_NAME)
.withTypes(StudentTaskStatusDocument.TYPE)
.withQuery(queryBuilder)
// 分页查询
.withPageable(PageRequest.of(pageNum,pageSize))
// 排序
.withSort(SortBuilders.fieldSort("creTime").order(SortOrder.DESC))
.build();
System.out.println("query:" + searchQuery.getQuery().toString());
Page<StudentTaskStatusDocument> searchResponse = studentTaskStatusDao.search(searchQuery);
List<StudentTaskStatusDocument> l = searchResponse.getContent();
2.
// 构造条件
NativeSearchQueryBuilder searchQuery=new NativeSearchQueryBuilder();
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
if(StringUtils.isNotBlank(jsonObject.getString("subjectCode"))){
// 学科
queryBuilder.must(QueryBuilders.termQuery("subjectCode",jsonObject.getString("subjectCode")));
}
if(StringUtils.isNotBlank(jsonObject.getString("gradeLevel"))){
// 年级
queryBuilder.must(QueryBuilders.termQuery("gradeLevel",jsonObject.getString("gradeLevel")));
}
if(StringUtils.isNotBlank(jsonObject.getString("schoolName"))){
// 学校名
queryBuilder.must(QueryBuilders.termQuery("schoolName",jsonObject.getString("schoolName")));
}
if(StringUtils.isNotBlank(jsonObject.getString("taskStatus"))){
// 任务状态
String taskStatus = jsonObject.getString("taskStatus");
BoolQueryBuilder taskStatusBuilder = QueryBuilders.boolQuery();
if("0".equals(taskStatus)){
// 任务开始
taskStatusBuilder.must(QueryBuilders.termQuery("taskStatus","BEGIN"));
}
if ("1".equals(taskStatus)){
// 任务完成--包含标准完成和完成
BoolQueryBuilder taskStatusShouldBuilder = QueryBuilders.boolQuery();
taskStatusShouldBuilder
.should(QueryBuilders.termQuery("taskStatus","COMPLETE"))
.should(QueryBuilders.termQuery("taskStatus","STANDARD_COMPLETION"));
taskStatusBuilder.must(taskStatusShouldBuilder);
}
queryBuilder.must(taskStatusBuilder);
}
if(StringUtils.isNotBlank(jsonObject.getString("studentName"))){
// 学生名
queryBuilder.must(QueryBuilders.termQuery("studentName",jsonObject.getString("studentName")));
}
if(StringUtils.isNotBlank(jsonObject.getString("province"))){
// 省
queryBuilder.must(QueryBuilders.termQuery("province",jsonObject.getString("province")));
}
if(StringUtils.isNotBlank(jsonObject.getString("city"))){
// 市
queryBuilder.must(QueryBuilders.termQuery("city",jsonObject.getString("city")));
}
if(StringUtils.isNotBlank(jsonObject.getString("county"))){
// 县
queryBuilder.must(QueryBuilders.termQuery("county",jsonObject.getString("county")));
}
if(StringUtils.isNotBlank(jsonObject.getString("queryStartTime"))){
// 起始时间
//日期限制
QueryBuilder rangeBuilder = QueryBuilders
.rangeQuery("creTime")
.format("yyyy-MM-dd")
.gte(jsonObject.getString("queryStartTime"));
queryBuilder.filter(rangeBuilder);
}
if(StringUtils.isNotBlank(jsonObject.getString("queryEndTime"))){
// 起始时间
//日期限制
QueryBuilder rangeBuilder = QueryBuilders
.rangeQuery("creTime")
.format("yyyy-MM-dd")
.lte(jsonObject.getString("queryEndTime"));
queryBuilder.filter(rangeBuilder);
}
Integer pageNum = 0;
Integer pageSize = 0;
if(StringUtils.isBlank(jsonObject.getString("pageNo"))){
pageNum = 0;
}else{
pageNum = Integer.valueOf(jsonObject.getString("pageNo"));
}
if(StringUtils.isBlank(jsonObject.getString("pageSize"))){
pageSize = 20;
}else{
pageSize = Integer.valueOf(jsonObject.getString("pageSize"));
}
/*SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withIndices(StudentTaskStatusDocument.INDEX_NAME)
.withTypes(StudentTaskStatusDocument.TYPE)
.withQuery(queryBuilder)
// 分页查询
.withPageable(PageRequest.of(pageNum,pageSize))
// 排序
.withSort(SortBuilders.fieldSort("creTime").order(SortOrder.DESC))
.build();*/
searchQuery.withIndices(StudentTaskStatusDocument.INDEX_NAME)
.withTypes(StudentTaskStatusDocument.TYPE)
.withQuery(queryBuilder)
// 分页查询
.withPageable(PageRequest.of(pageNum,pageSize))
// 排序
.withSort(SortBuilders.fieldSort("creTime").order(SortOrder.DESC))
.build();
//System.out.println("filter:" + searchQuery.build().getFilter().toString());
System.out.println("query:" + searchQuery.build().getQuery().toString());
/*Page<StudentTaskStatusDocument> searchResponse = studentTaskStatusDao.search(searchQuery);
List<StudentTaskStatusDocument> l = searchResponse.getContent();*/
//自定义查询结果封装
AggregatedPage<StudentTaskStatusDocument> page = elasticsearchTemplate.queryForPage(searchQuery.build(), StudentTaskStatusDocument.class,
new SearchResultMapper() {
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz,
Pageable pageable) {
List<T> chunk = new ArrayList<T>();
for (SearchHit searchHit : response.getHits().getHits()) {
Map<String, Object> smap = searchHit.getSourceAsMap();
Map<String, HighlightField> hmap = searchHit.getHighlightFields();
chunk.add((T) smap);
}
AggregatedPage<T> result=new AggregatedPageImpl<T>(chunk,pageable,response.getHits().getTotalHits());
return result;
}
@Override
public <T> T mapSearchHit(SearchHit searchHit, Class<T> type) {
return null;
}
});
3.查询每个人最后一条数据,5分钟内
// 默认五分钟
Integer showTime = 5;
NativeSearchQueryBuilder nativeSearchQueryBuilder=new NativeSearchQueryBuilder();
// 查询条件,必须已经登录
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.termQuery("hasLogin",true));
//日期限制
// 显示30分钟内的数据
// 查询7天的数据
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
Calendar calendar = Calendar.getInstance();
// 现在 和 7 天前的时间
String nowTime = simpleDateFormat.format(calendar.getTime());
String sevTime = new String();
calendar.add(Calendar.MINUTE, showTime * -1);
sevTime = simpleDateFormat.format(calendar.getTime());
// sevTime = DateFormater.changeZoneE0(calendar.getTime(),DateFormater.DATE_STYLE_UTC);
// 分组条件:
// {"from":0,"size":0,"query":{"bool":{"must":[{"term":{"hasLogin":true}}],"filter":[{"range":{"@timestamp":{"from":"2020-05-18T03:10:28.430Z","to":null,"include_lower":true,"include_upper":true,"format":"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'","boost":1}}}],"adjust_pure_negative":true,"boost":1}},"aggs":{"data":{"terms":{"field":"userId.keyword","size":10000},"aggs":{"top_page":{"top_hits":{"size":1,"sort":[{"@timestamp":{"order":"desc"}}],"_source":{"includes":["path","userId","realName","publicIp","sourceFrom","roleCodes","schoolName","@timestamp"]}}}}}},"version":true}
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("data").field("userId.keyword");
termsAggregationBuilder.subAggregation(AggregationBuilders.topHits("top_page").size(1).sort("@timestamp", SortOrder.DESC).fetchSource(true));
QueryBuilder rangeBuilder = QueryBuilders
.rangeQuery("@timestamp")
.format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.gte(sevTime);
queryBuilder.filter(rangeBuilder);
// 查询条件
Pageable pageable = PageRequest.of(1,1);
SearchQuery searchQuery = nativeSearchQueryBuilder.withIndices("self*")
.withTypes("doc").withPageable(pageable)
.withQuery(queryBuilder).addAggregation(termsAggregationBuilder).build();
System.out.println(searchQuery.getQuery().toString());
//Page<Map> page = elasticsearchTemplate.queryForPage(searchQuery,Map.class);
Aggregations aggregations=elasticsearchTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() {
@Override
public Aggregations extract(SearchResponse response) {
return response.getAggregations();
}});
StringTerms term =aggregations.get("data");
JSONArray array = new JSONArray();
if(term.getBuckets().size()>0) {
for (StringTerms.Bucket bk : term.getBuckets()) {
TopHits topHits = bk.getAggregations().get("top_page");
Map<String,Object> map = topHits.getHits().getHits()[0].getSourceAsMap();
JSONObject j = (JSONObject) JSONObject.toJSON(map);
// 处理下最后登录的时间
j.put("lastTimeStr", DateFormater.changeZoneE8(j.getString("@timestamp").replace("T"," ").replace("Z",""),DateFormater.DATE_STYLE9));
array.add(j);
}
}
4.直接查询
List<Map> list = elasticsearchTemplate.queryForList(searchQuery, Map.class);
for (Map map:list){
}
其他参考资料:
https://blog.csdn.net/caideb/article/details/84231157
https://blog.csdn.net/weixin_42619846/article/details/102909762