Elasticsearch 8:如何在排序脚本中获取词项位置
在Elasticsearch 8中获取词在字段中的位置并实现靠前排序
Elasticsearch 8已移除旧版本中的_index上下文变量,因此你之前的脚本会报错。要实现查询词在title字段中出现位置越靠前、文档排序越优先的需求,可通过读取字段的term vector获取词的位置信息,具体实现如下:
修改后的完整查询
{ "query": { "simple_query_string": { "query": "banana" } }, "track_scores": true, "sort": { "_script": { "type": "number", "order": "desc", "script": { "source": """ def termVector = doc['title'].getTermVector(); if (termVector != null && termVector.containsKey('banana')) { def positions = termVector['banana'].positions; if (positions != null && !positions.isEmpty()) { def firstPos = positions[0].position; // 用固定值减去位置,位置越靠前(数值越小),返回值越大 return 1000 - firstPos; } } // 未匹配到目标词时返回最低优先级数值 return 0; """, "lang": "painless" } } } }
关键说明
- 你的索引已正确设置
title字段的term_vector: "with_positions",这是读取位置信息的前提,无需修改索引配置。 - 脚本逻辑:
- 通过
doc['title'].getTermVector()获取字段的term vector对象,其中包含每个词的位置信息。 - 检查目标词
banana是否存在于term vector中。 - 取出该词的所有出现位置,取第一个位置(数组首个元素即为最靠前的出现位置,位置从0开始计数)。
- 返回
1000 - firstPos,确保位置越靠前的文档排序值越大,实现降序排序需求。也可使用1.0 / (firstPos + 1)避免负数,效果一致。
- 通过
内容的提问来源于stack exchange,提问作者Skacc
相关产品推荐
相关产品推荐

