Lucene 8.x中怎么利用FunctionScoreQuery 自定义文档评分

发布时间:2021-08-06 15:21:45 作者:Leah
来源:亿速云 阅读:255

这期内容当中小编将会给大家带来有关Lucene 8.x中怎么利用FunctionScoreQuery 自定义文档评分,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

0. 需要引用的类
import org.apache.lucene.expressions.Expression;
import org.apache.lucene.expressions.SimpleBindings;
import org.apache.lucene.expressions.js.JavascriptCompiler;
import org.apache.lucene.queries.function.FunctionScoreQuery;
import org.apache.lucene.queryparser.classic.ParseException;
1. 首先定义一个变量表:
SimpleBindings bindings = new SimpleBindings();
bindings.add("$score", DoubleValuesSource.SCORES);
bindings.add("$recomm", DoubleValuesSource.fromIntField("recomm"));
bindings.add("$viewcount", DoubleValuesSource.fromIntField("viewcount"));
bindings.add("$wordcount", DoubleValuesSource.fromIntField("wordcount"));
2. 定义一个自定义排序的表达式:
String sort_method= "mysort($score,$recomm,$viewcount,$wordcount)";

HashMap<String, Method> scoreMethods = new HashMap();
scoreMethods.put("mysort", getClass().getDeclaredMethod("mysort", double.class, double.class, double.class, double.class));
            
Expression expr = JavascriptCompiler.compile(sort_method, scoreMethods, getClassLoader());

注意这里的 scoreMethods 用来存放所有自定义函数对应的 Java 方法,如下所示:

3. 定义一个 mysort 方法,接受 double 参数,返回 double 参数
public double mysort(double score, double recomm, double viewcount, double wordcount) {
    if(score >= 40) {
        if(recomm > 0)
            score += 100;
        if(viewcount >= 1000)
            score += 100;
        if(wordcount >= 200)
            score += 20;
    }
    return score;
}
4. 接下来你就可以使用 FunctionScoreQuery 
FunctionScoreQuery query = new FunctionScoreQuery(oldQuery, expr.getDoubleValuesSource(bindings));

这里的 oldQuery 就是你原先用来做全文搜索的 Query 实例。

你可以试试打印一下 query 看看,我这边一个真实打印的结果如下:

FunctionScoreQuery(+type:[2 TO 2] +fork:[0 TO 0] +(((+name:j2cache)^20.0 (+description:j2cache)^10.0 (+detail:j2cache)^1.0 (+tags:j2cache)^10.0 (+catalogs:j2cache)^10.0 (+owner.name:j2cache)^2.0)~1), scored by expr(repo_sort($score,$recomm,$stars,$gindex)))

上述就是小编为大家分享的Lucene 8.x中怎么利用FunctionScoreQuery 自定义文档评分了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. Lucene如何实现索引和查询
  2. Lucene实现多种高级搜索形式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

lucene

上一篇:Sentinel中怎么利用令牌桶实现预热

下一篇:如何解决某些HTML字符打不出来的问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》