Elastic:查询时字段runtime fields不显示,如何处理?

简介: 很多时候runtime field是结合一起使用的,这时没有任何问题,因为这类需要一般将聚合结果显示出来就行了。但是当我们需要将runtime fields也查询出来时发现查询结果中是不会显示它们的,下面我们通过具体的案例来解决这个问题

0 引言

很多时候runtime field是结合一起使用的,这时没有任何问题,因为这类需要一般将聚合结果显示出来就行了。但是当我们需要将runtime fields也查询出来时发现查询结果中是不会显示它们的,下面我们通过具体的案例来解决这个问题

1 案例

数据

POST test_index3/_bulk
{"index":{}}
{"name":"zhangsan","height":1.78,"weight":44.5}
{"index":{}}
{"name":"lisi","height":1.85,"weight":66}
{"index":{}}
{"name":"wangwu","height":1.82,"weight":84}

要求以runtime field输出bmi字段,且bmi = height / weight,并且要求创建查询模版,输入三个参数name,from,size,最后查出zhangsan的bmi

1.1 案例解决

1、创建查询模版

PUT _scripts/my_search_template
{ 
  "script": {
    "lang": "mustache",
    "source": {
      "runtime_mappings":{
        "bmi": {
          "type": "double",
          "script": {
            "source": """ 
              emit(doc['weight'].value / doc['height'].value);
            """
          }
        }
      },
      "query": {
        "match": {
          "name": "{{name}}"
        }
      },
      "from": "{{from}}",
      "size": "{{size}}"
    }
  }
}

2、调用

GET test_index3/_search/template
{
  "id": "my_search_template",
  "params": {
    "name": "zhangsan",
    "from": 0,
    "size": 10
  }
}

3、查询结果
会发现结果中并没有输出bmi字段

"hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0296195,
    "hits" : [
      {
        "_index" : "test_index3",
        "_type" : "_doc",
        "_id" : "s9IQi30BQVVXVhDNlkxS",
        "_score" : 1.0296195,
        "_source" : {
          "name" : "zhangsan",
          "height" : 1.78,
          "weight" : 44.5
        }
      },
      {
        "_index" : "test_index3",
        "_type" : "_doc",
        "_id" : "hRA0kH0BR7MN8fqkCacz",
        "_score" : 1.0296195,
        "_source" : {
          "name" : "zhangsan",
          "height" : 1.78,
          "weight" : 44.5
        }
      }
    ]
  }

2 原因

这是因为_source中默认是不会显示runtime fields的,所以在查询结果中无法看到bmi,那么有什么方法能让运行时字段显示呢?解决方案就是通过fields属性来设置

3 解决方案

fields属性会对所有的fields起作用,可以通过fields:["xxx","yyy"]的形式来指定需要显示的字段,也可以通过fields:["*"]的形式指定显示所有字段
那么针对上述问题的查询模版就变成了:

    这里要注意fields添加的位置,是在script的source中
PUT _scripts/my_search_template
{ 
  "script": {
    "lang": "mustache",
    "source": {
      "fields": [
        "*"
      ],
      "runtime_mappings":{
        "bmi": {
          "type": "double",
          "script": {
            "source": """ 
              emit(doc['weight'].value / doc['height'].value);
            """
          }
        }
      },
      "query": {
        "match": {
          "name": "{{name}}"
        }
      },
      "from": "{{from}}",
      "size": "{{size}}"
    }
  }
}

再次调用查询模版

GET test_index3/_search/template
{
  "id": "my_search_template",
  "params": {
    "name": "zhangsan",
    "from": 0,
    "size": 10
  }
}

查询结果:在结果的最后,发现bmi字段显示出来了

"hits" : [
      {
        "_index" : "test_index3",
        "_type" : "_doc",
        "_id" : "s9IQi30BQVVXVhDNlkxS",
        "_score" : 1.0296195,
        "_source" : {
          "name" : "zhangsan",
          "height" : 1.78,
          "weight" : 44.5
        },
        "fields" : {
          "name" : [
            "zhangsan"
          ],
          "weight" : [
            44.5
          ],
          "name.keyword" : [
            "zhangsan"
          ],
          "height" : [
            1.78
          ],
          "bmi" : [
            25.000000401829073
          ]
        }
      },
      {
        "_index" : "test_index3",
        "_type" : "_doc",
        "_id" : "hRA0kH0BR7MN8fqkCacz",
        "_score" : 1.0296195,
        "_source" : {
          "name" : "zhangsan",
          "height" : 1.78,
          "weight" : 44.5
        },
        "fields" : {
          "name" : [
            "zhangsan"
          ],
          "weight" : [
            44.5
          ],
          "name.keyword" : [
            "zhangsan"
          ],
          "height" : [
            1.78
          ],
          "bmi" : [
            25.000000401829073
          ]
        }
      }
    ]
  }

