当前位置:8288分类目录 » 站长资讯 » 编程 » 文章详细

脚本评分 | Elasticsearch: 权威指南 | Elastic

来源:网络转载 浏览:35263次 时间:2023-11-04
请注意:
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。 Elasticsearch: 权威指南 » 深入搜索 » 控制相关度 » 脚本评分 «  理解 price 价格语句     可插拔的相似度算法  »

脚本评分编辑

最后,如果所有 function_score 内置的函数都无法满足应用场景,可以使用 script_score 函数自行实现逻辑。

举个例子,想将利润空间作为因子加入到相关度评分计算,在业务中,利润空间和以下三点相关:

  • price 度假屋每晚的价格。
  • 会员用户的级别——某些等级的用户可以在每晚房价高于某个 threshold 阀值价格的时候享受折扣 discount
  • 用户享受折扣后,经过议价的每晚房价的利润 margin

计算每个度假屋利润的算法如下:

if (price < threshold) {
  profit = price * margin
} else {
  profit = price * (1 - discount) * margin;
}

我们很可能不想用绝对利润作为评分,这会弱化其他如地点、受欢迎度和特性等因子的作用,而是将利润用目标利润 target 的百分比来表示,高于 目标的利润空间会有一个正向评分(大于 1.0 ),低于目标的利润空间会有一个负向分数(小于 1.0 ):

if (price < threshold) {
  profit = price * margin
} else {
  profit = price * (1 - discount) * margin
}
return profit / target

Elasticsearch 里使用 Groovy 作为默认的脚本语言,它与JavaScript很像, 上面这个算法用 Groovy 脚本表示如下:

price  = doc['price'].value 
margin = doc['margin'].value 

if (price < threshold) { 
  return price * margin / target
}
return price * (1 - discount) * margin / target 

pricemargin 变量可以分别从文档的 pricemargin 字段提取。

thresholddiscounttarget 是作为参数 params 传入的。

最终我们将 script_score 函数与其他函数一起使用:

GET /_search
{
  "function_score": {
    "functions": [
      { ...location clause... }, 
      { ...price clause... }, 
      {
        "script_score": {
          "params": { 
            "threshold": 80,
            "discount": 0.1,
            "target": 10
          },
          "script": "price  = doc['price'].value; margin = doc['margin'].value;
          if (price < threshold) { return price * margin / target };
          return price * (1 - discount) * margin / target;" 
        }
      }
    ]
  }
}

locationprice 语句在 衰减函数 中解释过。

将这些变量作为参数 params 传递,我们可以查询时动态改变脚本无须重新编译。

JSON 不能接受内嵌的换行符,脚本中的换行符可以用 \n; 符号替代。

这个查询根据用户对地点和价格的需求,返回用户最满意的文档,同时也考虑到我们对于盈利的要求。

script_score 函数提供了巨大的灵活性, 可以通过脚本访问文档里的所有字段、当前评分 _score 甚至词频、逆向文档频率和字段长度规范值这样的信息(参见 see 脚本对文本评分)。

有人说使用脚本对性能会有影响,如果确实发现脚本执行较慢,可以有以下三种选择:

  • 尽可能多的提前计算各种信息并将结果存入每个文档中。
  • Groovy 很快,但没 Java 快。 可以将脚本用原生的 Java 脚本重新实现。(参见 原生 Java 脚本)。
  • 仅对那些最佳评分的文档应用脚本,使用 重新评分 中提到的 rescore 功能。
«  理解 price 价格语句     可插拔的相似度算法  »

Getting Started Videos

  • Starting Elasticsearch
  • Introduction to Kibana
  • Logstash Starter Guide

官方地址:https://www.elastic.co/guide/cn/elasticsearch/guide/current/script-score.html



8288分类目录声明:本站部分文章来源于网络,版权属于原作者所有。如有转载或引用文章/图片涉及版权问题,请联系我们处理.我们将在第一时间删除! 联系邮箱:tsk@qq.com

推荐网站

最新加入网站 TOP5

入站排行榜 TOP5