Solr评分修改

最近要提供一个地点查找的API给IOS组调用,其主要需求是通过距离,星级和地标的星级三者排序,距离越短和星级越高的地点优先显示

关于距离排序可以看这篇文章:http://blog.csdn.net/awj3584/article/details/11760757

要是实现方式还是Solr wiki中提供的如下方法来实现的


http://localhost:8983/solr/select?q={!boost b=recip(ms(NOW,manufacturedate_dt),3.16e-11,1,1)}ipod
或者

http://localhost:8983/solr/select?q={!boost b=$dateboost v=$qq}&dateboost=recip(ms(NOW,manufacturedate_dt),3.16e-11,1,1)&qq=ipod

根据我的需求可改成:


http://localhost:8983/solr/select?q={!boost b=$dateboost v=$qq}&dateboost=sum(div(landmarkRank,10),div(star,10),recip(geodist(),1,10,10))&qq=ipod&fl=*,score


此时会看到评分会改变。

此需求的实现代码如下:

public TownFileLocalSearchResult searchNearByTownfile(double lat, double lng, double distance, 
			long start, int rows, String type, String keyword, long parentId) throws APIException,APIRemoteException {

		TownFileLocalSearchResult result = new TownFileLocalSearchResult();
		SolrServer solrServer = this.getSolrServer();
		Map<String,String> params = new HashMap<String,String>();   
		params.put("fq", "{!geofilt}");//距离过滤函数  
		params.put("pt", getLatLng(lat, lng));//当前经纬度  
		params.put("sfield", "latlng");//经纬度的字段  
		params.put("d", String.valueOf(distance));//就近多少公里的所有用户 
		params.put("start", String.valueOf(start));//记录开始位置  
		params.put("rows", String.valueOf(rows));//查询的行数	
		params.put("fl", "*,score");
		params.put("q", "{!boost b=$dateboost v=$key}");
		if(StringUtils.isEmpty(keyword)){
			params.put("key", "*:*");
		}else{
			params.put("key", "*"+keyword+"*");
		}
		if(type.equals("landmark")){
			params.put("key", (params.get("q").equals("*:*") ? "" : params.get("key")+SOLR_AND)+"landmarkRank:[1 TO 9]");
			params.put("dateboost", "sum(div(landmarkRank,10),recip(geodist(),1,10,10))");
		}else{
			if(type.equals("periphery")){
				params.put("key", (params.get("q").equals("*:*") ? "" : params.get("key")+SOLR_AND)+"-landmarkRank:[1 TO 9]");
				params.put("dateboost", "sum(div(star,10),recip(geodist(),1,10,10))");
			}else{
				params.put("dateboost", "sum(div(landmarkRank,10),div(star,10),recip(geodist(),1,10,10))");
			}
			if(parentId != 0){
				params.put("key", (params.get("key").equals("*:*") ? "" : params.get("key")+SOLR_AND)+"parentId:"+parentId);
			}
			//params.put("sort", "geodist() asc");//根据距离排序
		}
		params.put("sort", "score desc");
		QueryResponse queryResponse = null;
		try {
			System.out.println(new MapSolrParams(params).toString());
			queryResponse = solrServer.query(new MapSolrParams(params), METHOD.POST);
		} catch (SolrServerException e) {
			logger.error("---------------Get QueryResponse SolrServerException:\t" + e.getMessage(), e);
		}
		if (null != queryResponse) {
			result.setTownFileLocalRecords(queryResponse.getBeans(TownFileLocalRecord.class));
			int count = Integer.valueOf(String.valueOf(queryResponse.getResults().getNumFound()));
			result.setTotalCount(count);
		}
		return result;
	}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值