赞
踩
在项目上遇到一个需求,需要随机展示从 elasticsearch 中获取的查询结果,这时候想到可以通过 es 的自定义排序,来实现这个需求。自定义排序其实就是调整 es 的评分机制,达到结果的权重不同,最终实现随机查询的目的。
我们通过使用 function_score
来实现不同的评分机制。官网介绍
function_score
查询常见有下面几种
script_score
script 脚本评分weight
字段权重评分random_score
随机评分field_value_factor
字段值因子评分gauss, linear, exp
(没用过)script_score
这里的查询的分数默认是乘以脚本评分的结果。 如果你想禁止这个,设置 "boost_mode": "replace"
GET index/_search
{
"query": {
"function_score": {
"query": {
"match": { "field": "value" }
},
"script_score" : {
"script" : {
"source": "Math.log(2 + doc['likes'].value)"
}
}
}
}
}
weight
weight
函数就是将分数乘上特定的值
下面的例子在 name
字段中匹配了 aa
的文档,他们的分数将被乘以2
,当 type
匹配到 bb
的时候乘以 3
GET index/_search { "query": { "function_score": { "query": { "match": { "field": "value" } }, "functions":[ { "weight":2 , "filter": { "term": { "name": "aa" }} }, { "weight":3 , "filter": { "term": { "type": "bb" }} } ] } } }
random_score
(没怎么用过)random_score
生成从 0
到但不包括 1
的均匀分布的分数。
GET index/_search
{
"query": {
"function_score": {
"random_score": {
"seed": 10,
"field": "_seq_no"
}
}
}
}
field_value_factor
field_value_factor
函数允许您使用文档中的字段来影响分数。 它类似于使用 script_score
函数,但是,它避免了脚本的开销。 如果用于多值字段,则在计算中仅使用该字段的第一个值。
GET index/_search
{
"query": {
"function_score": {
"field_value_factor": {
"field": "likes", // 要从文档中提取的字段。
"factor": 1.2, // 与字段值相乘的可选因子,默认为 1。
"modifier": "sqrt", // 应用于字段值的计算修饰符, none, log, log1p, log2p, ln, ln1p, ln2p, square, sqrt, or reciprocal,默认 none.
"missing": 1 // 如果文档没有该字段,则使用的值。 修饰符和因子仍然适用于它,就好像它是从文档中读取的一样。
}
}
}
}
得分计算公式: sqrt(1.2 * doc['likes'].value)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。