ElasticSearch自定义评分
一、适用的场景
1.基本介绍
ES的使用中,ES会对我们匹配文档进行相关度评分。但对于一些定制化的场景,默认评分规则满足不了我们的要求。这些定制化场景,ES也是推出了自定义评分方式来进行支持。可以使用ES提供的一些函数,什么可以使用比较分来让我们的评分规则多样化?我举个大家都很熟悉的场景,在点外卖时候,大家是不是有一个综合排序,比如用户希望通过距离和价格来进行综合排序,这在mysql中是不是比较难以实现,接下来我将由简到繁的来教你如何在ES中实现这种综合评分排序的功能。
2.使用场景
2.1根据价格评分排序
在mysql中我们可以通过价格从高到低,从低到高排序,但是像订酒店那样,用户有期望价格的,酒店越符合用户的期望价格,评分越高。mysql的排序这时候是不是有点捉襟见肘了。废话不多说了,直接来ES实现。
{
"from": 0,
"size": 12,
"query": {
"function_score": {
"query": {
"bool": {
"must": [
{
"term": {
"price": {
"value": 50,
"boost": 1.0
}
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
},
"functions": [
{
"filter": {
"match_all": {
"boost": 1.0
}
},
"gauss": {
"price": {
"origin": 50,
"offset": 0,
"scale": "25",
"decay": 0.5
}
}
}
]
}
},
"sort": [
{
"_score": {
"order": "desc"
}
}
]
}
2.2根据距离评分排序
在我们日常使用的场景,我们经常有需要根据距离来进行排序评分,常见的App中都是有一个距离更近,来筛选商户。接下来就来看看ES的实现。
{
"from": 0,
"size": 12,
"query": {
"function_score": {
"query": {
"bool": {
"must": [
{
"term": {
"price": {
&