You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

修正说明

  1. 用functionScore()包裹整个查询逻辑,完全对应原ES的function_score结构
  2. 为function_score指定match_all作为基础查询(因为原ES查询没有设置过滤条件,匹配所有文档后再计算余弦相似度评分)
  3. 将script_score放入functions列表中,符合原ES的层级要求
  4. 合并了script的source和params配置,避免重复调用withQuery导致配置覆盖

内容的提问来源于stack exchange,提问作者Luis han

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:16:23