ES好处和作用就不多说了,但是查询让人烦躁,看了无数大佬作品,几乎没有封装的方法。一个表一个查询方法,让人苦不堪言
public <T> Page<T> getList(T t,Pageable page){
Class<?> classType = t.getClass();
Field[] fields = classType.getDeclaredFields();
for(Field declaredfield:fields){
declaredfield.setAccessible(true);
}
BoolQueryBuilder query = QueryBuilders.boolQuery();
for(Field f:fields){
Type fieldType =f.getGenericType();
String field = f.toString().substring(f.toString().lastIndexOf(".")+1);
Object val = f.get(t);
if(!ObjectUtils.isEmpty(val)){
setQuery(fieldType.getTypeName,field,val.toString(),query);;
}
}
NativeSearchQuery queryParas = new NativeSearchQueryBuilder(query).withPageable(page).build();
queryParas.setTrackTotalHits(true);
SearchHits<?> tempList = template.search(query,classType);
List<T> queryList = new ArrayList();
for(SearchHit<?> searchHit:tempList){
T tempEntity = (T)searchHit.getContent();
queryList.add(tempEntity);
}
Page<T> data = new PageImpl<>(queryList,page,tempList.getTotalHits());
return data;
}
更具自己需要的类型随意封装查询,可以可以根据java的设计模式来实现case过程
private void setQuery(String type,String field,String val,BoolQueryBuilder queryBuilder){
switch(type){
case "java.lang.String":
queryBuilder.must(QueryBuilders.wildcardQuery(field+".keyword",val));
//其他查询方式修改QueryBuilders.wildcardQuery方法
break;
case "java.lang.Integer":
queryBuilder.must(QueryBuilders.queryStringQuery(val).defaultfield(field));
//俺需要可以改QueryBuilders.queryStringQuery
break;
……
default:
queryBuilder.must(QueryBuilders.termQuery(field+".keyword",val));
break;
}
}

本文探讨了Elasticsearch查询的繁琐问题,并提出了一种通过泛型和反射技术进行封装的方法,旨在简化查询过程,使得针对不同类型的查询能更加灵活方便。
1626

被折叠的 条评论
为什么被折叠?



