Solr評分修改

最近要提供一個地點查找的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在CODE上查看代碼片派生到個人代碼片排序

  1. public TownFileLocalSearchResult searchNearByTownfile(double lat, double lng, double distance,   ip

  2.             long start, int rows, String type, String keyword, long parentId) throws APIException,APIRemoteException {  ci

  3.   

  4.         TownFileLocalSearchResult result = new TownFileLocalSearchResult();  

  5.         SolrServer solrServer = this.getSolrServer();  

  6.         Map<String,String> params = new HashMap<String,String>();     

  7.         params.put("fq""{!geofilt}");//距離過濾函數    

  8.         params.put("pt", getLatLng(lat, lng));//當前經緯度    

  9.         params.put("sfield""latlng");//經緯度的字段    

  10.         params.put("d", String.valueOf(distance));//就近多少千米的全部用戶   

  11.         params.put("start", String.valueOf(start));//記錄開始位置    

  12.         params.put("rows", String.valueOf(rows));//查詢的行數      

  13.         params.put("fl""*,score");  

  14.         params.put("q""{!boost b=$dateboost v=$key}");  

  15.         if(StringUtils.isEmpty(keyword)){  

  16.             params.put("key""*:*");  

  17.         }else{  

  18.             params.put("key""*"+keyword+"*");  

  19.         }  

  20.         if(type.equals("landmark")){  

  21.             params.put("key", (params.get("q").equals("*:*") ? "" : params.get("key")+SOLR_AND)+"landmarkRank:[1 TO 9]");  

  22.             params.put("dateboost""sum(div(landmarkRank,10),recip(geodist(),1,10,10))");  

  23.         }else{  

  24.             if(type.equals("periphery")){  

  25.                 params.put("key", (params.get("q").equals("*:*") ? "" : params.get("key")+SOLR_AND)+"-landmarkRank:[1 TO 9]");  

  26.                 params.put("dateboost""sum(div(star,10),recip(geodist(),1,10,10))");  

  27.             }else{  

  28.                 params.put("dateboost""sum(div(landmarkRank,10),div(star,10),recip(geodist(),1,10,10))");  

  29.             }  

  30.             if(parentId != 0){  

  31.                 params.put("key", (params.get("key").equals("*:*") ? "" : params.get("key")+SOLR_AND)+"parentId:"+parentId);  

  32.             }  

  33.             //params.put("sort", "geodist() asc");//根據距離排序  

  34.         }  

  35.         params.put("sort""score desc");  

  36.         QueryResponse queryResponse = null;  

  37.         try {  

  38.             System.out.println(new MapSolrParams(params).toString());  

  39.             queryResponse = solrServer.query(new MapSolrParams(params), METHOD.POST);  

  40.         } catch (SolrServerException e) {  

  41.             logger.error("---------------Get QueryResponse SolrServerException:\t" + e.getMessage(), e);  

  42.         }  

  43.         if (null != queryResponse) {  

  44.             result.setTownFileLocalRecords(queryResponse.getBeans(TownFileLocalRecord.class));  

  45.             int count = Integer.valueOf(String.valueOf(queryResponse.getResults().getNumFound()));  

  46.             result.setTotalCount(count);  

  47.         }  

  48.         return result;  

  49.     } 

相關文章
相關標籤/搜索