Elasticsearch Service 特别:灵活使用 Script Score,并谨慎用于向量暴力检索

ES 的 Function score 允许你修改查询检索到的文档的评分,特别对于评分函数计算量很大,而只需对筛选后的文档集计算评分即可,此功能非常有用。Script score 是 Function score 的一种,它支持使用脚本为返回的文档提供自定义评分。

相关产品
Elasticsearch Service 产品页,含版本规格、价格与购买入口。

一、使用 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] } } } }}

赞 (0)
上一篇 4天前
下一篇 4天前