概述
Solr提供ValueSourceParser来实现自定义评分函数,在自定义评分函数中封装评分逻辑,然后根据自定义评分函数计算的值进行排序。
准备数据
将数据导入solr
原始查询
q=sdes:共和国
fq=spopulation:[ 500000000 TO * ]
fl=*,score
排序默认使用score得分排序,可发现巴西的评分(0.15021087)比中国评分(0.1201687)高,那么可以利用自定义评分函数的值,来实现重新排序
自定义评分逻辑
//默认得分都是1.0分
float boot = 1.0f;
//如果sarea不存在或者为小,则减去0.2分
if (StringUtils.isBlank(sarea) || "小".equals(sarea)) {
boot -= 0.2f;
}
//如果sname存在中,则增加0.2分
if (sname.contains("中")) {
boot += 0.2f;
}
//如果spopulation大于500000000,则增加0.5分
if (spopulation > 500000000) {
boot += 0.5f;
}
根据新的评分逻辑计算,巴西的评分(1.0),中国的评分(1.7)
编写代码
public class MyValueSourceParser extends ValueSourceParser {
private final Logger log = LoggerFactory.getLogger(MyValueSourceParser.class);
public MyValueSourceParser() {
super();
}
@Override
public ValueSource parse(FunctionQParser fp) throws SyntaxError {
/**
* 按顺序取2个参数
*/
String arg1 = fp.parseArg(); //取到第一个参数
String arg2 = fp.parseArg(); //取到第二个参数
log.info("MyFilterQParserPlugin arg1=" + arg1);
log.info("MyFilterQParserPlugin arg2=" + arg2);
/**
* 获取LocalParams
*/
SolrParams solrParams = fp.getLocalParams();
if (null != solrParams) {
Iterator<String> it = solrParams.getParameterNamesIterator();
while (it.hasNext()) {
final String name = it.next();
final String[] values = solrParams.getParams(name);
for (String v : values) {
log.info("LocalParams name:" + v);