可以在查询结束后,对每一个匹配的文档进行一系列的重新算分,根据新生成的分数进行排序。
    默认提供的分值计算函数:

    • Weight:为每一个文档设置一个简单而不被规范化的权重

      1. GET /_search
      2. {
      3. "query": {
      4. "function_score": {
      5. "query": { "match_all": {} },
      6. "boost": "5",
      7. "functions": [
      8. {
      9. "filter": { "match": { "test": "bar" } },
      10. "random_score": {},
      11. "weight": 23
      12. },
      13. {
      14. "filter": { "match": { "test": "cat" } },
      15. "weight": 42
      16. }
      17. ],
      18. "max_boost": 42,
      19. "score_mode": "max",
      20. // Multiply:算分与函数值的成乘积;sum:算分与函数的和;Min/Max:算分与函数值取最小/最大;replace:函数值取代算分
      21. "boost_mode": "multiply",
      22. "min_score": 42
      23. }
      24. }
      25. }
    • Field Value Factor:使用该数值来修改_score,也提供了很多modifier函数(log,log1p等),例如将“热度”和“点赞数”作为算分的参考因素

      1. 新的算分 = 老的算分 * log(1+factor * votes)
      2. GET /_search
      3. {
      4. "query": {
      5. "function_score": {
      6. "query": { "match_all": {} },
      7. "field_value_factor":{
      8. "field": "votes",
      9. "modifier": "log1p",
      10. "factor": 0.1
      11. }
      12. }
      13. }
      14. }
    • Random Score:为每一个用户使用一个不同的 随机算分结果

    使用场景:网站的广告需要提高展现率,让每个用户看到不同的随机排名

    1. POST blogs/_search
    2. {
    3. "query":{
    4. "function_score":{
    5. "random_score":{
    6. "seed": 9119
    7. }
    8. }
    9. }
    10. }
    • 衰减函数:以某个字段的值为标准,距离某个值越近,得分越高
    • scrip Score:自定义脚本完全控制所需逻辑