首页 > 解决方案 > 查询到 elasticsearch v6.0.1 时,将新字段添加到 _source 对象中的无痛脚本

问题描述

我有一个带有一个属性(id:整数)的字段映射的索引。当我查询该索引时,我能够得到正确的响应。现在,我想在查询时使用无痛脚本在 _source 对象中添加一个额外的字段。elasticsearch 版本为 6.0.1。

我已经尝试在查询块中添加脚本作为字段。但它会抛出一个错误:

{
  "error": {
    "root_cause": [
      {
        "type": "parsing_exception",
        "reason": "[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
        "line": 7,
        "col": 7
      }
    ],
    "type": "parsing_exception",
    "reason": "[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
    "line": 7,
    "col": 7
  },
  "status": 400
}
GET 20190719_candidate/candidate/_search
{
    "min_score": 0.001,
    "query": {
      "term": {
        "id": 1234
      }, 
      "script": {
        "script": {
          "inline": "doc['field_1'] = 'field_1_value'"
        }
      }
    }, 
    "from": 0,
    "size": 20
}

_source 对象的预期结果是:

{
  "id": "1234567",
  "field_1": "field_1_value"
}

标签: elasticsearch

解决方案


您缺少结构:

GET 20190719_candidate/candidate/_search
{
    "min_score": 0.001,
    "query": {
      "term": {
        "id": 1234
      }, 
      "script_fields": {
           "test1":{
                 "script": {
                      "lang": "painless",                       
                      "source": "'field_1_value'"
                 }
            }
      }
    }, 
    "from": 0,
    "size": 20
}

看看这个例子:

GET /_search
{
    "query" : {
        "match_all": {}
    },
    "script_fields" : {
        "test1" : {
            "script" : {
                "lang": "painless",
                "source": "doc['price'].value * 2"
            }
        },
        "test2" : {
            "script" : {
                "lang": "painless",
                "source": "doc['price'].value * params.factor",
                "params" : {
                    "factor"  : 2.0
                }
            }
        }
    }
}

来源:https ://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html#request-body-search-script-fields


推荐阅读