最近要提供一個地點查找的API給IOS組調用,其主要需求是經過距離,星級和地標的星級三者排序,距離越短和星級越高的地點優先顯示java
關於距離排序能夠看這篇文章:http://blog.csdn.net/awj3584/article/details/11760757函數
要是實現方式仍是Solr wiki中提供的以下方法來實現的this
http://localhost:8983/solr/select?q={!boost b=recip(ms(NOW,manufacturedate_dt),3.16e-11,1,1)}ipod
或者spa
http://localhost:8983/solr/select?q={!boost b=$dateboost v=$qq}&dateboost=recip(ms(NOW,manufacturedate_dt),3.16e-11,1,1)&qq=ipod
根據個人需求可改爲:.net
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
此時會看到評分會改變。code
此需求的實現代碼以下:blog
[java] view plaincopy排序
public TownFileLocalSearchResult searchNearByTownfile(double lat, double lng, double distance, ip
long start, int rows, String type, String keyword, long parentId) throws APIException,APIRemoteException { ci
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;
}