Spring Data Elasticsearch中ScriptScoreQuery必填属性缺失问题求助
问题:Spring Data Elasticsearch中function_score查询报错MissingRequiredPropertyException
问题背景
使用Spring Boot 3.1.5和Spring Data Elasticsearch 5.1.5开发Java项目,想要实现包含script_score的function_score查询(通过余弦相似度计算评分),但编写的NativeQuery代码抛出co.elastic.clients.util.MissingRequiredPropertyException异常,提示缺失必填属性ScriptScoreQuery.query。
原ES查询语句
GET vector_search/_search { "query": { "function_score": { "functions": [ { "script_score": { "script": { "source": "Math.max(0,cosineSimilarity(params.queryVector,'text_VEC'))", "params": { "queryVector": [0.1,0.1,0.1~~~~~~] } } } } ] } } }
错误的Java代码
Query searchQuery = NativeQuery.builder() .withQuery(q -> q.scriptScore(m -> m.script(fn -> fn.inline(InlineScript.of(fn2 -> fn2.source("Math.max(0,cosineSimilarity(params.queryVector,'text_VEC'))"))))) .withQuery(q -> q.scriptScore(m -> m.script(fn -> fn.inline(InlineScript.of(fn2 -> fn2.params(params))))) .withMaxResults(5) .build();
异常信息
co.elastic.clients.util.MissingRequiredPropertyException: Missing required property 'ScriptScoreQuery.query' at co.elastic.clients.util.ApiTypeHelper.requireNonNull(ApiTypeHelper.java:76) at co.elastic.clients.elasticsearch._types.query_dsl.ScriptScoreQuery.(ScriptScoreQuery.java:63) at co.elastic.clients.elasticsearch._types.query_dsl.ScriptScoreQuery.(ScriptScoreQuery.java:49) at co.elastic.clients.elasticsearch._types.query_dsl.ScriptScoreQuery$Builder.build(ScriptScoreQuery.java:184) at co.elastic.clients.elasticsearch._types.query_dsl.ScriptScoreQuery$Builder.build(ScriptScoreQuery.java:124) at co.elastic.clients.elasticsearch._types.query_dsl.Query$Builder.scriptScore(Query.java:1601)
错误原因
- 层级混淆:直接调用
q.scriptScore()是把script_score作为顶层查询,但实际需求是function_score的functions列表中包含script_score,二者结构完全不同。 - 重复覆盖+缺少必填属性:两次调用
withQuery()会覆盖前一次的配置,且script_score作为独立查询时必须指定query属性(即基础查询条件),但你的逻辑里不需要单独的script_score查询,而是要在function_score下使用它。
修正后的代码
import org.springframework.data.elasticsearch.client.elc.NativeQuery; import org.springframework.data.elasticsearch.core.query.Query; import java.util.HashMap; import java.util.Map; // 构造向量参数 Map<String, Object> params = new HashMap<>(); params.put("queryVector", new double[]{0.1, 0.1, 0.1}); // 替换为你的实际向量值 Query searchQuery = NativeQuery.builder() // 构建function_score查询,对应原ES的结构 .withQuery(queryBuilder -> queryBuilder.functionScore(functionScoreBuilder -> functionScoreBuilder // 原ES查询无基础过滤条件,用match_all匹配所有文档 .query(q -> q.matchAll(matchAllBuilder -> matchAllBuilder)) // 添加script_score到functions列表 .functions(functionsBuilder -> functionsBuilder.scriptScore(scriptScoreBuilder -> scriptScoreBuilder .script(scriptBuilder -> scriptBuilder.inline(inlineScriptBuilder -> inlineScriptBuilder .source("Math.max(0, cosineSimilarity(params.queryVector, 'text_VEC'))") .params(params) )) )) )) .withMaxResults(5) .build();
修正说明
- 用
functionScore()包裹整个查询逻辑,完全对应原ES的function_score结构 - 为
function_score指定match_all作为基础查询(因为原ES查询没有设置过滤条件,匹配所有文档后再计算余弦相似度评分) - 将
script_score放入functions列表中,符合原ES的层级要求 - 合并了script的source和params配置,避免重复调用
withQuery导致配置覆盖
内容的提问来源于stack exchange,提问作者Luis han
相关产品推荐
相关产品推荐

