目前影响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个