DisMaxQParserPlugin提供在针对文本boost打分上,支持搜索多个schema索引字段,并针对每一个字段设置不同的boost权限。
pf查询 与 qf查询
pf: 可提供对一条记录的多个字段做匹配的功能
qf: 针对查询的每个字段设置不同的boost权重打分,其设置的字段必须为在pf中配置的项。
可在solrconfig.xml中的browse中配置做如下配置:
<requestHandler name="/browse" class="solr.SearchHandler">
<lst name="defaults">
<str name="defType">edismax</str>
<str name="pf"> name info title </str>
<str name="qf">
name^1 info^0.8 title^0.6
</str>
</lst>
</requestHandler>
上面一段的意思是,查询name,info,title三个字段,每个字段的文本相关度打分权重分别为1,0.8,0.6。计算查询出的每一条结果的权重方法如下:分别计算各字段的文本打分然后乘于配置的权重,最后三者相加即为该结果的boost得分。
bf查询
除去pf查询,qf查询之外,仍然希望索引记录的其它字段能够计入打分中,这时可以使用bf查询。bf查询支持一些数据函数,这些函数可作用在索引记录的字段上,多为时间,数值等字段。同样bf也支持添加权重。下面是一个使用bf查询配置的例子:
<requestHandler name="/browse" class="solr.SearchHandler">
<lst name="defaults">
<str name="defType">edismax</str>
<str name="bf">
sum(recip(ms(NOW,created_time),3.16e-11,1,1),sqrt(log(max(sales,1))),sqrt(log(count)))^10
</str>
<str name="pf">
name info title
</str>
<str name="qf">
name^1 info^0.8 title^0.6
</str>
</lst>
</requestHandler>
其中sum,recip,ms,sqrt,log,max这些都是Solr提供的数学方法,支持的所有数学方法可在这里查找到:http://wiki.apache.org/solr/FunctionQuery
edismax相关资源:http://wiki.apache.org/solr/DisMaxQParserPlugin
以下是在添加数据的时候对每个文档的Boost进行修改,来影响打分,默认值为1,也可以在update时进行添加。
List<SolrInputDocument> docList = newArrayList<SolrInputDocument>();
for(ShopDataModel shopDataModel : indexDataBeanList) {
SolrInputDocument doc = newSolrInputDocument();
doc.setDocumentBoost(shopDataModel.getCoojin_fee());//核心代码,shopDataModel.getCoojin_fee()为放大倍数,此处为float类型
docList.add(doc);
}
CommonsHttpSolrServer solr = getSolrWriteConnection();
solr.add(docList);
solr.commit();
此处不进行optimize操作,因为Solr中配置有自动合并。
使用自定义的requestHandel
寻找name属性跟请求中的qt参数匹配的handler
寻找在配置文件中“default=true”的handler
寻找在配置文件中name属性为“standad”的handler
qt – (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。