按照solr字段分面查询的查询结果顺序,添加到json后从后台发送前端

13 篇文章 0 订阅

描述:solr分面功能查询结果默认是按照计数降序排列的list,内容格式为FacetField的list,而FacetField内容又为:字段+具体分面结果排序list。在遍历FacetField中,以为可以按照取的顺序添加到json中,然而在把json传递给前端页面时发现原本排好序的顺序乱了。
问题:问题出在json格式为:{字段:{字段内容:计数}...};
原因:找了大量文章发现,json内的排序,是按照key的自然规律排序,也就是按照1,2,3....或者a,b,c...这样类似的规则排序。而我的key是汉字:字段内容,所以顺序就乱了,汉字是按照什么规则排序没有去研究。所以我就找各种关于value进行排序的方法,方法3是按照value排序。
办法:
1(后台处理,已尝试,失败):尝试使用map或者list直接转json格式,然而还是会打乱顺序,treemap,hashmap都试了
2(后台处理,未尝试,未知):网上有人说使用fastjson,只需要在maven中引入相关包,但是看到一篇文章说道,fastjson在国内是比较流行的一种,他的最大亮点就在于“快”,但是忽略了json的规范,会有很多bug,所以为了避免以后为各种bug头疼,还是选择放弃试验。
3(前台处理,已尝试,失败):前台js也可以自定义一个排序的函数进行处理,可以通过value进行排序,但是这个方法需要key相同,但是我的json格式中key和value必须向对应,key是字段内容,所以不可能处理成一样的。这种方法网上可以找到一大堆。
4(后台处理,已尝试,成功):因为要处理的json格式为:{字段内容:计数},想要按照排序好的顺序来添加到json,所以我在前面在多加了一层json,来存放自增的数字,格式为:{0:{字段内容:计数}....}。这样就可以按照原来的顺序来排序。
后台代码:
		// 将查询结果以jsonarry格式保留
		JSONArray arrJson = new JSONArray();
		// 创建solrQuery对象
		SolrQuery query = new SolrQuery();
		//设置分面
        query.setFacet(true); // 设置使用facet
        query.setFacetMinCount(1); // 设置facet最少的统计数量
//      query.setFacetLimit(10); // facet结果的返回行数
        query.addFacetField("FILE_TYPE"); // facet的字段 文档类型
        ...
        ...
		// 分面结果,内容为所有分面的集合
		List<FacetField> flist=rq.getFacetFields();
		// 具体分面结果json
		// 格式为:{字段内容:计数}
		JSONObject facetContentJson = new JSONObject();
		// json内的排序是key的自然排序,会打乱solr分面排序好的结果(默认是按照计数降序),所以添加数字保持默认排序
		// 格式为:{排序数字:{字段内容:计数}...}
		JSONObject ContentJson = new JSONObject();
		// 放入jsonarray里的分面json
		// 格式为:{分面字段:{排序数字:{字段内容:计数}...}...}
		JSONObject facetJson = new JSONObject();
		// 将查询返回的分面集合,处理成json形式:{FILE_TYPE:{0:{初诊模板:114771},1:{病程记录:70145}}...}
		for(FacetField ff : flist) {
			int i=0;
			for(Count c:ff.getValues()) {
				// 清空之前数据,下一个数据做单独json
				facetContentJson.clear();
				facetContentJson.put(c.getName(), c.getCount());
				ContentJson.put(i++,facetContentJson);
			}
			facetJson.accumulate(ff.getName(), ContentJson);
		}
		...
		...
		arrJson.add(facetJson);
		// 将查询总数放入得到arrJson中
		JSONObject json = new JSONObject();
		// 将查询总数,响应时间,每页条数放入json
		json.accumulate("count", count);
		json.accumulate("time", rq.getQTime());
		json.accumulate("rows", PAGE_ROWS);
		arrJson.add(json);
		...
		...
		return arrJson;

我这里是将facetJson放入到一个大的JSONArray中,里面还有其他的一系列参数,比如:查询时间、结果数等。前端只需要遍历JSONArray中的所有JSON


前端处理代码:
	$.each(data[data.length-2],function(i,item){
		// 文档类型
		if("FILE_TYPE"==i){
			//遍历分面里的排序json {0:{字段内容:计数},1:{字段内容:计数}...}
			$.each(item,function(_,result){
				//遍历具体分面json {字段内容:计数}
				$.each(result,function(facet_name,facet_count){
					$(".facet_table:eq(0)").append(		
						'<tr>'+
							'<td>'+
								'<span class="facet_name">'+facet_name+'</span>'+
								'<span class="facet_count"> ( '+facet_count+' ) </span>'+
							'</td>'+
						'</tr>'
					);
				})
			})	
		}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值