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

如何在Painless脚本中访问Elasticsearch映射的子字段name.x/y/z?

Elasticsearch Painless脚本访问字段子字段问题

问题描述

假设存在如下Elasticsearch映射:

"mappings": {
  "dynamic_templates": [],
  "properties": {
    "name": {
      "type": "text",
      "fields": {
        "x": {
          "type": "completion"
        },
        "y": {
          "type": "keyword"
        },
        "z": {
          "type": "text",
          "analyzer": "shingles",
          "fielddata": true
        }
      }
    }
  }
}

请问如何在Painless脚本中访问name.x/name.y/name.z的数据或词元?尝试了以下写法均无法生效:

ctx._source.name.x
ctx._source['name.fields.x']
ctx._source['name.x']

解决方法

你试的这些写法没用,核心原因是:fields是Elasticsearch在索引阶段给原始字段生成的衍生索引字段,这些字段的处理结果不会存在_source里——_source只存你最初写入的原始name值。

针对不同子字段,正确的访问方式如下:

  • 访问keyword类型的name.y字段值:
    直接用doc对象访问索引中存储的字段值,写法:

    doc['name.y'].value
    // 如果是多值字段,就用doc['name.y'].values
    
  • 访问带shingle分析器的name.z字段词元:
    因为name.z开了fielddata,可以通过doc对象拿到分词后的词元集合:

    doc['name.z'].values
    

    返回的是经过shingle分析器处理后的词元数组。

  • 访问completion类型的name.x字段:
    completion字段的原始输入默认和name的原始值一致(除非你单独指定了输入内容),所以直接取ctx._source.name就行。如果是自定义了completion的输入,那得在写入文档时把输入值单独存在_source的某个字段里——因为completion字段的索引数据没法直接在脚本里访问。

另外要注意:doc对象只能在查询、更新这类脚本场景用;如果是在 ingest pipeline 的脚本里,只能操作ctx._source,这时候拿不到衍生字段的内容,因为文档还没被索引,衍生字段还没生成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:21:01