加载中

在搜索请求中定义运行时字段

您可以在搜索请求中指定一个 runtime_mappings 部分,以创建仅作为查询一部分存在的运行时字段。您可以像向映射添加运行时字段时那样,在 runtime_mappings 部分中指定脚本。

在搜索请求中定义运行时字段所使用的格式,与在索引映射中定义运行时字段的格式相同。将索引映射中 runtime 的字段定义复制到搜索请求的 runtime_mappings 部分即可。

以下搜索请求向 runtime_mappings 部分添加了一个 day_of_week 字段。字段值将动态计算,且仅在此搜索请求的上下文中有效。

				GET my-index-000001/_search
					{
  "runtime_mappings": {
    "day_of_week": {
      "type": "keyword",
      "script": {
        "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))"
      }
    }
  },
  "aggs": {
    "day_of_week": {
      "terms": {
        "field": "day_of_week"
      }
    }
  }
}
		

您甚至可以在搜索请求中定义返回其他运行时字段值的运行时字段。例如,假设您批量索引了一些传感器数据

				POST my-index-000001/_bulk?refresh=true
					{"index":{}}
{"@timestamp":1516729294000,"model_number":"QVKC92Q","measures":{"voltage":"5.2","start": "300","end":"8675309"}}
{"index":{}}
{"@timestamp":1516642894000,"model_number":"QVKC92Q","measures":{"voltage":"5.8","start": "300","end":"8675309"}}
{"index":{}}
{"@timestamp":1516556494000,"model_number":"QVKC92Q","measures":{"voltage":"5.1","start": "300","end":"8675309"}}
{"index":{}}
{"@timestamp":1516470094000,"model_number":"QVKC92Q","measures":{"voltage":"5.6","start": "300","end":"8675309"}}
{"index":{}}
{"@timestamp":1516383694000,"model_number":"HG537PU","measures":{"voltage":"4.2","start": "400","end":"8625309"}}
{"index":{}}
{"@timestamp":1516297294000,"model_number":"HG537PU","measures":{"voltage":"4.0","start": "400","end":"8625309"}}
		

索引完成后,您意识到您的数值数据被映射为了 text 类型。您想要对 measures.startmeasures.end 字段进行聚合,但聚合失败了,因为您无法对 text 类型的字段进行聚合。这时运行时字段就派上用场了!您可以添加与索引字段同名的运行时字段并修改数据类型

				PUT my-index-000001/_mapping
					{
  "runtime": {
    "measures.start": {
      "type": "long"
    },
    "measures.end": {
      "type": "long"
    }
  }
}
		

运行时字段的优先级高于索引映射中同名的字段。这种灵活性允许您覆盖现有字段并计算出不同的值,而无需修改字段本身。如果您在索引映射中犯了错误,可以使用运行时字段来计算在搜索请求期间覆盖映射中值的值。

现在,您可以轻松地对 measures.startmeasures.end 字段运行平均值聚合

				GET my-index-000001/_search
					{
  "aggs": {
    "avg_start": {
      "avg": {
        "field": "measures.start"
      }
    },
    "avg_end": {
      "avg": {
        "field": "measures.end"
      }
    }
  }
}
		

响应中包含了聚合结果,且不会更改底层数据的值

{
  "aggregations" : {
    "avg_start" : {
      "value" : 333.3333333333333
    },
    "avg_end" : {
      "value" : 8658642.333333334
    }
  }
}
		

此外,您可以定义一个作为搜索查询一部分的运行时字段来计算值,然后在同一查询中对该字段运行统计聚合

duration 运行时字段在索引映射中并不存在,但我们仍然可以对该字段进行搜索和聚合。以下查询返回 duration 字段的计算值,并运行统计聚合,以对从聚合文档中提取的数值进行统计计算。

				GET my-index-000001/_search
					{
  "runtime_mappings": {
    "duration": {
      "type": "long",
      "script": {
        "source": """
          emit(doc['measures.end'].value - doc['measures.start'].value);
          """
      }
    }
  },
  "aggs": {
    "duration_stats": {
      "stats": {
        "field": "duration"
      }
    }
  }
}
		

尽管 duration 运行时字段仅存在于搜索查询的上下文中,但您仍然可以对该字段进行搜索和聚合。这种灵活性非常强大,使您能够在单个搜索请求中纠正索引映射中的错误并动态完成计算。

{
  "aggregations" : {
    "duration_stats" : {
      "count" : 6,
      "min" : 8624909.0,
      "max" : 8675009.0,
      "avg" : 8658309.0,
      "sum" : 5.1949854E7
    }
  }
}
		
© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.