如何实现按字段和权重的自定义排序?

Elasticsearch | 作者 nodexy | 发布于2014年11月15日 | 阅读数:30104

需求:
按 两个文本字段 t1和t2 分词搜索,然后按搜索得分、一个数值型字段d1、 一个逻辑型字段 b1 来排序输出,权重如下:

score * 30%
d1 * 50%
b1 * 20%

方法:
1. 直接 addSort() 只能按多个字段排序,并且有优先级,无法设置权重;
2. 自定义 function score ? 如何处理 d1 的归一化问题? 如何处理 b1 的逻辑值问题?

**更新**:
d1 是一个从 0 到 几十亿的超大数字;
b1 目前想到按照 0/1 处理,或者 -1/1处理


总结:
主要方案有两种:
1. function score
2. script

原理都差不多,主要区别是后者要开script,而且可以先在es里写好脚本,查询时指定脚本名即可。

权重方面重点在于自己的设计,以及合理地按照业务需求使用归一化函数,实现没有问题。
已邀请:

Rubricate - hi

赞同来自: nodexy sherry medcl

{
"query": {
"function_score": {
"functions": [
{
"script_score": {
"params": {
"param1": 0.3,
"param2": 0.5,
"param3": 0.2
},
"script": "_score *param1+ doc['d1'].value * param2 + doc['b1'].value * param23"
}
}
],
"query": {
"match": {
"brief": "智能"
}
},
"score_mode": "first"
}
}
}

解释:
_score 就是es对doc的打分,d1和bi需要是数值类型。param1,2,3可以不用赋值的形式,直接写在script里面也可以。

官方文档在这里:

4onni - 老鹰不需要鼓掌,也会继续飞翔

赞同来自:

使用script排序

medcl - 今晚打老虎。

赞同来自:

官方现在建议使用function_score了,

@Rubricate 介绍下function_score

要回复问题请先登录注册