ES 的 Function score 允许您修改查询检索到的文档的评分,特别对于评分函数计算量很大,而只需对筛选后的文档集计算评分即可,此功能非常有用。Script score 是 Function score 的一种,它支持使用脚本为返回的文档提供自定义评分。
使用 Script score 结合用户画像和点击行为评分
ES 的 script_score 查询是一项强大的高级功能,在文本搜索场景深受 ES 开发者喜爱,它允许您使用脚本来自定义文档的评分计算方式,可以结合文本相关性与业务指标来实现复杂的排序逻辑,例如您可以结合用户画像和点击行为数据来更好地优化排序,以实现更精准的搜索和推荐,这给我们的业务实现带来了很大的灵活性和实用性。
GET /_search{"query": {"function_score": {"query": {"match": { "message": "elasticsearch" }},"script_score": {"script": {"source": "Math.log(2 + doc['my-int'].value)"}}}}}
谨慎将 script_score 用于向量暴力搜索
但是当我们把 script_score 用于向量搜索时(参阅这里),它将执行暴力扫描(即使您在索引 mapping 中将索引类型设置为 hnsw),而不是您在索引设置中定义的近似 KNN 搜索,脚本会对范围内的每一个文档,读取其存储的 title_vector 字段值,并调用内置的向量函数(如 cosineSimilarity)与传入的查询向量参数进行计算,向量搜索性能会急剧下降,因此,除非在小数据集 (<10万) 或必须精确的场景,我们一般不建议将 script_score 用于向量搜索。
GET my-index/_search{"query": {"script_score": {"query" : {"bool" : {"filter" : {"term" : {"status" : "published"}}}},"script": {// 调用内置函数计算余弦相似度// title_vector 是文档中的向量// params.query_vector 是外部传入的查询向量// + 1.0 是为了保证得分为正数(余弦相似度范围是 -1 到 1)"source": "cosineSimilarity(params.query_vector, 'title_vector') + 1.0","params": {"query_vector": [4, 3.4, -0.2]}}}}}