弹性搜索创建一个动态字段作为响应

Elastic search create a dynamic field in response

我正在做一个 Elasticsearch 项目。我想在查询索引时获得一个额外的列作为响应。举例来说,如果我有一个包含两列 num1num2 的索引,当查询该索引时,它应该以两列(num1 num2)响应,但也附加列 add_result (实际上是两列的加法)。如果我像下面这样正常查询它,它只会用两列进行响应

{
  query:{
    match_all : {}
  }
}

在我的用例中,我尝试过:

{
  "runtime_mappings": {
    "add_result": {
      "type": "double",
      "script": "emit(doc['file_count'].value + doc['follower_count'].value)"
    }
  },
  "query": {
    "match_all": {}
  }
}

是的,有两种方法:

1。使用 runtime field

此功能自 Elasticsearch 7.12 起可用。只需使用如下请求正文向 _search 端点发出 GET 请求:

{
  "runtime_mappings": {
    "add_result": {
      "type": "double",
      "script": "emit(doc['num1'].value + doc['num2'].value)"
    }
  },
  "fields": ["add_result", "num*"],
  "query": {
    "match_all": {}
  }
}

您需要在 fields 参数中明确指定要恢复运行时字段。

2。使用 script_field

请求如下所示:

{
  "query": {
    "match_all": {}
  },
  "fields": ["num*"],
  "script_fields": {
    "add_result": {
      "script": {
        "lang": "painless",
        "source": "doc['num1'].value + doc['num2'].value"
      }
    }
  }
}

请注意,您仍然需要 fields 参数,但您不需要在 fields参数。