3.2 template fields

这里要注意一点,在查询模版中,也有一个fields:["*"]属性,如下所示,这个属性是无法达到显示运行时字段的作用的,反而会想不符合条件的字段都查询出来

GET test_index3/_search/template
{
  "id": "my_search_template",
  "template": {
    "fields": [
      "*"
    ]
  },
  "params": {
    "name": "zhangsan",
    "from": 0,
    "size": 10
  }
}

3.3 非查询模版如何显示runtime fields

1、修改mapping,创建runtime fields

PUT test_index3/_mapping
{
  "runtime": {
    "bmi": {
      "type": "double",
      "script": {
        "source": "emit(doc['weight'].value / doc['height'].value)",
        "lang": "painless"
      }
    }
  }
} 

2、查询时添加fields:["*"]

GET test_index3/_search
{
  "fields": [
    "*"
  ],
  "query": {
    "match": {
      "name.keyword": "zhangsan"
    }
  }
}
目录
相关文章
|
4月前
|
存储 传感器 SQL
influxdb 中得 fields 与 tag 区别总结
influxdb 中得 fields 与 tag 区别总结
390 1
|
5月前
|
分布式计算 大数据 数据处理
MaxCompute操作报错合集之出现无法在 information_schema.TASKS_HISTORY 表中查询到特定类型的 DI 上线任务记录,该怎么办
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
6月前
|
Oracle 关系型数据库 数据库
Flink Sink to Oracle 存在字段CLOB类型,如何处理错误”ORA-01461: 仅能绑定要插入LONG的LONG值“
做Flink CDC同步数据过程中,目标是Oracle数据库,其中某个字段较大被设置为CLOB类型,其中会遇到异常,”ORA-01461: 仅能绑定要插入LONG的LONG值“
|
6月前
|
SQL 关系型数据库 MySQL
SQL编程【MySQL 01】拆分列字段为行并根据类型翻译字段 > 1305 - FUNCTION x.help_topic_id does not exist 报错问题
SQL编程【MySQL 01】拆分列字段为行并根据类型翻译字段 > 1305 - FUNCTION x.help_topic_id does not exist 报错问题
84 0
|
自然语言处理 算法 数据挖掘
白话Elasticsearch51-深入聚合数据分析之text field聚合以及fielddata原理
白话Elasticsearch51-深入聚合数据分析之text field聚合以及fielddata原理
120 0
|
存储 小程序 数据挖掘
不必Reindex,利用runtime_fields优雅地解决字段类型错误问题
不必Reindex,利用runtime_fields优雅地解决字段类型错误问题
不必Reindex,利用runtime_fields优雅地解决字段类型错误问题
|
JSON 安全 Go
Go 中使用 JSON 时,如何区分空字段和未设置字段
Go 中使用 JSON 时,如何区分空字段和未设置字段
604 0
|
Web App开发 存储 数据可视化
【Elastic Engineering】Elasticsearch:使用 Runtime fields 对索引字段进行覆盖处理以修复错误 - 7.11 发布
Elasticsearch:使用 Runtime fields 对索引字段进行覆盖处理以修复错误 - 7.11 发布
175 0
【Elastic Engineering】Elasticsearch:使用 Runtime fields 对索引字段进行覆盖处理以修复错误 - 7.11 发布
|
JSON 缓存 关系型数据库
Elasticsearch Query DSL概述与查询、过滤上下文
Elasticsearch Query DSL概述与查询、过滤上下文
|
数据采集 存储 API
Elasticsearch 运行时类型 Runtime fields 深入详解
1、实战问题 实战业务中,遇到数据导入后,但发现缺少部分必要字段,一般怎么解决? 比如:emotion 代表情感值,取值范围为:0-1000。 其中:300-700 代表中性;0-300 代表负面;700-1000 代表正面。 但实际业务中,我们需要:中性:0;负面:-1;正面:1。 如何实现呢?
620 0
Elasticsearch 运行时类型 Runtime fields 深入详解