美文网首页
算分与排序

算分与排序

作者: 滴流乱转的小胖子 | 来源:发表于2020-08-07 06:26 被阅读0次

⽆法针对相关度,对排序实现更多的控制

  • Elasticsearch 默认会以⽂档的相关度算分进⾏排序
  • 可以通过指定⼀个或者多个字段进⾏排序
  • 使⽤相关度算分(score)排序,不能满⾜某些特定条件

一、Function Score Query

  • 可以在查询结束后,对每⼀个匹配的⽂档进⾏⼀系列的重新算分,根据新⽣成的分数进⾏排序。

提供了⼏种默认的计算分值的函数

  • Weight :为每⼀个⽂档设置⼀个简单⽽不被规范化的权重
  • Field Value Factor:使⽤该数值来修改 _score,例如将 “热度”和“点赞数”作为算分的参考因素
  • Random Score:为每⼀个⽤户使⽤⼀个不同的,随机算分结果
  • 衰减函数: 以某个字段的值为标准,距离某个值越近,得分越⾼
  • Script Score:⾃定义脚本完全控制所需逻辑

二、接受欢迎度提升权重 --- Field Value Factor 来举例

  • 希望能够将点赞多的 blog,放在搜索列表相对靠前的位置。同时搜索的评分,还是要作为排序的主要依据

算分逻辑

新的算分 = 老的算分 * 投票数

DELETE blogs
PUT /blogs/_doc/1
{
  "title":   "About popularity",
  "content": "In this post we will talk about...",
  "votes":   0
}

PUT /blogs/_doc/2
{
  "title":   "About popularity",
  "content": "In this post we will talk about...",
  "votes":   100
}

PUT /blogs/_doc/3
{
  "title":   "About popularity",
  "content": "In this post we will talk about...",
  "votes":   1000000
}


POST /blogs/_search
{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query":    "popularity",
          "fields": [ "title", "content" ]
        }
      },
      "field_value_factor": {
        "field": "votes"
      }
    }
  }
}

极端情况:

投票数 为 0
投票数很大时
算分的结果曲线,波动很大 --- 使用Modifier平滑曲线

POST /blogs/_search
{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query":    "popularity",
          "fields": [ "title", "content" ]
        }
      },
      "field_value_factor": {
        "field": "votes",
        "modifier": "log1p"
      }
    }
  }
}

算分逻辑
新的算分 = 老的算分 * log(1 + 投票数)


image.png

三、引入Factor

算分逻辑
新的算分 = 老的算分 * log(1 + factor * 投票数)


image.png
image.png

四、Boost Mode 和 Max Boost

Boost Mode

  • Multiply:算分与函数值的乘积 (默认模式)
  • Sum:算分与函数的和
  • Min / Max:算分与函数取 最⼩ / 最⼤值
  • Replace:使⽤函数值取代算分

Max Boost 可以将算分控制在⼀个最⼤值

POST /blogs/_search
{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query":    "popularity",
          "fields": [ "title", "content" ]
        }
      },
      "field_value_factor": {
        "field": "votes",
        "modifier": "log1p" ,
        "factor": 0.1
      },
      "boost_mode": "sum",
      "max_boost": 3
    }
  }
}

五、一致性随机函数 --- 不以实际存在的字段进行排序,而已用随机数,随机数相同,排序结果相同

使用场景:网站的广告需要提高展现率
具体需求:让每个用户看到不同的随机排名,但是也希望用一个用户访问时,结果的相对顺序,保持一致
(consistently random)

POST /blogs/_search
{
  "query": {
    "function_score": {
      "random_score": {
        "seed": 911119
      }
    }
  }
}

https://www.elastic.co/guide/en/elasticsearch/reference/7.1/query-dsl-function-score-query.html

相关文章

  • 算分与排序

    ⽆法针对相关度,对排序实现更多的控制 Elasticsearch 默认会以⽂档的相关度算分进⾏排序 可以通过指定⼀...

  • 4.10-综合排序:Function Score Query 优

    算分与排序 Elasticsearch 默认会以⽂档的相关度算分进⾏排序 可以通过指定⼀个或者多个字段进⾏排序 使...

  • 【elasticsearch】20、function score

    综合排序:function score query优化算分 算分和排序 elasticsearch默认会议文档的相...

  • 归并排序

    归并排序的时间复杂度是O(nlogn),优与选择排序以及冒泡排序,采用的思想就是分治思想,先分,将要排序的数组一分...

  • 八种基本排序算法的使用

    最经典最常用的排序算法有:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序和桶排序。这些排序算...

  • 排序算法

    常见的排序算法有: 冒泡排序 快速排序 插入排序 归并排序 堆排序 1. 冒泡排序 冒泡排序是一种极其简单的排序算...

  • 算法

    iOS冒泡排序、插入排序、选择排序、快速排序、二分查找用数组实现栈和队列专题:菲波那切数列与递归

  • PHP常用算法

    基于选择的排序算法 常见的基于选择的排序算法有:冒泡排序、插入排序、选择排序、归并排序和快速排序,我们在选在排序算...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 算法-冒泡排序

    算 法:冒泡排序算法时间复杂度: 冒泡排序算法概述 冒泡排序伪代码 冒泡排序实现 冒泡排序算法概述 冒泡排...

网友评论

      本文标题:算分与排序

      本文链接:https://www.haomeiwen.com/subject/hkibrktx.html