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

如何在ElasticSearch模板中传入动态double列表作为参数值?

问题解决:Elasticsearch Mustache模板参数化double数组及后续错误修复

一、可以参数化double数组,关键处理方式

要避免数组被转成字符串列表,需要使用Elasticsearch提供的toJson helper,它能保留数组的原始数值类型,而非默认的字符串插值。同时需修正模板的结构定义,这也是解决后续"Required [script]"错误的核心。

二、完整修复步骤

1. 重新创建正确的Mustache模板

原模板的错误在于将source定义为JSON对象,Elasticsearch要求Mustache模板的source必须是字符串形式的JSON。修改后的模板如下:

PUT _scripts/my_template
{
  "script": {
    "lang": "mustache",
    "source": "{
      \"query\": {
        \"script_score\": {
          \"query\": {
            \"match_all\": {}
          },
          \"script\": {
            \"source\": \"knn_score\",
            \"lang\": \"knn\",
            \"params\": {
              \"field\": \"{{field}}\",
              \"query_value\": {{#toJson}}query_value{{/toJson}},
              \"space_type\": \"{{space_type}}\"
            }
          }
        }
      }
    }"
  }
}
  • 注意事项:
    • 整个查询结构包裹在字符串中,内部双引号需转义为\"
    • query_value使用{{#toJson}}query_value{{/toJson}}替代原有的{{query_value}},且去掉外层双引号,确保渲染后输出数值数组而非字符串化数组

2. 验证模板渲染结果

执行渲染请求,确认数组类型正确:

GET _render/template
{
  "id": "my_template",
  "params": {
    "field": "embeddings_field",
    "query_value": [0.1, 0.2],
    "space_type": "cosinesimil"
  }
}

正确渲染后的结果中,query_value会保留数值数组格式:"query_value": [0.1, 0.2]

3. 执行搜索模板

此时再执行搜索请求,即可正常运行:

GET my_index/_search/template
{
  "id": "my_template",
  "params": {
    "field": "embeddings",
    "query_value": [
      -0.03159378841519356,
      0.0715613141655922
    ],
    "space_type": "cosinesimil"
  }
}

三、错误原因说明

  • 数组类型错误:默认的{{query_value}}会将数组序列化为字符串(如"[0.1,0.2]"),导致Elasticsearch解析为字符串列表而非数值数组,toJson helper可保留原始JSON结构与类型。
  • "Required [script]"错误:原模板将source定义为JSON对象,不符合Elasticsearch Mustache模板的要求,导致渲染后的请求结构异常,触发缺少script参数的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:15:28