目前影響solr查詢返回結果默認是采用score進行排序的,如何影響文章靜態score權重值,主要有三種方案:
1. 通過solrConfig.xml進行指定配置
<requestHandler name="select" class="solr.SearchHandler" default="true"> <!– default values for query parameters can be specified, these will be overridden by parameters in the request–> <lst name="defaults"> <str name="echoParams">explicit</str> <int name="rows">10</int> <bool name="hl">true</bool> <str name="hl.fl">title,content</str> <str name="f.content.hl.fragsize">200</str> <str name="mlt.qf"> id^10.0 title^10.0 content^1.0 </str> </lst> </requestHandler>
2. 通過SolrJ在索引階段賦值靜態權重
對文檔某個字段指定相應的權重,其中attrName為屬性名稱,attr為具體的內容,5.0f為對應指定的權重值(默認為1分)
doc.setField(attrName, attr.trim(), 5.0f);
對整個文檔賦boost值
doc.setDocumentBoost(1.5f);
3. 通過SolrJ在搜索階段賦權重查詢
今天我講的是第二種方式,雖然第一種方式也可以實現權重指定,但是是寫死的不能進行動態化的調整,而且solrConfig.xml文件為solr最底層配置文件,如果已經大規模使用的話再想修改就不是那么簡單的事情了(嚴重導致集群發生STW即Stop The World),所以推薦第二種方式實現,索引數據這里就不多余介紹了,到這一步的話前面的應該都不是問題了,那么我直接上代碼來介紹如何通過代碼指定對應屬性的權重:
1 SolrQuery query = new SolrQuery("*:*"); 2 query.set("df", "title"); 3 query.set("defType","dismax"); 4 query.set("qf","title^1 price^0.1");//這里必須包含查詢條件title 5 query.set("bf", "sum(abs(price))"); 6 query.setParam("q.op", "AND"); 7 query.addSort("pubTime", ORDER.desc); 8 query.setStart(0); 9 query.setRows(10); 10 QueryResponse queryReponse; 11 try { 12 SolrInputDocument doc = new SolrInputDocument(); 13 queryReponse = solrServer.query(sq); 14 SolrDocumentList doclist=sr.getResults(); 15 //計數器 16 int i=0; 17 for (SolrDocument solrDocument : doclist) { 18 System.out.println("標題:"+solrDocument.get("title")+"\n\n"); 19 ++i; 20 } 21 System.out.println(i+"個"); 22 } catch (SolrServerException e) { 23 e.printStackTrace(); 24 }
以下是沒有權重排序的結果:
標題:一0
標題:一1
標題:一2
標題:一3
標題:一4
5個
以下是引入權重排序結果:
標題:一4
標題:一3
標題:一2
標題:一1
標題:一0
5個