ES评分这一块主要依靠function_score
,它可以改变查询返回文档的分数。通常计算得分代价比较大,它可以对已经过滤的文档进行评分。function_score
中需要定义一个 query 以及一个或多个计算查询的得到文档得分的函数。只有一个计算得分函数的示例如下:
GET localhost:9200/index-name/_search?pretty
{
"query": {
"function_score": {
"query": {
"match_all": {
} },
"boost": "5",
// random_score 就是一种随机计算得分的函数
"random_score": {
},
"boost_mode":"multiply"
}
}
}
在function_score
中提供几种计算得分的函数:
script_score
:可以在内部包裹额外的query语句,可以选择使用文档中其他数字属性值来计算自定义评分;weight
:可以将得分和weight
字段值相乘,有时可能会希望这样做,因为对特定查询设置的提升值(即boost
设置的值)进行了归一化,而对于此得分函数却没有,数字值是float类型;random_score
:根据_uid
的hash值生成得分,并带有一个变化的seed
,如果不指定seed
的值,则使用当前时间戳;field_value_factor
:可以使用文档中的字段来人为影响得分,和script_score
函数相似,但它可以避免脚本开销。如果被用于一个多值字段,那只有该字段的第一个值会被用来计算,其他的值不会用于计算;- decay functions:衰减函数,可以随着文档距离给定值(数值类型,表示原点)的距离进行评分,需要指定参与评分的每个字段的
origin
(标识中心值)和scale
(衰减的速率)。
下面的是示例文档结构:
"_source": {
"id": 1724933159515744,
"propertyId": 1724930759808608,
"name": "测试文档"