一.3种常见方式
- doc['fieldname']: 常用于在搜索或排序等无状态操作时进行使用
- params['_source']['fieldname']:也是常用在搜索或排序中,但更多用在获取额外字段时灵活操作时使用,如不获取某个字段直接使用params['_source']获取整个_source对象;
- ctx._source:一般用于状态化操作(会已知整个文档并进行操作时),比如在进行_update_by_query或者updae等修改删除操作时,大部分都能且只能使用ctx._source。 在我看来它更像是已知结果,并对结果进行缓冲区留存而后对其进行操作,而非上述两位预设程序,并进行获取的感觉(个人拙见)
二.doc['fieldname']与params['_source']['fieldname']对比
一般在进行查询时并需要对字段进行额外获取值,并利用值进行无状态化操作时,更推荐使用此方式;
例如在script_fields中,可以同时使用doc['fieldname']及params['_source']['fieldname']的方式。
但需要注意的是:
1.通过doc['fieldname']获取字段,将会加载该字段的相关术语及字段值本身;
2.通过params['_source']['fieldname']获取字段会获取到整个_source的json对象并从中获取字段,相比第1种,此种方式会相对较慢;但如果你想对整个_source的json对象进行操作,那当我没说;尽情使用params['_source']吧
举例常用script_field及script_sort
GET test_index/_search
{
"script_fields": {
"my_doubled_field": {
"script": {
"source": "doc['my_field'].value * params['multiplier']",
"params":{
"multiplier": 2
}
}
}
}
}
GET test_index/_search
{
"query": {
"match_all": {}
},
"sort": [ {
"_script": {
"type": "number",
"order": "desc",
"script": {
"lang": "painless",
"source": "doc['public_time'].value"
}
}
}
]
}
{
"query": {
"match_all": {}
},
"sort": [ {
"_script": {
"type": "number",
"order": "desc",
"script": {
"lang": "painless",
"source": "params['_source']['public_time']"
}
}
}
]
}
简单结论:修改删除ctx._source,查询排序doc['fieldname']