elasticsearch 7.0 新特性之Script Score query

首先这个特性处于实验阶段,在之后发布的release版本中可能会被移除,Elastic官方会尽最大努力去修复可能出现的各种问题,因为不受GA保护,所以前期大家尽量不要在生产环境中使用

1、介绍

script_score 是 function score 2.0版本, 允许用户在检索中灵活修改文档score,来实现自己干预结果排名的目的,另外script score性能要高于function score
下面我们通过一个简单的例子来加深理解,通过script score将文档score值修改为“like”字段值的十分之一:

GET /_search
{
    "query" : {
        "script_score" : {
            "query" : {
                "match": { "message": "elasticsearch" }
            },
            "script" : {
                "source" : "doc['likes'].value / 10 "
            }
        }
     }
}

2、操作

  • 在script 中访问当前文档_score值
    用户可以在script中访问变量_score ,还是上面的例子,我们给当前score加上“like”值:

{
    "query" : {
        "script_score" : {
            "query" : {
                "match": { "message": "elasticsearch" }
            },
            "script" : {
                "source" : "doc['likes'].value + _score "
            }
        }
     }
}
  • Vector查询支持
    这类查询目前有cosineSimilarity 和 dotProduct两类函数支持,只能应用在dense_vecotor 和 sparse_vector数据类型上。
    例如,通过cosineSimilarity函数计算query文档与索引库里文档的dense_vector相似度:

{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "cosineSimilarity(params.queryVector, doc['my_dense_vector'])",
        "params": {
          "queryVector": [4, 3.4, -0.2]  
        }
      }
    }
  }
}

如果是计算sparse_vector field的cosine相似度:

{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "cosineSimilaritySparse(params.queryVector, doc['my_sparse_vector'])",
        "params": {
          "queryVector": {"2": 0.5, "10" : 111.3, "50": -1.3, "113": 14.8, "4545": 156.0}
        }
      }
    }
  }
}

再如,在dense_vector field上计算给定文档与索引库文档点积的距离时:

{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "dotProduct(params.queryVector, doc['my_dense_vector'])",
        "params": {
          "queryVector": [4, 3.4, -0.2]
        }
      }
    }
  }
}

同理,在sparse_vector上进行点积计算,需要使用dotProductSparse 函数:

{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "dotProductSparse(params.queryVector, doc['my_sparse_vector'])",
        "params": {
          "queryVector": {"2": 0.5, "10" : 111.3, "50": -1.3, "113": 14.8, "4545": 156.0}
        }
      }
    }
  }
}

上述vector查询需要注意的时,如果vector field缺失数值时,或者查询语句中vector规格与索引库字段的vector规格不一致,那么该文档的计算结果会是0

  • 调用自定义Painless script
    用户可以灵活的使用Painless语法编写自己的Function ,并在script中进行调用,另外值得注意的是,本身es提供了大量的预定义Function可供调用,这些都是经过优化的,执行效率比较高。

sigmoid(value, k, a) = value^a/ (k^a + value^a)  

"script" : {
    "source" : "sigmoid(doc['likes'].value, 2, 1)"
}
  • 对数字类型字段添加衰减函数
    常用到的衰减函数有decayNumericLinear(线性),decayNumericExp(指数),decayNumericGauss(高斯)

"script" : {
    "source" : "decayNumericLinear(params.origin, params.scale, params.offset, params.decay, doc['dval'].value)",
    "params": { 
        "origin": 20,
        "scale": 10,
        "decay" : 0.5,
        "offset" : 0
    }
}
  • 对geo类型字段添加衰减函数
    常用到的衰减函数有decayGeoLinear(线性),decayGeoExp(指数),decayGeoGauss(高斯)

"script" : {
    "source" : "decayGeoExp(params.origin, params.scale, params.offset, params.decay, doc['location'].value)",
    "params": {
        "origin": "40, -70.12",
        "scale": "200km",
        "offset": "0km",
        "decay" : 0.2
    }
}
  • 对日期类型字段添加衰减函数
    常用到的衰减函数有decayDateLinear(线性),decayDateExp(指数),decayDateGauss(高斯),不支持 mow 函数。

"script" : {
    "source" : "decayDateGauss(params.origin, params.scale, params.offset, params.decay, doc['date'].value)",
    "params": {
        "origin": "2008-01-01T01:00:00Z",
        "scale": "1h",
        "offset" : "0",
        "decay" : 0.5
    }
}

需要注意的是上述几个衰减函数中都用到了params参数,而该参数官方说明是不支持动态改变数值的,个人觉得不是很好用,后期应该还会优化

  • Function Score 转 Script Score

script_score:function score中的script_score 函数部分不需要进行修改,可以直接拷贝到script score里运行。

weight:

"script" : {
    "source" : "params.weight * _score",
    "params": {
        "weight": 2
    }
}

random_score:

"script" : {
    "source" : "randomNotReproducible()"
}

field_value_factor:


"script" : {
    "source" : "Math.log10((doc['field'].size() == 0 ? 1 : doc['field'].value()) * params.factor)",
    params" : {
        "factor" : 5
    }
}

其中 Math.log10((doc['field'].size() == 0 是为了排除因field missing引起的异常,field_value_factor 里modifier(权重调控函数)可以通过下面函数实现:

名称实现
none-
logMath.log10(doc['f'].value)
log1pMath.log10(doc['f'].value + 1)
log2pMath.log10(doc['f'].value + 2)
lnMath.log(doc['f'].value)
ln1pMath.log(doc['f'].value + 1)
ln2pMath.log(doc['f'].value + 2)
squareMath.pow(doc['f'].value, 2)
sqrtMath.sqrt(doc['f'].value)
reciprocal1.0 / doc['f'].value

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要安装Elasticsearch 7.0,可以按照以下步骤进行操作: 1. 首先,下载Elasticsearch 7.0的安装包。你可以从官方网站上下载安装包,链接为。 2. 下载完成后,解压安装包。你可以使用以下命令在Linux系统中解压安装包: ``` tar -zxvf elasticsearch-7.0.0-linux-x86_64.tar.gz ``` 3. 解压完成后,将解压得到的文件夹移动到你想要安装Elasticsearch的目录。你可以使用以下命令将解压得到的文件夹移动到指定目录: ``` mv elasticsearch-7.0.0 /path/to/installation/directory ``` 4. 接下来,启动Elasticsearch。你可以使用以下命令来启动Elasticsearch,并在后台执行: ``` /path/to/installation/directory/bin/elasticsearch -d ``` 通过按照上述步骤,你可以成功安装和启动Elasticsearch 7.0版本。请确保按照你自己的实际情况替换命令中的路径。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ElasticSearch7.0.0安装以及配置](https://blog.csdn.net/weixin_43400608/article/details/105636725)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Elasticsearch7.0.0安装](https://blog.csdn.net/qq_24271463/article/details/89414701)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值