背景:
一般文件报表经常会需要搜各个表头对应内容,如果支持全部类型切换搜索,操作起来就不够便捷。而且这个报表是测试自己用的,准确性可以不用太要求,所以更想要那中输入关键字命中任意表记录内容的模糊匹配功能。
方法一:解析搜索类型和关键字,加入到查询条件。
方法二:遍历搜索结果,解析成json或key-value,逐一匹配,符合则加入搜索结果。
方法三:通过stream API直接过滤搜索结果,符合的加入搜索结果。相当于搜索结果全文匹配。
方法一如果报表查表很单一的话就非常适用,但如果是不同条件查不同表组合那就会非常麻烦,而且查询条件也需要各种拼奏。
后两者显然方法三更便捷。
具体实现:
public JSONObject getReportList(String env, Map<String, Object> request){
string[]keyWords = request. containskey("keyword") ? request.get("keyWord"). tostring().split(" +") : null; // 支持空格符分隔关键字 List<Map<string,Object>> list = 分页后表搜索结果
List<Map<String,Object>>listcount=不分页下的搜索总数
if (keywords != null && keybords.length >θ){
int preCount = request.containskey("count") ? Integer .parseInt(request.get("count").toString()) : 0;
// List<Map<String,object>> list2 = null;
for (String keyWord : keywords){
System.out,print1n("keyWord = " + keyWord);
list = 1ist.stream().fi1ter(s -> s.tostring().contains(keyword)) .collect(Collectors.toList());
}
System.out.println("list2 =- + list);
int count2 = list.size()+ preCount;
System.out.println("count2=" + count2);//不足一页就补数
if (count2<pageSize 8& currentPage * pageSize < count){
request.put("currentPage",currentPage + 1);
JSONObject addList = getReportList(env,request);
if (addlist != nul1){
list.addAll((Collection<?extends Map<String,Object>>) addList.get("item"));
}
request.put("list",list);
}
jsonObject.put("iten", 1ist);
jsonObject.put("total", count2);
}else {
jsonObject,put("iten",list);
jsonObject,put("total", count);
}
return json0bject;
}
这种方法的小坑:
1、翻页会有问题。可能因为补数导致制页后的数据重复出现,但如果搜索结果少于一页就没有差别。
2、如果关键字不够明确会导致匹配到很多无效数据。如关键字关键字=1
3、多个关键字可能导致性能略低。
不过对于比如指定日期,指定类目这样子的关键字,已经足够精确和高效了。|