如何在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
相关产品推荐
相关产品推荐

